unicode'与'encode'之间的关系是什么

1 投票
3 回答
5239 浏览
提问于 2025-04-15 17:46
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的命令行界面

>>>u"äöü".encode('utf-8')
Unsupported characters in input

3 个回答

0

这个内容在教程unicode指南中都有讲解。

unicode函数的作用是把非unicode的字符串(默认是ascii,但也可以接受其他编码)转换成unicode格式。你这里出错的地方是,你传入的字符串已经是unicode格式了,结果还想让它再转换成unicode……

而在unicode字符串上使用encode函数,则是把它转换回非unicode的编码格式——同样,默认是ascii。

7

编码错误:

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
���

如果给 print 一个unicode参数,它会首先尝试用终端的编码来编码这个unicode对象。只有当python正确猜测了终端的编码,并且该编码能够表示unicode对象中的所有字符时,这才有效。否则,编码会抛出异常,或者输出的内容会包含错误的字符。

>>> print u'\xe4\xf6\xfc'             # it correctly assumes a utf-8 terminal
äöü
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'编码进行转换)。

撰写回答