'unicode'和'encode'之间有什么关系

时间:2010-01-08 02:17:51

标签: python unicode

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

3 个答案:

答案 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中表示,因此会导致编码错误。

Unicode,编码和解码:

通常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)

the tutorialunicode howto

涵盖了这一点

unicode函数将非unicode(默认情况下,ascii,但它也接受其他编码)转换为unicode。你的错误是你传递的字符串已经是unicode并要求它转换为unicode ...

unicode字符串上的encode函数将其转换回非unicode编码 - 再次,ascii是默认值。