首頁 > 軟體

Python2.x中文亂碼問題解決

2020-06-16 18:07:36

Python中亂碼問題是一個很頭痛的問題。

在Python3中,對中文進行了全面的支援,但在Python2.x中需要進行相關的設定才能使用中文。否則會出現亂碼

 

問題原因

在Python2.x中主要是字元編碼的問題,處理不好的話,會導致亂碼。Python預設採取的ASCII編碼,字母、標點和其他字元只使用一個位元組來表示,但對於中文字元來說,一個位元組滿足不了需求。

  1. >>> import sys 
  2. >>> sys.getdefaultencoding() 
  3. 'ascii' 

為了能在計算機中表示所有的中文字元,中文編碼採用兩個位元組表示。如果中文編碼和ASCII混合使用的話,就會導致解碼錯誤,從而才生亂碼。而CMD下預設的編碼方式為:GBK,所以就造成了上面的亂碼! 


採用兩個位元組的中文編碼標準有:GB2312、GBK、BIG5等。

 

處理辦法

為了將各種不同的語言套件含在統一的字元集中,滿足國際間的資訊交流,國際上制訂了UNICODE字元集,包含了世界上所有語言字元,這些字元具有唯一的編碼,通過使用UNICODE字元集可以滿足跨語言的文書處理,避免亂碼的產生。

i)  互動式命令中:一般不會出現亂碼,無需做處理 


ii) py指令碼檔案中:跨字元集必須做設定,否則亂碼。

 

  • 首先在開頭一句新增:
  1. # coding = utf-8  
  2. # 或  
  3. # coding = UTF-8  
  4. # 或  
  5. # -*- coding: utf-8 -*- 
  • 其次需將檔案儲存為UTF-8的格式!

 

上面那一句僅僅是告訴Python編譯器:指令碼中包含了非ASCII字元並未進行轉換。

如果要將字元編碼從預設的ASCII改為UTF-8,需要在儲存的時候選擇儲存為UTF-8格式。

如果是用NODEPAD開啟,【另存為】-->UTF-8即可

如果是用IDLE開啟,【Options】-> 【Configure IDLE】->【General】


上面的設定,可以保證IDLE,執行F5,能正常輸出中文。

 

編碼解碼

在開頭新增了# -*- coding: utf-8 -*-並將檔案儲存為UTF-8格式,仍然不能保證能輸出正常輸出中文,

不同的編輯器,如VIM,IDLE,Eclipse使用的輸出編碼都是不一致的。

所以,在一個地方能正常輸出中文,在另外一個地方就未必。所以還必須做編碼解碼設定!

encode:編碼

decode:解碼

必須保證編碼、解碼的物件是同一個。比如說UTF-8方式編碼, 必須再用UTF-8進行解碼即可。

所以最終解決辦法,還必須先按原先的方式解碼,再按控制台格式重新編碼:比如CMD預設是GBK方式

則必須使用如下方式:


正確輸出結果:


 

其他說明

1.在Python3中,對中文的支援非常全面,原始檔預設儲存為UTF-8的編碼,這樣一來,不但可以在原始碼中使用中文,而且變數名也可以使用中文,比如說:

  1. >>> 中國 = 'Chinese' 
  2. >>> print(中國) 
  3. Chinese 

2.在Python3中,不需要來回的編解碼,並且字串物件也沒有decode和encode方法。

--------------------------------------分割線 --------------------------------------

CentOS上原始碼安裝Python3.4  http://www.linuxidc.com/Linux/2015-01/111870.htm

《Python核心程式設計 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm

《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視訊+程式碼] http://www.linuxidc.com/Linux/2013-11/92693.htm

Python指令碼獲取Linux系統資訊 http://www.linuxidc.com/Linux/2013-08/88531.htm

Ubuntu下用Python搭建桌面演算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm

Python 語言的發展簡史 http://www.linuxidc.com/Linux/2014-09/107206.htm


IT145.com E-mail:sddin#qq.com