天天看點

Python程式在Windows終端亂碼解決方法 問題提出 問題原因 總結

Python程式在Windows終端亂碼解決方法 問題提出 問題原因 總結

呵呵,對windows妥妥的沒有愛了。。。。

python程式在windows終端(cmd)下亂碼,是字元串編碼的問題

python 預設腳本檔案都是 anscii 編碼的,當檔案 中有非 anscii 編碼範圍内的字元的時候就要使用”編碼訓示”來修正。 一個module的定義中,如果.py檔案中包含中文字元(嚴格的說是含有非anscii字元),則需要在第一行或第二行指定編碼聲明:

1

或者

其他的編碼如:gbk、gb2312也可以; 否則會出現類似

這樣的異常資訊

另外需要注意的是聲明的編碼必須與檔案實際儲存時用的編碼一緻,否則很大幾率會出現代碼解析異常。現在的ide一般會自動處理這種情況,改變聲明後同時換成聲明的編碼儲存,但文本編輯器控們需要小心 :)

系統預設的編碼方式可以采用:

2

當然設定預設的編碼方式采用:

3

至于為什麼要reload sys,是因為系統在加載時删除了sys.setdefaultencoding(’utf-8’)這句,是以這個時候要重新加載reload sys子產品才能調用sys.setdefaultencoding(’utf-8’)語句起作用 基礎就這麼多了,接下來我們再看看字元串的編碼。。。。

str和unicode都是basestring的子類。嚴格意義上說,str其實是位元組串,它是unicode經過編碼後的位元組組成的序列。

str類型是一個包含characters represent (at least) 8-bit bytes的序列;unicode的每個unit是一個unicode obj

是以:len(u’中國’)的值是2;len(‘ab’)的值也是2;

在str的文檔中有這樣的一句話:the string data type is also used to represent arrays of bytes, e.g., to hold data read from a file. 也就是說在讀取一個檔案的内容,或者從網絡上讀取到内容時,保持的對象為str類型;如果想把一個str轉換成特定編碼類型,需要把str轉為unicode,然後從unicode轉為特定的編碼類型如:utf-8、gb2312等;

對utf-8編碼的str’漢’使用len()函數時,結果是3,因為實際上,utf-8編碼的’漢’ == ‘\xe6\xb1\x89’。

unicode才是真正意義上的字元串,對位元組串str使用正确的字元編碼進行解碼後獲得,并且len(u’漢’) == 1。

例如下面的代碼

4

5

6

7

8

9

10

11

12

13

14

15

16

再來看看encode()和decode()兩個basestring的執行個體方法,了解了str和unicode的差別後,這兩個方法就不會再混淆了:

首先,現存有很多種編碼方式,就中文而言,gb2312,gbk,gb18030(包含中文字元最多最全面的)

而目前國際上常用的編碼方式有:utf-8.(發現中文亂碼之後,百度答案:在py檔案開頭添加coding為utf-8)

以如果xxx不是unicode,系統會采用預設編解碼方式對xxx進行解碼,然後再做如上的編碼操作)

下面我們看幾個轉換編碼的例子

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

這裡會發生一個異常:

python 會自動的先将 s 解碼為 unicode ,然後再編碼成 gb2312。因為解碼是python自動進行的,我們沒有指明解碼方式,python 就會使用 sys.defaultencoding 指明的方式來解碼。很多情況下 sys.defaultencoding 是 anscii,如果 s 不是這個類型就會出錯。

拿上面的情況來說,我的 sys.defaultencoding 是 anscii,而 s 的編碼方式和檔案的編碼方式一緻,是 utf8 的,是以出錯了: unicodedecodeerror: ‘ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)

對于這種情況,我們有兩種方法來改正錯誤:

一是明确的訓示出 s 的編碼方式

二是更改 sys.defaultencoding 為檔案的編碼方式

首先要搞清楚,字元串在python内部的表示是unicode編碼,是以,在做編碼轉換時,通常需要以unicode作為中間編碼,即先将其他編碼的字元串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。

在某些ide中,字元串的輸出總是出現亂碼,甚至錯誤,其實是由于ide的結果輸出控制台自身不能顯示字元串的編碼,而不是程式本身的問題。

該檔案的編碼必需與s.decode(‘utf8’)指定的編碼一緻,不然會抛出解碼異常資訊

建立一個檔案test.txt,檔案格式用ansi,内容為:

用如下python代碼來讀取

結果輸出

把檔案格式改成utf-8:

結果:

顯然,這裡需要解碼

上面的test.txt我是用editplus來編輯的,但當我用windows自帶的記事本編輯并存成utf-8格式時,

運作時報錯:

原來,某些軟體,如notepad,在儲存一個以utf-8編碼的檔案時,會在檔案開始的地方插入三個不可見的字元(0xef 0xbb 0xbf,即bom)。

是以我們在讀取時需要自己去掉這些字元,python中的codecs module定義了這個常量:

windows下終端輸出中午的方法

這種方式下上面所用的輸出方法同樣适用

解決方法:

1.直接使用 u’中文’ 形式,指明以unicode編碼,解碼方式會以頂部 #coding定義的編碼方式,如果不寫,以作業系統目前編碼方法,建議寫上#coding,因為要讓作業系統編碼和源檔案編碼經常會不一樣。推薦使用這種方式

2.輸出時指定解碼方法 print ‘是’.decode(“utf8”) ,必須和儲存的編碼一緻,忽略#coding的定義

3.将#coding 和儲存編碼改為和作業系統一樣的編碼,就可以直接print ‘是’ 正常輸出,也不推薦,因為需要事先知道作業系統編碼,複制到其他電腦上,作業系統編碼不一樣就會出錯

轉載:http://blog.csdn.net/gatieme/article/details/45648167