我将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对象开始:
这是一个unicode对象,三个字符是“äü”的unicode代码点。如果要将它们转换为Utf-8,则必须对它们进行编码:
由此产生的六个字符是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对象:我认为你的编码和解码是反向的。您将Unicode编码为字节流,并将字节流解码为Unicode。
相关问题 更多 >
编程相关推荐