Python字符編碼 中文亂碼

<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

相關文章
相關標籤/搜索