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 阅读(183) 评论(0) 编辑 收藏 举报