单独无法使用的Unicode字符,Python
好的,我遇到了一个关于Python的Unicode问题。在Windows 7的IDLE环境中,以下代码:
uni = u"\u4E0D\u65E0"
binary = uni.encode("utf-8")
print binary
能正确显示两个汉字,不无。但是,如果我把第一行替换成
uni = u"\u65E0"
也就是只保留第二个字符,它就显示成了æ—。不过如果我只保留第一个字符
u"\u4E0D"
它又能正确输出不。
这是个bug吗,还是我哪里做错了?
完整代码:
uni = u"\u4E0D\u65E0"
binary = uni.encode("utf-8")
print binary
uni = u"\u65E0"
binary = uni.encode("utf-8")
print binary
uni = u"\u4E0D"
binary = uni.encode("utf-8")
print binary
输出结果:
不无
æ—
不
1 个回答
4
这个unicode字符串 u"\u4E0D\u65E0"
由两个文字字符组成,分别是 不
和 无
。
当一个unicode字符串被编码时,它会被转换成一串 字节(不是二进制的那种)。根据使用的编码方式,文字字符和字节之间可能没有一一对应的关系。比如“utf8”编码,一个字符可能会用一到三个字节来表示:
>>> u'\u65E0'.encode('utf8')
'\xe6\x97\xa0'
现在,在一串字节被 打印 之前,python(或者IDLE)需要尝试解码它。但因为它不知道使用了什么编码,所以只能猜测。出于某种原因,IDLE似乎错误地猜测了“cp1252”作为其中一个例子的编码:
>>> text = u'\u65E0'.encode('utf8').decode('cp1252')
>>> text
u'\xe6\u2014\xa0'
>>> print text
æ—
注意,text
中有 三个 字符——最后一个是一个不换行的空格。
编辑
严格来说,IDLE对所有三个例子都错误地猜测了“cp1252”。第二个例子之所以“成功”,是因为每个字节恰好对应一个有效的文字字符(“cp1252”是一种8位的单字节编码)。而其他两个例子中包含了字节 \x8d
,这个在“cp1252”中是没有定义的。对于这些情况,IDLE最终会退回到“utf8”,这样才能得到正确的输出。