日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解python中文編碼問題

瀏覽:152日期:2022-06-16 10:41:41
目錄 1.在Python中使用中文1.1 Windows控制臺1.2 Windows IDLE(在Shell上運行)1.3 在IDLE上運行代碼 1.4 Windows Eclipse1.5 從文件讀取中文1.6 在數據庫中使用中文1.7 在XML中使用中文 1.在Python中使用中文

在Python中有兩種默認的字符串:str和unicode。在Python中一定要注意區分“Unicode字符串”和“unicode對象”的區別。后面所有的“unicode字符串”指的都是python里的“unicode對象”。

事實上在Python中并沒有“Unicode字符串”這樣的東西,只有“unicode”對象。一個傳統意義上的unicode字符串完全可以用str對象表示。只是這時候它僅僅是一個字節流,除非解碼為unicode對象,沒有任何實際的意義。

我們用“哈哈”在多個平臺上測試,其中“哈”對應的不同編碼是:

1. UNICODE (UTF8-16), C854;

2. UTF-8, E59388;

3. GBK, B9FE。

1.1 Windows控制臺

下面是在windows控制臺的運行結果:

詳解python中文編碼問題

可以看出在控制臺,中文字符的編碼是GBK而不是UTF-16。將字符串s(GBK編碼)使用decode進行解碼后,可以得到同等的unicode對象。

注意:可以在控制臺打印ss并不代表它可以直接被序列化,比如:

詳解python中文編碼問題

向文件直接輸出ss會拋出同樣的異常。在處理unicode中文字符串的時候,必須首先對它調用encode函數,轉換成其它編碼輸出。這一點對各個環境都一樣。

總結:在Python中,“str”對象就是一個字節數組,至于里面的內容是不是一個合法的字符串,以及這個字符串采用什么編碼(gbk, utf-8, unicode)都不重要。這些內容需要用戶自己記錄和判斷。這些的限制也同樣適用于“unicode”對象。要記住“unicode”對象中的內容可絕對不一定就是合法的unicode字符串,我們很快就會看到這種情況。

總結:在windows的控制臺上,支持gbk編碼的str對象和unicode編碼的unicode對象。

1.2 Windows IDLE(在Shell上運行)

在windows下的IDLE中,運行效果和windows控制臺不完全一致:

詳解python中文編碼問題

可以看出,對于不使用“u”作標識的字符串,IDLE把其中的中文字符進行GBK編碼。但是對于使用“u”的unicode字符串,IDLE居然一樣是用了GBK編碼,不同的是,這時候每一個字符都是unicode(對象)字符?。〈藭rlen(ss) = 4。

這樣產生了一個神奇的問題,現在的ss無法在IDLE中正常顯示。而且我也沒有辦法把ss轉換成正常的編碼!比如采用下面的方法:

詳解python中文編碼問題

這有可能是因為IDLE本地化做得不夠好,對中文的支持有問題。建議在IDLE的SHELL中,不要使用u“中文”這種方式,因為這樣得到的并不是你想要的東西。

這同時說明IDLE的Shell支持兩種格式的中文字符串:GBK編碼的“str”對象,和UNICODE編碼的unicode對象。

1.3 在IDLE上運行代碼

在IDLE的SHELL上運行文件,得到的又是不同的結果。文件的內容是:

詳解python中文編碼問題

直接運行的結果是:

詳解python中文編碼問題

毫無瑕疵,相當令人滿意。我沒有試過其它編碼的文件是否能正常運行,但想來應該是不錯的。

同樣的代碼在windows的控制臺試演過,也沒有任何問題。

1.4 Windows Eclipse

在Eclipse中處理中文更加困難,因為在Eclipse中,編寫代碼和運行代碼屬于不同的窗口,而且他們可以有不同的默認編碼。對于如下代碼:

#!/usr/bin/python# -*- coding: utf-8 -*- s = '哈哈'ss = u’哈哈’ print repr(s)print repr(ss) print s.decode(’utf-8’).encode(’gbk’)print ss.encode(’gbk’) print s.decode(’utf-8’)print ss

前四個print運行正常,最后兩個print都會拋出異常:’/xe5/x93/x88/xe5/x93/x88’u’/u54c8/u54c8’哈哈哈哈Traceback (most recent call last): File 'E:/Workspace/Eclipse/TestPython/Test/test_encoding_2.py', line 13, in <module> print s.decode(’utf-8’)UnicodeEncodeError: ’ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)

也就是說,GBK編碼的str對象可以正常打印,但是不能打印UNICODE編碼的unicode對象。在源文件上點擊“Run as”“Run”,然后在彈出對話框中選擇“Common”:

詳解python中文編碼問題

可以看出Eclipse控制臺的缺省編碼方式是GBK;所以不支持UNICODE也在情理之中。如果把文件中的coding修改成GBK,則可以直接打印GBK編碼的str對象,比如s。

如果把源文件的編碼設置成“UTF-8”,把控制臺的編碼也設置成“UTF-8”,按道理說打印的時候應該沒有問題。但是實驗表明,在打印UTF-8編碼的str對象時,中文的最后一個字符會顯示成亂碼,無法正常閱讀。不過我已經很滿足了,至少人家沒有拋異常不是:)

BTW: 使用的Eclipse版本是3.2.1。

1.5 從文件讀取中文

在window下面用記事本編輯文件的時候,如果保存為UNICODE或UTF-8,分別會在文件的開頭加上兩個字節 “/xFF/xFE” 和三個字節“/xEF/xBB/xBF”。在讀取的時候就可能會遇到問題,但是不同的環境對這幾個多于字符的處理也不一樣。

以windows下的控制臺為例,用記事本保存三個不同版本的“哈哈”。

詳解python中文編碼問題

打開utf-8格式的文件并讀取utf-8字符串后,解碼變成unicode對象。但是會把附加的三個字符同樣進行轉換,變成一個unicode字符,字符的數據值為“/xFF/xFE”。這個字符不能被打印。編碼的時候需要跳過這個字符。

詳解python中文編碼問題

打開unicode格式的文件后,得到的字符串正確。這時候適用utf-16解碼,能得到正確的unicdoe對象,可以直接使用。多余的那個填充字符在進行轉換時會被過濾掉。

詳解python中文編碼問題

打開ansi格式的文件后,沒有填充字符,可以直接使用。結論:讀寫使用python生成的文件沒有任何問題,但是在處理由notepad生成的文本文件時,如果該文件可能是非ansi編碼,需要考慮如何處理填充字符。

1.6 在數據庫中使用中文

剛剛接觸Python,我用的數據庫是mysql。在執行插入、查找等操作時,如果運行環境使用的字符編碼和mysql不一致,就可能導致運行時的錯誤。當然,和上面看到的情況一樣,運行環境并不是關鍵因素,關鍵是查詢語句的編碼方式。如果在每次執行查詢操作時都把查詢字符串做一次編碼轉換,轉變成mysql的默認字符編碼,一樣不會遇到問題。但是這樣寫代碼也太痛苦了吧。

使用如下代碼連接數據庫:

self.conn = MySQLdb.connect(use_unicode = 1, charset=’utf8’, **server)

我不能理解的是既然數據庫用的默認編碼是UTF-8,我連接的時候也用的是UTF-8,為什么查詢得到的文本內容卻是UNICODE編碼(unicode對象)?這是MySQLdb庫的設置么?

1.7 在XML中使用中文

使用xml.dom.minidom和MySQLdb類似,對生成的dom對象調用toxml方法得到的是unicode對象。如果希望輸出utf-8文本,有兩種方法:

1.使用系統函數在輸出xml文檔的時候進行編碼,這是我覺得最好的方法。

xmldoc.toxml(encoding=’utf-8’)xmldoc.writexml(outfile, encoding = ‘utf-8’)

2.自己編碼生成

在使用toxml之后可以調用encode方法對文檔進行編碼。但這種方法無法得到合適的xml declaration(xml文檔第一行中的encoding部分)。不要嘗試通過xmldoc.createProcessingInstruction來創建一個processing instraction:

<?xml version=’1.0’ encoding=’utf-8’?>

xml declaration雖然看起來像是,但是事實上并不是一個processing instraction??梢酝ㄏ旅娴姆椒ǖ玫揭粋€滿意的xml文件:

print >> outfile, “<?xml version=’1.0’ encoding=’utf-8’?>”print >> outfile, xmldoc.toxml().encode(‘utf-8’)[22:]

其中第二行需要過濾掉在調用xmldoc.toxml時生成的“<?xml version=’1.0’ ?>”,它的長度是22。

相面是兩種方法的用法比較:

詳解python中文編碼問題

另外,在IDLE的shell中,不要用 u’中文’ 對屬性進行賦值。上面討論過,這樣得到的unicode字符串不正確。

到此這篇關于python中文編碼問題的文章就介紹到這了,更多相關中文編碼內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
不卡在线一区二区| 日韩理论片av| 久久久777| 麻豆国产91在线播放| 日韩精品1区2区3区| 美女久久一区| 国产日韩专区| 久久精品123| 午夜精品成人av| 激情综合婷婷| 国产96在线亚洲| 精品国产美女a久久9999| 国产精品v亚洲精品v日韩精品| 国产美女精品视频免费播放软件| 欧美日本三区| 国产欧美高清| 久久精品国产网站| 精品国产乱码| 92国产精品| 日本少妇一区| 久久高清免费| 首页国产欧美久久| 国产精品婷婷| 亚州av日韩av| 国产精品黄色片| 免费在线观看一区| 中文在线а√在线8| а√天堂8资源在线| 香蕉久久99| 黄色日韩在线| 亚洲天堂日韩在线| 久久精品99国产精品| 国产精品www.| 黄色在线网站噜噜噜| 欧美成人久久| 免费在线视频一区| 欧美影院精品| 免费精品一区| 日韩欧美一区二区三区在线视频| 日韩欧美国产精品综合嫩v| 久久久久久久久久久妇女| 国精品一区二区| 亚洲欧美日韩国产| 日本色综合中文字幕| 久久97视频| 激情欧美一区| 亚洲人成高清| 国产女人18毛片水真多18精品| 国内揄拍国内精品久久| 在线天堂中文资源最新版| 好吊视频一区二区三区四区| 四虎在线精品| 老司机免费视频一区二区三区| 久久精品影视| 日韩精品一区二区三区中文字幕| 国产在线一区不卡| 9久re热视频在线精品| 国产日韩欧美一区二区三区在线观看| 国产a久久精品一区二区三区| 香蕉久久99| 日韩av中文字幕一区二区三区| 国产一区二区色噜噜| 亚洲精品电影| 久久不见久久见国语| 日韩精品一区二区三区免费观看| 石原莉奈在线亚洲三区| 久久国产乱子精品免费女| 国产在线不卡一区二区三区| 欧美另类综合| 国产午夜一区| 国内激情久久| 91午夜精品| 成人自拍av| 日韩精品三区四区| 亚洲精品成人图区| 日日摸夜夜添夜夜添国产精品| 麻豆国产91在线播放| 午夜欧美视频| 国产精品香蕉| 亚洲高清影视| 国产精品15p| 一区在线视频观看| 国产精品久久乐| 免费不卡中文字幕在线| 久久激情五月婷婷| 91久久国产| 精品三级av在线导航| 亚洲欧美网站| 国产 日韩 欧美 综合 一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产一区二区三区黄网站| 石原莉奈在线亚洲二区| 国产一区不卡| 日韩专区视频网站| 激情综合网站| 国产剧情一区| 亚洲欧美日本国产| 正在播放日韩精品| 国产精品亚洲产品| 免费一级片91| 日韩精品欧美激情一区二区| 久久精品国产久精国产| 日韩国产欧美在线视频| 亚洲主播在线| 啪啪国产精品| 国产一区二区三区91| 国产日韩欧美中文在线| 视频一区视频二区在线观看| 激情丁香综合| 日韩大片免费观看| 国产一区二区久久久久| 国产精品久久久久77777丨| 日韩成人a**站| 亚洲69av| 蜜桃视频一区二区| 不卡av一区二区| 99成人在线视频| 国产传媒在线观看| 激情不卡一区二区三区视频在线| 97久久亚洲| 青青草国产精品亚洲专区无| 亚洲最大av| 亚洲精品美女91| 久久xxxx| 视频一区中文字幕国产| 另类国产ts人妖高潮视频| 99久久亚洲精品| 亚洲黄色中文字幕| 福利一区二区| 国产在线观看91一区二区三区| 国产精品羞羞答答在线观看| 日韩国产成人精品| 亚洲另类黄色| 亚洲综合小说| 免费高清在线一区| 亚洲精品字幕| 日韩 欧美一区二区三区| 日韩精品久久久久久| 亚洲资源在线| 视频精品一区二区| 日本va欧美va精品| 欧美视频久久| 美女在线视频一区| 久久99青青| 国产精品99一区二区三| 神马久久午夜| 欧美日韩免费观看视频| 999国产精品视频| 午夜电影亚洲| 日韩精品一卡二卡三卡四卡无卡| 免播放器亚洲一区| 日韩**一区毛片| 麻豆精品在线| 极品av在线| 天堂资源在线亚洲| 国产精品免费看| 免费美女久久99| 亚洲少妇自拍| 亚洲欧美在线专区| 国产日韩免费| 久久免费福利| 欧美日韩视频免费观看| 免费观看不卡av| 蜜桃久久久久久| 日韩成人精品一区二区三区 | 日本三级亚洲精品| 久久av资源| 理论片午夜视频在线观看| 欧美一级精品| 一区二区三区网站| 国产精品欧美大片| 精品久久97| 久久久水蜜桃av免费网站| 99热精品在线观看| 亚洲久久在线| 欧美激情三区| 亚洲风情在线资源| 中文精品视频| 国产精品资源| 色88888久久久久久影院| 午夜在线精品| 国产精品九九| 欧美成人亚洲| 欧美在线观看天堂一区二区三区| 精品三级av| 久久成人精品| 国产精品丝袜在线播放| 99精品在线| 久久精品 人人爱| 精品一区亚洲| 国产精品毛片aⅴ一区二区三区| 成人精品天堂一区二区三区| 亚洲精选久久| 日韩久久精品| 日韩福利视频网| 亚洲香蕉网站| 欧美激情五月| 西西人体一区二区| 国产精品久久久久久久免费观看| 久久亚洲一区|