Python2 和 python3 的 unicode 与 str 总结

python 的编码问题,应该每一个写python代码的童鞋都被困扰过。
别外python2 和 python3 的默认编码又不同,所以弄清楚还是有必要的,不然在网上搜一堆答案一个一个试,还是挺浪费时间的。
首先,python 2.x 的 str

s = "我不是乱码"

s是个字符串,它本身存储的就是字节码(bytes)。
那么这个字节码是什么格式的?
如果这段代码是在解释器上输入的,那么这个s的格式就是解释器的编码格式,对于windows的cmd而言,就是gbk。
如果将段代码是保存后才执行的,比如存储为utf-8,那么在解释器载入这段程序的时候,就会将s初始化为utf-8编码。
python 2.x 的 unicode
我们知道unicode是一种编码标准,具体的实现标准可能是utf-8,utf-16,gbk ……
python 在内部使用两个字节来存储一个unicode,使用unicode对象而不是str的好处,就是unicode方便于跨平台。
你可以用如下两种方式定义一个unicode:

s1 = u"我不是乱码" 
s2 = unicode("我不是乱码", "utf-8")

可以通过 encode与decode 进行转换。

但Python 2 悄悄掩盖了 byte 到 unicode 的转换,让程序在处理 ASCII 的时候更加简单。你付出的代价就是在处理非 ASCII 的时候将会失败。

我们经常碰到错误是 UnicodeDecodeError: ‘ascii’ codec can’t decode byte ……

常用解决方案:
设置defaultencoding

reload(sys) sys.setdefaultencoding('utf-8')

如果你在python中进行编码和解码的时候,不指定编码方式,那么python就会使用defaultencoding。

比如上一节例子中将str编码为另一种格式,就会使用defaultencoding。

s.encode("utf-8") 等价于 s.decode(defaultencoding).encode("utf-8")

再比如你使用str创建unicode对象时,如果不说明这个str的编码格式,那么程序也会使用defaultencoding。

u = unicode("人生苦短") 等价于 u = unicode("人生苦短",defaultencoding)

默认的defaultcoding:ascii是许多错误的原因,所以早早的设置defaultencoding是一个好习惯。

文件头声明编码的作用

顶部的:# –– coding: utf-8 –-目前看来有三个作用。

  1. 如果代码中有中文注释,就需要此声明
  2. 比较高级的编辑器(比如我的emacs),会根据头部声明,将此作为代码文件的格式。
  3. 程序会通过头部声明,解码初始化 u’人生苦短’,这样的unicode对象,(所以头部声明和代码的存储格式要一致)

在python3 中
Python 3 也有两种类型,一个是 str(unicode),一个是 byte 码。但是它们有不同的命名。 type(变量)

Python 3 中对 Unicode 支持的最大变化就是没有对 byte 字符串的自动解码。如果你想要用一个 byte 字符串和一个 unicode 相连接的话,你会得到一个错误,不管包含的内容是什么。
可以简单理解为:
python2 中的unicode -> python3 的str
python2 中的str-> python3 的byte

个人认为下面这篇文章图文并茂的说明了各种字符的关系,值得仔细阅读一下。
http://pycoders-weekly-chinese.readthedocs.io/en/latest/issue5/unipain.html

参考:
http://python.jobbole.com/81244/

    原文作者:昵称诚诚
    原文地址: https://blog.csdn.net/jobschen/article/details/79805955
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞