我将 terminal.app 设置为接受 utf-8,在 bash 中我可以输入 unicode 字符,复制并粘贴它们,但是如果我启动 python shell 我不能,如果我尝试解码 unicode 我会收到错误消息:
>>> wtf = u'\xe4\xf6\xfc'.decode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
>>> wtf = u'\xe4\xf6\xfc'.decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
有人知道我做错了什么吗?
最佳答案
我认为到处都是编码/解码困惑。您从一个 unicode 对象开始:
u'\xe4\xf6\xfc'
这是一个 unicode 对象,三个字符是“äöü”的 unicode 代码点。如果你想把它们变成 Utf-8,你必须对它们进行编码:
>>> u'\xe4\xf6\xfc'.encode('utf-8')
'\xc3\xa4\xc3\xb6\xc3\xbc'
生成的六个字符是“äöü”的 Utf-8 表示。
如果您调用 decode(...)
,您会尝试将字符解释为仍需要转换为 unicode 的某种编码。因为它已经是 Unicode,所以这是行不通的。您的第一个调用尝试 Ascii 到 Unicode 的转换,第二个调用尝试 Utf-8 到 Unicode 的转换。由于 u'\xe4\xf6\xfc'
既不是有效的 Ascii 也不是有效的 Utf-8,因此这些转换尝试失败。
进一步的混淆可能来自于 '\xe4\xf6\xfc'
也是“äöü”的 Latin1/ISO-8859-1 编码这一事实。如果您编写一个普通的 python 字符串(没有将其标记为 unicode 的前导“u”),您可以使用 decode('latin1')
将其转换为 unicode 对象:
>>> '\xe4\xf6\xfc'.decode('latin1')
u'\xe4\xf6\xfc'
关于python - 无法在 os x terminal.app 的 python 中解码 utf-8 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/792017/