本人以前就经常搞不清楚utf-8、unicode、字符串、二进制序列、编码、解码这几个之间的关系,趁今天有时间,赶紧写篇文章巩固这几个概念,免得以后又搞混了。
字符串是什么?
字符串就是字符序列,说得更通俗点,一串字符就是字符串。问题在于该如何给字符下定义?
2015年开始,“字符”的最好定义就是Unicode字符。python3的str对象里获取的元素就是unicode字符。
Unicode标准把字符的标识和具体的字节表述进行了明确的区分。
* 字符的标识,即码位,是 0~1 114 111 的数字(十进制),在 Unicode 标准中以 4~6 个
十六进制数字表示,而且加前缀“U+”。例如,字母 A 的码位是 U+0041,欧元符号的
码位是 U+20AC,高音谱号的码位是 U+1D11E。在 Unicode 6.3 中(这是 Python 3.4 使
用的标准),约 10% 的有效码位有对应的字符。
* 字符的具体表述取决于所用的编码。编码是在码位和字节序列之间转换时使用的算法。
在 UTF-8 编码中,A(U+0041)的码位编码成单个字节 \x41,而在 UTF-16LE 编码中
编码成两个字节 \x41\x00。再举个例子,欧元符号(U+20AC)在 UTF-8 编码中是三个
字节——\xe2\x82\xac,而在 UTF-16LE 中编码成两个字节:\xac\x20
把码位(Unicode字符)转换成具体字节的过程叫编码encode;把字节转换成码位(Unicode)的过程叫解码decode。
1 s = "中国人" 2 print(type(s)) 3 #对Unicode字符串编码 4 bs = s.encode("utf-8") 5 #解码 6 print(bs.decode())
为了方便自己记忆,可以把字节序列想象成机器可以理解的二进制,Unicode字符串当成人类可以读的文本字串,那么吧二进制转换成人类可读的文本就是解码,把人类可读的文本转换成二进制进行存储或者网络传输的过程就是编码。