python 編碼小結

2021-07-03 13:42:03 字數 2661 閱讀 3653

str vs unicode

python中有兩種型別的字串,分別是str和unicode,其中str是字串的某種編碼的位元組流,unicode型別的字串用的是ucs-2編碼。

預設編碼

python2的預設編碼為ascii。可以通過sys.getdefaultencoding()得到。當沒有編碼宣告時就會用預設編碼來解碼原始檔中的str型別字串。

原始檔編碼vs編碼宣告

python原始檔的頭部宣告原始檔的編碼格式,如#coding:utf-8。python中的原始檔編碼最好和編碼宣告一致,否則會出現解碼錯誤。

1

#coding:uft-8

23 s = u"

中國"

將上面的**儲存成gbk格式的.py檔案,執行後會出現如下的錯誤:

python會用宣告的編碼去解碼**中的str型別字串,比如執行到s=u"中國"時,此時的"中國"是乙個str型別字串,內容為"0xd6 0xd0 0xb9 0xfa",也就是「中國」的gbk編碼,用utf-8解析時就會不認識0xd6,導致編碼錯誤。

檔案編碼是str型別的真正的編碼格式,而python是用宣告的編碼來解碼str型別的,所以導致了錯誤。

寫檔案相關編碼

如果想將unicode字串寫入檔案會發生什麼情況呢?

1

#!/usr/bin/python2#

coding:utf-8

3import

sys4 s = u"中國"

56 f = open("

test.txt

", "w"

)7f.write(s)

8 f.close()

將以上**以utf-8格式儲存為test.py

在windows的console執行後出現

可見寫檔案時還是用ascii來編碼s的, 該編碼其實就是f.encoding,如果f.encoding為none則使用預設編碼,即ascii。

同理print也是寫檔案,當執行print u"中國"時,採用的是sys.stdout.encoding來編碼unicode字串

python標準庫中的函式返回的字串的編碼

python標準函式(非unicode版本)返回的字串的編碼是由作業系統設定決定的,在我的中文window7中返回的是gbk編碼,英文linux中返回的是utf-8編碼。該編碼應該是和locale.getdefaultlocale()一致的。

string與unicode的轉換

可以通過 unicode(string[, encoding, errors])來將string轉為unicode字串,string必須是str型別的字串,encoding指明了string所用的編碼,預設為ascii。所以,unicode("中國")會報錯,因為ascii不能解碼"中國",必須用encoding指定"中國"所用的編碼。

1

#!/usr/bin/python2#

coding:utf-8

3import

sys4 us = u"中國"

5 s = "中國"

6 s1 = us + s

如上**儲存為utf-8格式後,執行會報錯,原因是執行到第6行時會將s轉為unicode,相當於呼叫了unicode(s),而不是unicode(s, "utf-8")。而u"中國"卻是相當於呼叫了unicode(s, "utf-8"),有點奇怪。。。

raw string and unicode string

當字串中有轉義字元時,可以使用r字首取消轉義屬性,此時字串被稱為raw string 如r"\t"相當於"\\t",需要注意的是r字首和字串之前不得有其他字首,如ru"\t"這樣的寫法是錯的,必須寫成ur"\t"。

我們可以用u"\u0031"的方式來表示u"1",\u後面加乙個code point表示乙個unicode字元,如果寫成ur"\u0031",則r字首將不起作用,起作用的是u。寫成r"\u0031"則會起到raw string的作用。

讀檔案

用python讀文字檔案時,會將文字檔案的位元組依次讀出來。將此位元組流輸出到console時有可能產生亂碼,原因是console用來解析該位元組流的編碼與該位元組流真正的編碼不相容。

比如將乙個utf-8格式的文字檔案中位元組流輸出到windows的console就有可能產生亂碼,因為中文版win7的console的預設**頁是cp936,也就是gbk編碼,用gbk編碼解析utf-8格式的編碼當然有可能出錯啦。但是gbk是和ascii相容的,而且utf-8也是和ascii字元相容的。如果utf-8位元組流中只有ascii字元,此時輸出到console便不會有亂碼了。如果utf-8位元組流中有含有中文,則用gbk解析的時候就會解析成亂碼。

xml為了解決文字檔案的編碼問題,便在檔案頭部就指明了該檔案所用的編碼。

Python 編碼小結

字元是個抽象的概念,在 python 中字串都是用 unicode 表示的,那些形如 abcd 這樣常見的形式,我在這裡把它稱為位元組串 位元組序列 以示區別。當我們面對一串位元組時,如果我們不知道編碼方法,我們根本不知道該如何解釋眼前的這些位元組組成的序列。本文中我們用str 表示位元組串,uni...

python 字元編碼學習小結 二

一 常見的編譯碼問題 先來說幾個常見的問題吧。這2個問題,都是最最常見,又最基本典型的問題,又最基本的2個問題,從這2個問題出發,弄清楚問題產生的原因,後面很多問題基本都是組合場景,能比較輕鬆解決。二 問題產生原因分析 1 根本原因 2 分析問題1產生原因和解決方法 第一步 格式的txt檔案被讀取到...

字元編碼小結

1 早期只有127以內的字元 20以內是控制字元。2 後來各國有了自己的編碼,但一般是兩個位元組表示乙個字元 中國 3 unicode 就是解決各國之間衝突的問題,定義了統一的標準。可以65025個字元。這樣英文也是乙個字元兩個位元組,這樣的好處是全世界統一。4 utf 系列其實和unicode可以...