Python的編解碼問題

Python的編解碼問題

對于使用Python來做數(shù)據(jù)科學(xué)的我,第一個(gè)遇到的困難就是Python2的編解碼錯(cuò)誤。由于項(xiàng)目上比較急,一直沒有時(shí)間深入探索,只能先改用Python3解決。實(shí)際上,如果不弄清楚問題的本質(zhì),在Python3中還會出現(xiàn)另一些編解碼問題。近期有時(shí)間,將這個(gè)問題好好地進(jìn)行了梳理。

問題1:用python2.x運(yùn)行的程序文件中有中文就出錯(cuò)

程序文件名chinese.py

```my_chinese = "中國"

print my_chinese

1

2

```

在終端輸入命令python chinese.py,會出現(xiàn)如下錯(cuò)誤提示:

錯(cuò)誤提示

原因:

python是一種先編譯后解釋的語言,它在執(zhí)行python xxx.py時(shí),需要先對程序文件進(jìn)行編譯。編譯器首先要讀取文件,這時(shí)如果沒有聲明文件編碼方式,編譯器會使用默認(rèn)的ASCII來對字節(jié)進(jìn)行解碼。這時(shí),如果文件中包含非ASCII字符編碼的字節(jié),就會報(bào)錯(cuò)。

解決方案:

在程序文件chinese.py的第一行或第二行加入#coding:utf-8。其實(shí),如果懂正則表達(dá)式的話,其實(shí)符合coding[:=]\s*([-\w.]+)都可以。

問題2:unicode編碼解碼錯(cuò)誤

UnicodeEncodeError:

UnicodeEncodeError

UnicodeDecodeError:

UnicodeDecodeError

原因:

這個(gè)問題主要發(fā)生在程序的輸入輸出階段,由自動(dòng)的隱式轉(zhuǎn)換造成。

輸出前的數(shù)據(jù)是字符,需要把它編碼為字節(jié)。如果沒有對其以正確的方式編碼,就會出現(xiàn)UnicodeEncodeError

輸入前的數(shù)據(jù)是字節(jié),需要把它解碼為字符。如果沒有對其以正確的方式解碼,就會出現(xiàn)UnicodeDecodeError

對字節(jié)進(jìn)行編碼操作會產(chǎn)生UnicodeDecodeError;對字符進(jìn)行解碼操作會產(chǎn)生UnicodeEncodeError

解決方案:

輸入之前和輸出之后數(shù)據(jù)都是字節(jié)的形式,中間都是unicode。所以,主要弄清楚數(shù)據(jù)在輸入輸出階段的情況:

1. 數(shù)據(jù)是字節(jié)還是字符。字節(jié)通過解碼變成字符,字符通過編碼編程字節(jié)。

2. 輸入前數(shù)據(jù)是什么編碼格式,所采用的方法使用什么解碼方式,保證方法能夠正確解碼。

3. 輸出時(shí)需要什么樣的編碼格式,所采用的方法使用什么編碼方式,保證能正確編碼。

舉例:

1. 解碼錯(cuò)誤

一般要讀的文件都是以某種方式編碼的字節(jié),如utf-8,我們要弄清楚我們讀文件的方法(如open)采用什么方式進(jìn)行解碼,如果不是utf-8,則會出現(xiàn)UnicodeDecodeError錯(cuò)誤。

2. 編碼錯(cuò)誤

如果輸入的數(shù)據(jù)是unicode字符,但其中包含非ASCII字符,就不能采用ASCII編碼方法進(jìn)行編碼。如果用了,就會出現(xiàn)UnicodeEncodeError錯(cuò)誤。應(yīng)該采用utf-8等方式編碼

總之,出現(xiàn)編解碼錯(cuò)誤的本質(zhì)就是上面描述的內(nèi)容,只要找到的發(fā)生問題的點(diǎn),然后弄這個(gè)點(diǎn)做了什么,一切編解碼問題就迎刃而解。

編解碼問題涉及到一些背景知識,看這篇文章前建議先去了解一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容