好的,我有另一个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
输出:
不无
æ-
不
答案 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”,这会给出正确的输出。