字符串是个相当简单的概念:一个字符串是一个字符序列。问题出在"字符"的定义上。
在2015 年,"字符"的最佳定义是Unicode字符。因此,从Python 3 的str对象中获取 的元素是Unicode字符
Unicode 标准把字符的标识和具体的字节表述进行了如下的明确区分。
字符的标识,即码位,是0~1 114 111的数字(十进制),在Unicode标准中以4~6个十六进制数字表示,而且加前缀U+。例如,字母A的码位是U+0041,欧元符号的码位是U+20AC,高音谱号的码位是U+1D11E. 在Unicode 6.3标准中,约10% 的有效码位有对应的字符。
字符的具体表述取决于所用的编码。编码是在码位和字节序列之间转换时使用的算法。在UTF-8编码中,A(U+0041)的码位编码成单个字节\x41,而在UTF-16LE编码中编码成两个字节\x41\x00。再举个例子,欧元符号(U+20AC)在UTF-8编码中是三个字节——\xe2\x82\xac,而在UTF-16LE中编码成两个字节:\xac\x20.
把码位转换成字节序列的过程是编码,使用encode;把字节序列转换成码位的过程是解码,使用decode.
非英语用户常常会搞反所谓的编码解码,可以这样理解: 把Unicode字符串想成“人类可读”的文本.那么,
把字节序列变成人类可读的文本字符串就是解码
而把字符串变成用于存储或传输的字节序列就是编码
所以,我们在做爬虫的时候,遇到乱码的情况,可以先去看看编码格式是否正确!