python2的中文處理很麻煩,特做總結疗韵。
unicode 與 utf-8
默認的中文使用的是utf-8編碼权薯,前面加u的是Unicode編碼:
寫文件的字符串不能用Unicode編碼嗓化,可以用utf-8編碼,同理搅方,其它的IO也應該使用utf-8:
# utf-8編碼下可以正常寫文件
s = '等等'
with open('testData.txt', 'w') as fOut:
fOut.write(s)
# unicode編碼時寫文件會拋出編碼異常
s = u'等等'
with open('testData.txt', 'w') as fOut:
fOut.write(s)
unicode編碼是python的工作編碼比吭,utf-8編碼是python的IO編碼。
即字符串在內存中編輯時應該使用Unicode編碼姨涡,字符串寫入文件前應該轉換成utf-8編碼衩藤。文件中讀取出的字符串是utf-8編碼,對這字符串進行編輯前應該轉換成Unicode編碼绣溜。
為什么編輯時要用Unicode編碼而不直接用utf-8編碼慷彤?且看下圖:
如上,utf-8編碼時字符串中的每個元素是字節(jié),unicode 編碼時字符串中的元素才是一個漢字底哗。(這也是為什么要用utf-8寫文件而不用unicode)
encode 與 decode
unicode和utf-8的轉換需要使用encode和decode岁诉,這里主動忽略gb編碼。
encode是將當前的字符串(字節(jié)串)編碼成目標編碼的字節(jié)串跋选,decode是將當前的字節(jié)串解碼為Unicode編碼的字符串涕癣。所以才說Unicode是工作編碼嘛。
使用示例:
s = u'打的' # unicode字符串
s1 = s.encode('utf-8') # 將Unicode字符串編碼成utf-8字節(jié)串
s2 = s1.decode('utf-8') # 將utf-8字節(jié)串解碼成unicode字符串
s = '打的' # utf-8字節(jié)串
s2 = s.decode('utf-8') # 將utf-8字節(jié)串解碼成Unicode字符串
s1 = s.encode('unicode escape') # 將utf-8字節(jié)串編碼成Unicode字節(jié)串
s2 = s1.decode('utf-8') # 將Unicode字節(jié)串解碼成Unicode字符串
用法分析:
如上圖前标,可以看到坠韩,即使兩個字符串的編碼不同,還是會判定他們相等的炼列。
讀寫文件
一般來說只搁,讀文件出來的字符串是utf-8字符,想要對此進行處理俭尖,建議先將其decode成Unicode字符串氢惋。
寫文件時要十分注意這個字符串是不是utf-8。不是就得先encode稽犁。
如果嫌麻煩焰望,也可以直接在開頭加這幾句:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
JSON 的 load 與 dump
用load函數(shù)加載json文件時,中文字符會被轉換成\u開頭的unicode碼已亥。
用dump函數(shù)寫json文件時熊赖,需要注意一個參數(shù) ensure_ascii
,此參數(shù)指定是否保證文件只含ASCII字符串虑椎,默認為True震鹉。所以要將其指定為False不然中文就被轉碼了:
with open("./test.json", "w") as f:
json.dump(elements, f, ensure_ascii=False)
也可以不直接dump而是先dumps再write:
dataOut = json.dumps(dataOut)
with open('robot_info_2.json', 'w') as fOut:
fOut.write(dataOut.decode('unicode escape').encode('utf-8'))
案例1:將\u字符串轉換成中文
s = '\u6253\u7684'
s1 = s.decode('unicode escape')