Python:一图看懂Python2还是Python3的编码

  

无论是Python2还是Python3,都使用unicode作为内存编码,简称内码。保存在python解释器内存中的文本,输出到屏幕,编辑器,或者保存成文件的时候,都要将内码转换成utf8或者gbk等编码格式;同样,python解释器从输入设备接收文本,或者从文件读取文本的时候,都要将utf8或者gbk等编码转换成unicode编码格式,因此,无论是Python2还是Python3,想要在unicode, use utf8, gbk等编码格式之间转换的话,下图是通用的:

      Python:一图看懂Python2还是Python3的编码”>
  
  <p>我们之所以会产生困惑,是因为py2和Python3给这些编码格式指定了令人困惑的名字.Python2的字符串有两种类型:unicode类型和str类型.Python2的unicode类型就是unicode编码,Python2的str类型泛指除unicode编码之外的所有编码,包括ascii编码,use utf8编码,gbk编码,cp936编码等.Python3的字符串也有两种类型:字节类型和str类型.Python3的str类型就是unicode编码,Python3类的字节型泛指除unicode编码之外的所有编码,包括ascii编码,use utf8编码,gbk编码,cp936编码等。同样是str类型,在Python2和Python3中完全颠倒了!下图稍微补充了一点内容,更有助于理解编码问题。</p>
  <p>接下来,我们实战演练一下。</p>
  <>之前在祝辞祝辞,s =, & # 39; abc天圆地方& # 39;
  在祝辞祝辞,类型(s)
  & lt; class  & # 39; str # 39;比;
  在祝辞祝辞,len (s)
  7
  在祝辞祝辞年代
  & # 39;abc天圆地方& # 39;
  在祝辞祝辞,打印(s)
  abc天圆地方
  在祝辞祝辞,s.encode (& # 39; unicode-escape& # 39;)
  b # 39; abc \ \ \ u5929 \ \ \ u5706 \ \ \ u5730 \ \ \ u65b9& # 39; </pre>
  <p>不管是否在字符串前面加了u,只要不在字符串前面使用b,在闲置中定义的字符串都是unicode编码,也就是py3的& lt;类str的祝辞,其长度就是字符数量,不是字节数。我们把unicode字符串的abc天圆地方的转成utf8编码:</p>
  <>之前在祝辞祝辞,s_utf8 =, s.encode (& # 39; use utf8 # 39;)
  在祝辞祝辞,类型(s_utf8)
  & lt; class  & # 39;字节# 39;比;
  在祝辞祝辞,len (s_utf8)
  15
  在祝辞祝辞s_utf8
  b # 39; abc \ \ xe5 \ \ xa4 \ \ xa9 \ \ xe5 \ \ x9c \ \ x86 \ \ xe5 \ \ x9c \ \ xb0 \ \ xe6 \ \ x96 \ \ xb9& # 39;
  在祝辞祝辞,打印(s_utf8)
  b # 39; abc \ \ xe5 \ \ xa4 \ \ xa9 \ \ xe5 \ \ x9c \ \ x86 \ \ xe5 \ \ x9c \ \ xb0 \ \ xe6 \ \ x96 \ \ xb9& # 39;
  在祝辞祝辞,s_utf8.decode (& # 39; use utf8 # 39;)
  & # 39;abc天圆地方& # 39;</pre>
  <p> utf8编码就类是字节型(字节码),长度就是字节数量。我们把unicode字符串的abc天圆地方的转成gbk编码:</p>
  <>之前在祝辞祝辞,s_gbk=, s.encode (& # 39; gbk # 39;)
  在祝辞祝辞,类型(s_gbk)
  & lt; class  & # 39;字节# 39;比;
  在祝辞祝辞,len (s_gbk)
  11
  在祝辞祝辞s_gbk
  b # 39; abc \ \ xcc \ \ xec \ \ xd4 \ \ xb2 \ \ xb5 \ \ xd8 \ \ xb7 \ \ xbd& # 39;
  在祝辞祝辞,打印(s_gbk)
  b # 39; abc \ \ xcc \ \ xec \ \ xd4 \ \ xb2 \ \ xb5 \ \ xd8 \ \ xb7 \ \ xbd& # 39;
  在祝辞祝辞,s_gbk.decode (& # 39; s_gbk& # 39;)
  & # 39;abc天圆地方& # 39;</pre>
  <p> gbk编码也类是字节型(字节码),长度也是字节数量。我们再来看看,不同编码的字节码能否连接:</p>
  <>之前在祝辞祝辞,ss =, s_utf8  + s_gbk
  在祝辞祝辞党卫军
  b # 39; abc \ \ xe5 \ \ xa4 \ \ xa9 \ \ xe5 \ \ x9c \ \ x86 \ \ xe5 \ \ x9c \ \ xb0 \ \ xe6 \ \ x96 \ \ xb9abc \ \ xcc \ \ xec \ \ xd4 \ \ xb2 \ \ xb5 \ \ xd8 \ \ xb7 \ \ xbd& # 39;
  在祝辞祝辞,ss.decode (& # 39; use utf8 # 39;)
  Traceback  (most  recent  call 最后一个):
  ,File “& lt; pyshell # 64的在“,,line  1,拷贝& lt; module>
  ,ss.decode (& # 39; use utf8 # 39;)
  UnicodeDecodeError: & # 39; utf - 8 # 39;, codec 停下来# 39;t  decode  byte  0 xcc 拷贝position  18: invalid  continuation 字节
  在祝辞祝辞,ss.decode (& # 39; gbk # 39;)
  & # 39;abc澶╁渾鍦版柟abc天圆地方& # 39;
  祝辞祝辞祝辞,ss.decode (& # 39; use utf8 # 39;,, & # 39;忽略# 39;)
  & # 39;abc天圆地方abc ? ? & # 39;
  祝辞祝辞祝辞,ss.decode (& # 39; gbk # 39;,, & # 39;忽略# 39;)
  & # 39;abc澶╁渾鍦版柟abc天圆地方& # 39;</pre>
  <p>看以看,出不同编码的字节码可以连接,但一般不能解码成unicode(字符串),除非使用忽略参数。</p><h2 class=Python:一图看懂Python2还是Python3的编码