Python - 了解bytes、str与unicode的区别

旧城等待, 2022-09-15 14:58 212阅读 0赞

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

  1. 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:

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

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

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

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

常用解决方案:
设置defaultencoding

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

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

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

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

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

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

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

文件头声明编码的作用

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

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

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

个人认为下面这篇文章图文并茂的说明了各种字符的关系,值得仔细阅读一下。

Unicode之痛

发表评论

表情:
评论列表 (有 0 条评论,212人围观)

还没有评论,来说两句吧...

相关阅读

    相关 UnicodeUTF-8区别

    ASCII 编码 在计算机的世界里,信息的表示方式只有 0 和 1,但是我们人类信息表示的方式却与之大不相同,很多时候是用语言文字、图像、声音等传递信息的。 怎样将其转