python 3 字符編碼解碼問題
python2與python3 字符編碼都做了很大的調整,區別:
1.python2字符串默認有兩種類型,unicode和str。'你好' !=u'你好'
python3字符串默認只有str一種類型,但實際是unicode類型的字符串,'你好' ==u'你好'
2.python2默認的coding是ascii。
python3默認的coding是utf8
3.python2默認的基類是unicode的bytes,這里強調不是字符串。unicode類bytes經過encode轉化為不同編碼類型bytes,再轉化為各類型的bytes轉化成的str,這里就不是u類型了。各類型str經過decode轉化為各類型的bytes,再轉化u為nicode類bytes 。
python3默認的基類是str,也就是編碼為unicode類型的字符串。不同類bytes經過decode先轉化為unicode類bytes,再轉化為unicode類的字符串。str經過encode先轉化為unicode類型的bytes,再轉化為不同類型bytes編碼。
理解了上面再加上下面的一段程序應該能了解區別在哪了。
1 #! -*- coding=utf8 -*- 2 3 4 5 s='你好' #str默認都是unicode編碼的類型,也就是utf8,與coding無關。 6 # s_to_gbk=s.encode('gbk') 7 # s_to_utf8=s.encode('utf8') 8 # test1=s_to_utf8.decode('utf8') 9 # test2=s_to_gbk.decode('gbk') #這里就會報錯,因為test2不能被utf8解碼 10 11 12 # print('old:',s,'s-utf8',s_to_utf8,'decode',test1) 13 14 # print('old:',s,'s-gbk ',s_to_gbk,'decode',test2) 15 16 s1=b'\xe6\xb5\xa3\xe7\x8a\xb2\xe3\x82\xbd' 17 s2=b'\xe4\xbd\xa0\xe5\xa5\xbd' 18 s3=b'\xc4\xe3\xba\xc3' 19 20 print(s1.decode('utf8')) 21 print(s2.decode('utf8')) 22 print(s3.decode('gbk')) 23 print(s.encode('utf8').decode('gbk')) 24 print(s.encode('utf8').decode('gbk').encode('utf8'))#這里就說明了如果code是gbk,s=u'你好'這個str同時也是unicode同樣還是utf8,聲明解碼是gbk 25 #錯誤的將utf8編碼的字節轉碼為gbk,輸出自然是錯誤的。這時再用utf8轉碼二進制 26 #就是這個錯誤的str基礎上繼續編碼為utf8,輸出的就是錯上加錯。 27 28 su=u'你好' 29 30 print('是否相同呢',su==s)
posted on 2018-03-09 13:37 撞鐘和尚cokeor 閱讀(187) 評論(0) 收藏 舉報
浙公網安備 33010602011771號