不能单独使用的Unicode字符,Python

时间:2011-11-05 16:32:47

标签: python unicode

好的,我有另一个Python Unicode问题。在IDLE窗口7中,以下代码:

uni = u"\u4E0D\u65E0"
binary = uni.encode("utf-8")
print binary

打印两个汉字,不无,正确的。但是,如果我用

替换第一行
uni = u"\u65E0"

即只有第二个字符,它打印æ-而不是。如果我只用第一个字符

替换它,那该怎么办?
u"\u4E0D"

它给出了正确的输出

这是一个错误,或者我做错了什么?

完整代码:

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 个答案:

答案 0 :(得分:4)

unicode字符串u"\u4E0D\u65E0"由两个文本字符组成。

对unicode字符串进行编码时,会将其转换为 bytes (非二进制)序列。根据使用的编码,可能没有文本字符与字节的一对一映射。例如,“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”,这会给出正确的输出。