1. 程式人生 > >Python3中的字元編碼

Python3中的字元編碼

Python2中的標頭檔案

    英語是世界上最流行的語言,任何IDE中文字的編碼方式幾乎都是ASCII,但是,如果想在編譯環境中正常顯示中文,就需要付出一些額外的努力。對於Python2來說,就面臨這個“中文能否正常顯示”的問題,因此,為了讓編譯器知道這些字元是中文,就不能使用ASCII編碼了,但是同時又得相容ASCII,於是,‘utf-8’是一個不錯的選擇。我們常常在程式最開始加上,

  但是話說回來,對於python3來說,預設的編碼方式就是'utf-8', 完全不存在此問題,所以也就不用加這一行了。

Python2 與 Python3 在字元編碼領域的區別

   習慣了Python2的同學,如果直接進行Python3的開發,一定會被此問題大大困擾,因為樓主就因為此問題搞的異常痛苦。

  你一定會發現一個問題,那就是,對於str的變數,將無法decode了,會提示,str物件沒有decode方法!這是為什麼呢?因為,在Python3裡面,所有的字串均是以Unicode碼儲存的! 本身就是Unicode,自然也就不需要decode了,只需要encode即可。要知道,如果是Python2,如果想對一個字串進行編碼的話,要首先將其decode成unicode,然後再進行encode,而Python3完全省掉了這一步。

  上一節有提到,gb18030,gbk,gb2312這三者是向下相容的,以下在Python3中做一個小實驗,展示瞭如何將gb2312、gbk和utf-8相互轉換。

     同時,我們也可以發現,常用的漢字用“UTF-8”編碼大約佔3位元組。 

     那麼,Python2 和 Python3中有關字元編碼,到底是怎樣一種關係呢?

     本質上來說,這一點是相當混亂的。這不是樓主說的,而是很多程式設計師的共識。

     在Python3中的 str 物件在Python2中叫做 unicode ,感覺很通俗對吧?但 bytes 物件在Python2叫做 str。如果你想得到一個文字字串,你需要在字串之前加上字首 u 或者 decode 一下。搞笑的還不止這麼點,Python2中的 str (位元組) 物件,竟然有一個 encode

方法!而且你別指望它有什麼特殊用處,它就是用來報錯的,永遠都別使用它

     為什麼b明明是gbk編碼的,卻報了一個ascii錯誤呢?因為python2為了對一個unicode物件解碼而自作聰明地進行了隱式編碼!以上程式碼相當於:

 Python中檢測字元編碼的包-chardet

    有時候我們在進行網頁爬蟲或者是進行文字處理時,首先應該得到文字

    方法:chardet.detect(位元組資料)

    錯誤原因:希望的輸入是位元組,結果輸入的是str(等價於unicode

 親測:漢字常常被判定為ibm866,ibm855,iso-8859-2,koi8-r等奇葩編碼,但是一般可信度都不高。

 出現這種情況,一般是因為漢字數量太少,這時候判斷具有很大的隨機性。

這時,如果增加漢字的數量,那麼判斷的準確性也會因此而提升上去,如下:當判斷的字串中的字元多的時候,可信度就上去了,因為沒有出現gbk中出現的生僻字元,所以漢字一般會被判定成“GB2312 

Python中開啟(open)一個txt檔案

 

關於open()函式的幾個實驗:

       對於英文字元,即使encoding方法不一樣,也沒關係。

總結:

1ASCII碼中的字元不存在編碼問題。

2python中的open()函式,不論是讀還是寫,遇到中文,預設的編碼方式都是gbk