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编码。

理解了上面再加上下面的一段程序应该能了解区别在哪了。

 #! -*- coding=utf8 -*-

 s='你好'                                                   #str默认都是unicode编码的类型,也就是utf8,与coding无关。
# s_to_gbk=s.encode('gbk')
# s_to_utf8=s.encode('utf8')
# test1=s_to_utf8.decode('utf8')
# test2=s_to_gbk.decode('gbk') #这里就会报错,因为test2不能被utf8解码 # print('old:',s,'s-utf8',s_to_utf8,'decode',test1) # print('old:',s,'s-gbk ',s_to_gbk,'decode',test2) s1=b'\xe6\xb5\xa3\xe7\x8a\xb2\xe3\x82\xbd'
s2=b'\xe4\xbd\xa0\xe5\xa5\xbd'
s3=b'\xc4\xe3\xba\xc3' print(s1.decode('utf8'))
print(s2.decode('utf8'))
print(s3.decode('gbk'))
print(s.encode('utf8').decode('gbk'))
print(s.encode('utf8').decode('gbk').encode('utf8'))#这里就说明了如果code是gbk,s=u'你好'这个str同时也是unicode同样还是utf8,声明解码是gbk
#错误的将utf8编码的字节转码为gbk,输出自然是错误的。这时再用utf8转码二进制
#就是这个错误的str基础上继续编码为utf8,输出的就是错上加错。 su=u'你好' print('是否相同呢',su==s)
上一篇:Device Tree常用方法解析


下一篇:kubernetes 微服务西游记(持续更新中...)