python 中文亂碼問題深入分析.doc

python 中文亂碼問題深入分析.doc

ID:55632074

大?。?4.00 KB

頁數(shù):8頁

時(shí)間:2020-05-21

python 中文亂碼問題深入分析.doc_第1頁
python 中文亂碼問題深入分析.doc_第2頁
python 中文亂碼問題深入分析.doc_第3頁
python 中文亂碼問題深入分析.doc_第4頁
python 中文亂碼問題深入分析.doc_第5頁
資源描述:

《python 中文亂碼問題深入分析.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫

1、python中文亂碼問題深入分析一直以來,python中的中文編碼就是一個(gè)極為頭大的問題,經(jīng)常拋出編碼轉(zhuǎn)換的異常,python中的str和unicode到底是一個(gè)什么東西呢?在本文中,以'哈'來解釋作示例解釋所有的問題,“哈”的各種編碼如下:1.UNICODE(UTF8-16),C854;2.UTF-8,E59388;3.GBK,B9FE。一、python中的str和unicode一直以來,python中的中文編碼就是一個(gè)極為頭大的問題,經(jīng)常拋出編碼轉(zhuǎn)換的異常,python中的str和unicode到底是一個(gè)什么東西呢?在py

2、thon中提到unicode,一般指的是unicode對(duì)象,例如'哈哈'的unicode對(duì)象為u'u54c8u54c8'而str,是一個(gè)字節(jié)數(shù)組,這個(gè)字節(jié)數(shù)組表示的是對(duì)unicode對(duì)象編碼(可以是utf-8、gbk、cp936、GB2312)后的存儲(chǔ)的格式。這里它僅僅是一個(gè)字節(jié)流,沒有其它的含義,如果你想使這個(gè)字節(jié)流顯示的內(nèi)容有意義,就必須用正確的編碼格式,解碼顯示。例如:對(duì)于unicode對(duì)象哈哈進(jìn)行編碼,編碼成一個(gè)utf-8編碼的str-s_utf8,s_utf8就是是一個(gè)字節(jié)數(shù)組,存放的就是'xe5x93x8

3、8xe5x93x88',但是這僅僅是一個(gè)字節(jié)數(shù)組,如果你想將它通過print語句輸出成哈哈,那你就失望了,為什么呢?因?yàn)閜rint語句它的實(shí)現(xiàn)是將要輸出的內(nèi)容傳送了操作系統(tǒng),操作系統(tǒng)會(huì)根據(jù)系統(tǒng)的編碼對(duì)輸入的字節(jié)流進(jìn)行編碼,這就解釋了為什么utf-8格式的字符串“哈哈”,輸出的是“鍝堝搱”,因?yàn)?xe5x93x88xe5x93x88'用GB2312去解釋,其顯示的出來就是“鍝堝搱”。這里再強(qiáng)調(diào)一下,str記錄的是字節(jié)數(shù)組,只是某種編碼的存儲(chǔ)格式,至于輸出到文件或是打印出來是什么格式,完全取決于其解碼的編碼將它解

4、碼成什么樣子。這里再對(duì)print進(jìn)行一點(diǎn)補(bǔ)充說明:當(dāng)將一個(gè)unicode對(duì)象傳給print時(shí),在內(nèi)部會(huì)將該unicode對(duì)象進(jìn)行一次轉(zhuǎn)換,轉(zhuǎn)換成本地的默認(rèn)編碼(這僅是個(gè)人猜測(cè))二、str和unicode對(duì)象的轉(zhuǎn)換str和unicode對(duì)象的轉(zhuǎn)換,通過encode和decode實(shí)現(xiàn),具體使用如下:將GBK'哈哈'轉(zhuǎn)換成unicode,然后再轉(zhuǎn)換成UTF8三、Setdefaultencoding如上圖的演示代碼所示:當(dāng)把s(gbk字符串)直接編碼成utf-8的時(shí)候,將拋出異常,但是通過調(diào)用如下代碼:import?sysreload

5、(sys)sys.setdefaultencoding('gbk')后就可以轉(zhuǎn)換成功,為什么呢?在python中str和unicode在編碼和解碼過程中,如果將一個(gè)str直接編碼成另一種編碼,會(huì)先把str解碼成unicode,采用的編碼為默認(rèn)編碼,一般默認(rèn)編碼是anscii,所以在上面示例代碼中第一次轉(zhuǎn)換的時(shí)候會(huì)出錯(cuò),當(dāng)設(shè)定當(dāng)前默認(rèn)編碼為'gbk'后,就不會(huì)出錯(cuò)了。至于reload(sys)是因?yàn)镻ython2.5?初始化后會(huì)刪除?sys.setdefaultencoding?這個(gè)方法,我們需要重新載入。四、操作不同文件的編碼

6、格式的文件建立一個(gè)文件test.txt,文件格式用ANSI,內(nèi)容為:abc中文用python來讀取#coding=gbkprintopen("Test.txt").read()結(jié)果:abc中文把文件格式改成UTF-8:結(jié)果:abc涓枃顯然,這里需要解碼:#coding=gbkimportcodecsprintopen("Test.txt").read().decode("utf-8")結(jié)果:abc中文上面的test.txt我是用Editplus來編輯的,但當(dāng)我用Windows自帶的記事本編輯并存成UTF-8格式時(shí),運(yùn)行時(shí)報(bào)錯(cuò)

7、:Traceback(mostrecentcalllast):File"ChineseTest.py",line3,in?printopen("Test.txt").read().decode("utf-8")UnicodeEncodeError:'gbk'codeccan'tencodecharacteru'ufeff'inposition0:illegalmultibytesequence原來,某些軟件,如notepad,在保存一個(gè)以UTF-8編碼的文件時(shí),會(huì)在文件開始的地方插入三個(gè)不可見的字符(0xEF0xBB0xBF

8、,即BOM)。因此我們?cè)谧x取時(shí)需要自己去掉這些字符,python中的codecsmodule定義了這個(gè)常量:#coding=gbkimportcodecsdata=open("Test.txt").read()ifdata[:3]==codecs.BOM_UTF8:data=

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。