1
imn1 2015 年 6 月 21 日
ascii 是0-127
latin-1是 0-255 |
2
lilydjwg 2015 年 6 月 21 日
U 是 Unicode 字符串,没有编码一说。当 str 和 unicode 相加时,Python 2 尝试将 str 以 ASCII 解码,所以出错了。
|
3
Sylv 2015 年 6 月 21 日 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 年 6 月 21 日 via Android
楼上正解
|
5
Sylv 2015 年 6 月 21 日
另:'\xC4' 不是 4 个字符,而是 1 个字符,其编码值为 16 进制的 C4,也就是 10 进制的 196。如一楼所说,ascii 编码的范围是 0-127,所以 '\xC4' 并不在 ascii 编码范围内,那么 S 编码类型就不会是 ascii。
|
7
Sylv 2015 年 6 月 21 日 via iPhone
|
8
momo1999 2015 年 6 月 21 日
每个用python的人,都被编码折磨过
|
9
fengjianxinghun 2015 年 6 月 25 日
python2唯一坑爹的地方就是str 和unicode这里。。。。
|