在Python 2.7x中调用u'\1234'.decode('utf-8')是什么意思?
今天早上,一个同事问了我这个问题,我一时没法给出合理的答案。Stack Overflow上有几个相关的回答,但我没找到能具体解答这个问题的。
如果我在64位的Ubuntu 12.04上用2.7版本的解释器运行这个代码,我得到的结果是:
>>> u'\u1234'.decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u1234' in position 0: ordinal not in range(128)
关于这个话题,Python的文档提到,Python把Unicode字符串表示为16位或32位的整数。当用utf-8解码时,Python是否尝试像处理8位字符那样读取这些整数?如果是这样,为什么会出现UnicodeEncodeError而不是UnicodeDecodeError的错误呢?
我希望能更好地理解这个问题。当对一个Unicode字符串调用解码时,具体都发生了什么步骤?对于一个已经从utf-8编码解码过的字符串,再用utf-8解码的意义对我来说不是很清楚。
2 个回答
1
调用 decode
方法时,它会尝试把一个字符串从指定的编码转换成默认的编码。在你的例子中,默认编码是ASCII,而ASCII无法表示'\u1234'这个字符。
6
这是一个Python 2中的小问题。当你对一个Unicode字符串使用decode时,它首先会用默认的编码方式把这个字符串“编码”一次,然后再用你指定的编码方式“解码”。因为默认的编码方式通常是ASCII,所以你会看到那个错误信息。