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

2024-06-07 12:49:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

有人知道我做错了什么吗?


Tags: inmostlineunicodecallutffilelast
3条回答

我想这里到处都是编码/解码混乱。从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'也是拉丁语/ISO-8859-1编码的“äü”。如果您编写一个普通的python字符串(不带将其标记为unicode的前导“u”),则可以使用decode('latin1')将其转换为unicode对象:

>>> '\xe4\xf6\xfc'.decode('latin1')
u'\xe4\xf6\xfc'

我认为你的编码和解码是反向的。您将Unicode编码为字节流,并将字节流解码为Unicode。

Python 2.6.1 (r261:67515, Dec  6 2008, 16:42:21) 
[GCC 4.0.1 (Apple Computer, Inc. build 5370)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> wtf = u'\xe4\xf6\xfc'
>>> wtf
u'\xe4\xf6\xfc'
>>> print wtf
äöü
>>> wtf.encode('UTF-8')
'\xc3\xa4\xc3\xb6\xc3\xbc'
>>> print '\xc3\xa4\xc3\xb6\xc3\xbc'.decode('utf-8')
äöü
>>> wtf = '\xe4\xf6\xfc'
>>> wtf
'\xe4\xf6\xfc'
>>> print wtf
���
>>> print wtf.decode("latin-1")
äöü
>>> wtf_unicode = unicode(wtf.decode("latin-1"))
>>> wtf_unicode
u'\xe4\xf6\xfc'
>>> print wtf_unicode
äöü

相关问题 更多 >

    热门问题