python - 无法在 os x terminal.app 的 python 中解码 utf-8 字符串

标签 python macos unicode terminal

我将 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/

相关文章:

c# - P/Invoke 在 C# 和非托管 DLL 之间编码和解码二维数组、结构和指针

python - 使用 Python 从批处理文件中获取退出代码

mysql - 如何使用 web2py (mySQL) 插入 4 字节 unicode 字符?

python - 在未安装 python 的情况下将 python 作为 .exe 文件运行

Python:将灰度图像转换为 RGB

java - Ant 使用错误的 Java 版本

macos - 我的 MacOS 应用程序的数据库位于哪里?

macos - undefined symbol : "boost::system::generic_category()" Cmake and boost setup

Django 模型 __unicode__ 在记录时引发异常

unicode - 在 Sublime Text 2 中搜索转义字符