呵呵,對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