python中編碼問題

2021-10-05 09:28:46 字數 3957 閱讀 6381

編碼是將儲存在檔案中的二進位制資料以特定的格式顯示的一種手段。不同的作業系統、不同的編輯環境,對於python進行檔案操作帶來了很大的挑戰,總體表現在三方面:

1、作業系統對檔案編碼的影響

2、python編輯環境對python編碼的影響

3、檔案內容對編碼的要求

擴充套件來說:

1、不同作業系統,生成的檔案的預設編碼不同。

win10有幾個版本(截止2023年)?

根據微軟今天的正式公布,win10共劃分為7個版本,具體如下:

- windows 10家庭版(windows 10 home)

- windows 10專業版(windows 10 pro)

- windows 10企業版(windows 10 enterprise)

- windows 10教育版(windows 10 education)

- windows 10移動版(windows 10 mobile)

- windows 10企業移動版(windows 10 mobile enterprise)

- windows 10 iot core(主要針對物聯網裝置)

以txt檔案的預設編碼為例,不同語言、不同版本的作業系統其生成的txt檔案預設編碼不同:(以下以中文為例說明)

- windows 10家庭版(windows 10 home) :txt預設編碼為:utf-8

- windows 10專業版(windows 10 pro):txt預設編碼為:utf-8

- windows 10教育版(windows 10 education):txt預設編碼為:ansi 等

(只測試了這三個版本)

2、python編輯環境對python編碼的影響

不同編輯環境,其預設的編碼也不同,以pycharm為例,其預設編碼位gbk,所以如果print中的內容為gbk不能識別的,則會出現錯誤;如果在使用pycharm讀檔案時,沒有明確指定encoding為和開啟一致的編碼格式,會提示編碼出錯。

如果你是家庭版的win10系統,那麼上述設定會節約你很多因為編碼不一致而導致的時間浪費。(utf-8推薦)

3、檔案內容對編碼的要求

不同語言,其要正常顯示,需要使用對應的編碼,如果編碼不一致,會出現亂碼。常見編碼簡要說明如下:

常見編碼方式:unicode、ascii、gbk、gb2312等

(1)ascii:能表示128個字元,其中包括英文本元、阿拉伯數字、西文字元以及32個控制字元。它用乙個位元組來表示具體的字元,但它只用後7位來表示字元(2^7=128),最前面的一位統一規定為0。

擴充套件ascii碼(即ansi編碼):原本的ascii碼對於英文語言的國家是夠用了,但是歐洲國家的一些語言會有拼音,這時7個位元組就不夠用了。因此一些歐洲國家就決定,利用位元組中閒置的最高位編入新的符號。比如,法語中的é的編碼為130(二進位制10000010)。 這樣一來,這些歐洲國家使 用的編碼體系,可以表示最多256個符號。但這時問題也出現了:不同的國家有不同的字母,因此,哪怕它們都使用256個符號的編碼方式,代表的字母卻不一樣。比如,130在法語編碼 中代表了é,在希伯來語編碼中卻代表了字母gimel (ג),在俄語編碼中又會代表另乙個符號。但是不管怎樣,所有這些編碼方式中,0—127表示的符號是一樣的,不一樣的只是128—255的這一段。這個問題就直接促使了unicode編碼的產生。但是正因為unicode包含了所有的字元,而有些國家的字元用乙個位元組便可以表示,而有些國家的字元要用多個位元組才能表示出來。

(2)unicode:世界上存在著多種編碼方式,同乙個二進位制數字可以被解釋成不同的符號。因此,要想開啟乙個文字檔案,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,就會出現亂碼。為什麼電子郵件常常出現亂碼?就是因為發信人和收信人使用的編碼方式不一樣。而unicode就是這樣一種編碼:它包含了世界上所有的符號,並且每乙個符號都是獨一無二的。比如,u+0639表示阿拉伯字母ain,u+0041表示英語的大寫字母a,u+4e25表示漢字「嚴」。具體的符號對應表,可以查詢unicode.org,或者專門的漢字對應表 。很多人都說unicode編碼,但其實unicode是乙個符號集(世界上所有符號的符號集),而不是一種新的編碼方式。 但是正因為unicode包含了所有的字元,而有些國家的字元用乙個位元組便可以表示,而有些國家的字元要用多個位元組才能表示出來。即產生了兩個問題:第一,如果有兩個位元組的資料,那計算機怎麼知道這兩個位元組是表示乙個漢字呢?還是表示兩個英文本母呢?第二,因為不同字元需要的儲存長度不一樣,那麼如果unicode規定用2個位元組儲存字元,那麼英文本元儲存時前面1個位元組都是0,這就大大浪費了儲存空間。 上面兩個問題造成的結果是:1)出現了unicode的多種儲存方式,也就是說有許多種不同的二進位制格式,可以用來表示unicode。2)unicode在很長一段時間內無法推廣,直到網際網路的出現。

(3)utf-8:解決國際上字元的一種多位元組編碼。英文使用8位(即乙個位元組),中文使用24位(三個位元組)來編碼。網際網路的普及,強烈要求出現一種統一的編碼方式。utf-8就是在網際網路上使用最廣的一種unicode的實現方式。其他實現方式還包括utf-16和utf-32,不過在網際網路上基本不用。重複一遍,這裡的關係是,utf-8是unicode的實現方式之一。 utf-8最大的乙個特點,就是它是一種變長的編碼方式。它可以使用1~4個位元組表示乙個符號,根據不同的符號而變化位元組長度。utf-8的編碼規則很簡單,只有兩條: 1)對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母,utf-8編碼和ascii碼是相同的。 2)對於n位元組的符號(n>1),第乙個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的unicode碼。

(4)gbk/gb2312/gb18030 gbk和gb2312都是針對漢字的編碼。1、gbk和gb2312 都是16位的。 2、gbk(支援1萬多個漢字編碼)支援簡體中文和正體中文,而gb2312只支援簡體中文(只支援六千多個漢字)的編碼,gbk裡面包含了gb2312,用gbk比較多。 3、gb18030是32位的,它支援簡體中文、正體中文 藏文、蒙文、維吾爾文等主要的少數民族文字,包含gbk和gb2312。 4、從gb2312(2023年)、gbk(2023年)到gb18030(2023年),這些編碼方法是向下相容的。

補充內容:

1、nunicode下utf-8、utf-16及utf-32。

utf(ucs transformation format)是面向網路傳輸的一系列標準。utf-8:每次8個位傳輸資料;utf-16:每次16個位傳輸資料。例如:在utf-8中,0-127號的字元用1個位元組來表示,使用與ascii相同的編碼(相容);128號及以上的字元才用2個、3個(如漢字)或者4個位元組來表示。utf-8被稱作可變長度編碼。因為其解決了unicode不便於傳輸的問題,於是得到了廣泛使用。

2、低位元組序與高位元組序和bom

在utf-8中有帶bom的和不帶bom。bom(bom——byte order mark,就是位元組序標記),是在網路裡傳遞資訊時有乙個很重要問題,就是對於資料高低位的解讀方式,即位元組序問題。一些計算機是採用低位位元組被存在前面的方式,稱之為低位元組序(little endian),例如intel架構的微處理器;而另一些是採用高位位元組被存在前面的方式,稱之為高位元組序(big endian),例如motorola架構的微處理器。在網路中資料交換時,為了核對雙方對於高低位的規則是否是一致的,採用了一種很簡便的方法——文字流前新增bom(byte order mark,位元組順序標記),就是在文字流的開始時新增乙個標誌符來表示該文字的位元組序。具體規則是如果該文字是高位元組序,bom就為feff,反之,則為fffe。

utf-8不需要bom來表明位元組順序,但可以用bom來表明編碼方式。字元」zero width no-break space「的utf-8編碼ef bb bf。所以如果接收者收到以ef bb bf開頭的位元組流,就知道這是utf-8編碼了。

python中編碼問題

1.指示編碼修正 標頭檔案一般宣告為 coding utf 8 意思是 當檔案中有非utf 8的編碼時就會自動轉換成utf 8,這中間的過程一般是非utf 8編碼 unicode utf8,一般編碼與解碼的中間格式都是unicode 2.sys.setdefaultencoding utf 8 使用...

python中中文編碼問題

編碼問題一直是很頭痛的問題 當字串是 u4e2d u56fd s u4e2d u56fd u6e05 u534e u5927 u5b66 str s 0 decode unicode escape encode euc kr print str 中國當字串是 東亞學團一中 print unichr ...

python中的編碼問題

在python中遇到編碼問題主要來自於ascii和gbk兩個方面。win中python為unicode編碼而控制台一般為gbk編碼 ascii 對於ascii來說,是由於這一編碼系統的顯示導致其無法編碼中文和特殊字元,所以需要在開始宣告 使用utf 8編碼.或者在 開頭著名 coding utf 8...