print u'\xe4\xf6\xfc'.encode('utf-8')
print unicode(u'\xe4\xf6\xfc')
回溯:
盲枚眉
Traceback (most recent call last):
File "D:\zjm_code\a.py", line 6, in <module>
print unicode(u'\xe4\xf6\xfc')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
python shell
>>>u"äöü".encode('utf-8')
Unsupported characters in input
答案 0 :(得分:12)
在Python 2中:
case a: (unicode object).encode(somecodec) -> string of bytes case b: (string of bytes).decode(somecodec) -> unicode object case c: unicode(string of bytes, somecodec) -> unicode object
案例b和c完全相同。在这三种情况中,您可以省略编解码器名称:然后默认为'ascii'
,ASCII解码器(仅支持128个ASCII字符 - 否则会出现异常)。
每当箭头左侧需要“字符串”时,您可以传递一个unicode对象(使用'ascii'编解码器转换)。
每当箭头左侧需要'unicode'时,你可以传递一串字节(用'ascii'编解码器转换)。
答案 1 :(得分:6)
print unicode(u'\xe4\xf6\xfc')
unicode()
调用此处不执行任何操作,因为它的参数已经是unicode对象。 print
然后尝试输出该unicode对象,并且这样做print
想要将其转换为终端编码中的字符串。但是python似乎并不知道你的终端使用哪种编码,因此选择Ascii的“安全”替代方案。
由于u'\xe4\xf6\xfc'
无法在Ascii中表示,因此会导致编码错误。
通常encode()
将unicode对象转换为具有特定字符编码(如UTF-8或ISO-8859-1)的字符串。每个unicode代码点都转换为该编码中的字节序列:
>>> u'\xe4\xf6\xfc'.encode('utf-8')
'\xc3\xa4\xc3\xb6\xc3\xbc'
相反的是decode()
,它将特定编码中的字符串转换为包含相应unicode代码点的unicode对象。
>>> '\xc3\xa4\xc3\xb6\xc3\xbc'.decode('utf-8')
u'\xe4\xf6\xfc'
print
只打印该字符串的原始字节。如果这导致所需的输出取决于终端的字符编码。
>>> print '\xc3\xa4\xc3\xb6\xc3\xbc' # utf-8 encoding on utf-8 terminal
äöü
>>> print '\xe4\xf6\xfc' # same encoded as latin-1
���
当给定unicode参数时,print
首先尝试在终端编码中对unicode对象进行编码。这只有在python猜测终端的正确编码并且该编码实际上可以代表unicode对象的所有字符时才有效。否则,编码会抛出异常或输出包含错误的字符。
>>> print u'\xe4\xf6\xfc' # it correctly assumes a utf-8 terminal
äöü
答案 2 :(得分:0)
unicode
函数将非unicode(默认情况下,ascii,但它也接受其他编码)转换为unicode。你的错误是你传递的字符串已经是unicode并要求它转换为unicode ...
unicode字符串上的encode
函数将其转换回非unicode编码 - 再次,ascii是默认值。