unicode'与'encode'之间的关系是什么
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 个回答
编码错误:
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
äöü
在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'编码进行转换)。