撞钟和尚cokeor

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编辑  收藏  举报