我就想不通為什麼windows的字符終端用的是cp936而不是utf-8。不過要是他用的是utf-8,那我也沒什麼博文好寫了==於是本菜鳥總結了一下,和廣大python菜鳥分享。
當然如果你全部只用英文或數字,那我又沒什麼博文好寫了wwww
當你的腳本在字符終端出現亂碼或錯誤時,按以下辦法自檢:
- 打印的字符是中文字,但是都是沒學過o(╯□╰)o:使用了utf-8編碼(encode),字符終端代碼頁是gbk
- 打印出的都是“�åȡ��”:你使用了gbk或其他的編碼,而終端使用的是utf-8
一般來說:
- 網頁使用utf-8編碼較多(聽說以前百度是用的gb2312?),做爬蟲並要打印在屏幕上時,要對原始數據做utf-8解碼(decode)處理
- windows下的大部分文本文件是ANSI編碼,讀取文件並打屏幕上時做cp936解碼
我一般是這麼解決的:
- 【必須】在腳本開頭加入以下代碼,為使內部編解碼的“中間過程”不使用ascii 解碼器。防止出現’ ‘ascii’ codec can’t decode/encode byte 0x99 in position 4-6’
1 2 3 |
import sys reload(sys) sys.setdefaultencoding('utf-8') |
- 寫一個“規範化字符串”用的函數,這樣得到的字符串可直接用於打印,且因為有errors處理,不會出現‘‘gbk’ codec cannot decode/encode byte 0x99 in position xxx’的錯誤(第二個參數指定error處理,可選有’ignore’丟棄, ‘replace’用?代替)
1 2 3 4 5 |
def normstr(str,errors='ignore'): if sys.platform=='win32':#若windows return str.encode('gbk',errors)#更好的辦法是用cp936,因為它支持一些繁體字 else: return str.encode('utf-8',errors) |
- 在腳本開頭加入編碼定義語句。當然你不怕死也可以用gbk
1 |
# -*- coding:utf-8 -*- |
這樣之後,在代碼中如果出現
1 |
print('尼瑪') |
之類的語句時,需要在字符串後面加上.decode(‘utf-8’)變成
1 |
print('尼瑪'.decode('utf-8')) |
因為你的代碼是utf-8編碼的
- 如果你和我一樣用的是pydev+eclipse寫的代碼,為了方便windows環境調試起見,可以把控制台的編碼改成和windows一樣挫的gbk。方法是:Run->Run configuration->Common->Encoding->Others填入GBK或者cp936
寫完了~真開森~
參考資料:
http://hi.baidu.com/mdj_hu/item/4d7d0803d38e62e1fe240de4
http://www.jb51.net/article/26543.htm(不推薦,看完暈過去)