在Python 2.7x中调用u'\1234'.decode('utf-8')是什么意思?

1 投票
2 回答
962 浏览
提问于 2025-04-18 06:01

今天早上,一个同事问了我这个问题,我一时没法给出合理的答案。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,所以你会看到那个错误信息。

撰写回答