单独无法使用的Unicode字符,Python

1 投票
1 回答
838 浏览
提问于 2025-04-17 05:42

好的,我遇到了一个关于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”,这样才能得到正确的输出。

撰写回答