<center> #Python字符編碼 中文亂碼 </center>java
Python中可能會出現各類各樣的中文亂碼問題,在python程序運行中,有三個地方與編碼直接相關python
###1.系統默認編碼 windows系統默認編碼爲GBK,Linux系統默認爲UTF-8(不知道是否是全部Linux都默認UTF-8,但至少Ubuntu是UTF-8)windows
意味着在Linux終端上輸出GBK會致使亂碼, 在Windows控制檯輸出UTF-8會致使亂碼編輯器
//查看系統默認編碼 import sys, locale, os print(sys.stdout.encoding) //或者 print(locale.getpreferredencoding())
###2.Python源文件編碼格式 Python源文件編碼格式與操做系統有關,還和文本編輯器有關.編碼
在Windows的記事本編寫代碼保存的是GBK編碼格式操作系統
在Notepad++等其餘文本編輯器中能夠更改保存的編碼格式code
Python默認認爲源文件爲ANSI編碼,若果源文件保存成了其餘編碼,Python在解析源文件的時候可能會出現字符編碼不認識,由於ANSI字符集中不存在,從而致使程序執行中斷utf-8
這種狀況能夠經過在程序第一行或者第二行加上(如下爲源文件保存爲utf-8的狀況,若是保存成了gbk,將下面代碼中utf-8替換成gbk便可)unicode
#encoding:utf-8 或者 #-*- encoding:utf-8 -*-
這樣Python會以指定編碼格式來解析源文件字符串
###3.控制檯輸出/讀寫文件 Python中有兩種字符相關的類型,一種是str
,另外一種是unicode
.其中str
類型相似於java中的byte
(str
是字節串, byte
是一個字節),unicode
相似java中的char
(unicode
爲字串,char
是一個字)
str和unicode能夠互相轉換
#str轉unicode,charset是當前str的編碼格式 u = str.decode("charset") #unicode轉str,charset爲目標編碼格式 s = unicode.encode("charset")
unicode能夠經過str轉換過來,也能夠直接申明,以下
uStr=u'Python'
**注意!!!**在代碼中不要直接申明中文unicode,以下
uStr=u'中文'
這樣將致使uStr爲亂碼,也沒法轉換(轉換極可能會報錯),緣由以下(假設源代碼保存爲gbk格式)
在源代碼中,`中文` 二字被保存成了`\xd6\xd0\xce\xc4 `,那麼 `u'中文'`結果就成了 `u'\xd6\xd0\xce\xc4'`. 實際上 `中國` 的unicode爲 `u'\u4e2d\u6587'.而`u'\xd6\xd0\xce\xc4'`對於任何一種編碼可能都是錯誤編碼
經過上面的說明,如今要使控制檯輸出不爲亂碼就容易了.
確保最後輸出的字符和系統默認字符編碼一致便可,如windows下,utf-8的字符可使用下面的代碼
utf8Str.decode("utf-8").encode("gbk")
對於Linux下gbk編碼可使用一下代碼
gbkStr.decode("gbk").encode("utf-8")
實際上Python在輸出unicode字符串的時候會先調用encode("charset")再輸出,這裏charset就是系統默認編碼,所只要正確的將str轉換成了unicode,系統就能正確輸出
對於str類型,Python不會自行轉換,若是str的編碼和系統默認編碼不一致,就會致使亂碼
讀寫文件時須要知道文件的編碼格式(也可使用程序檢查文件的編碼格式),而後作出正確的選擇.
例如對於源代碼爲gbk格式,數據文件爲utf-8格式,在windows下.
subStr = "中文" fp=open('utf8file.txt','r') for line in fp: line.find(subStr)
在上面的代碼中不管數據文件中是否有"中文"二字,程序都是找不到的,由於兩種str的字符編碼不一樣,就是找到了也是錯誤的,能夠將subStr轉爲utf8格式,也能夠將line轉爲gbk格式在查找
###結束語 剛開始寫這篇文章的時候思路並非很清晰,不少點也不知道,在寫的過程當中想到了一些問題,而後網上查找資料,並本身寫代碼驗證.這樣漸漸的愈來愈明瞭,理解得也愈來愈透徹.大部分中文亂碼問題應該能夠從上面找到解決方法
若有疑問,歡迎討論 tangchenyi@mail.hfut.edu.cn