1
imn1 2015-06-21 17:55:12 +08:00
ascii 是0-127
latin-1是 0-255 |
2
lilydjwg 2015-06-21 17:57:58 +08:00
U 是 Unicode 字符串,没有编码一说。当 str 和 unicode 相加时,Python 2 尝试将 str 以 ASCII 解码,所以出错了。
|
3
Sylv 2015-06-21 18:02:41 +08:00 1
S 是 latin-1 编码的 str 类型字符串
U 是 unicode 类型字符串,存储的不是编码,而是码点 S + U:是一个 str 类型字符串加一个 unicode 类型字符串,类型不一致,所以 Python 会把 str 类型的 S 用默认编码 ascii 转换为 unicode 类型。因此 S + U 等价于:S.decode('ascii') + U。 而字符串 S 是不能用 ascii 编码转换为 unicode 的,要用 latin-1编码: >>> S.decode('ascii') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 1: ordinal not in range(128) >>> S.decode('latin-1') u'A\xc4B\xe8C' 因此想要不报错需要: S.decode('latin-1') + U |
4
onlyice 2015-06-21 18:09:20 +08:00 via Android
楼上正解
|
5
Sylv 2015-06-21 18:18:16 +08:00
另:'\xC4' 不是 4 个字符,而是 1 个字符,其编码值为 16 进制的 C4,也就是 10 进制的 196。如一楼所说,ascii 编码的范围是 0-127,所以 '\xC4' 并不在 ascii 编码范围内,那么 S 编码类型就不会是 ascii。
|
7
Sylv 2015-06-21 19:40:51 +08:00 via iPhone
|
8
shuax 2015-06-21 20:00:18 +08:00
每个用python的人,都被编码折磨过
|
9
fengjianxinghun 2015-06-25 11:42:16 +08:00
python2唯一坑爹的地方就是str 和unicode这里。。。。
|