我正在 python 中使用 unicode。
所以有一个简单的脚本:
# -*- coding: cp1251 -*-
print 'юникод'.decode('cp1251')
print unicode('юникод', 'cp1251')
print unicode('юникод', 'utf-8')
在 cmd 中,我已将编码切换为 Active code page: 1251。
还有输出:
СЋРЅРёРєРѕРґ
СЋРЅРёРєРѕРґ
юникод
我有点困惑。
因为我已将编码指定为 cp1251,所以我希望它能被正确解码。
但结果是解释了一些垃圾代码点。 我知道 'юникод' 只是一个字节,例如: '\xd1\x8e\xd0\xbd\xd0\xb8\xd0\xba\xd0\xbe\xd0\xb4'。
但是有一种方法可以使用 cp1251 在终端中获得正确的输出吗? 我应该手动构建字节串吗?
我好像误会了什么。
请您参考如下方法:
我想我能理解你发生了什么事。最后一行给了我提示,您的垃圾代码点已确认。您尝试显示 cp1251 字符,但您的编辑器配置为使用 utf8。
# -*- coding: cp1251 -*- 仅供 Python 解释器用来转换源 python 文件中超出 ASCII 范围的字符。无论如何,它仅用于 unicode 乱码,因为来自原始源的字节给出了错误……字节字符串中的字节完全相同。一些文本编辑器很友好地自动使用这一行(IDLE 编辑器是),但我对此没有信心,并且总是在我使用 gvim 时手动切换到正确的编码。短篇小说:# -*- coding: cp1251 -*- 在您的代码中未使用,只能误导读者,因为它不是实际编码。
如果您想确定源代码中的内容,最好使用显式转义符。在代码页 1251 中,这个单词 юникод 由这些字符组成:'\xfe\xed\xe8\xea\xee\xe4'
如果你写这个来源:
txt = '\xfe\xed\xe8\xea\xee\xe4'
print txt
print txt.decode('cp1251')
print unicode(txt, 'cp1251')
print unicode(txt, 'utf-8')
并在配置为使用 CP1251 字符集的控制台中执行它,前三行将输出 юникод,最后一行将抛出 UnicodeDecodeError 异常,因为输入不再有效 'utf8'。
或者,如果您对当前的编辑感到满意,您可以这样写:
# -*- coding: utf8 -*-
txt = 'юникод'.decode('utf8').encode('cp1251') # or simply txt = u'юникод'.encode('cp1251')
print txt
print txt.decode('cp1251')
print unicode(txt, 'cp1251')
print unicode(txt, 'utf-8')
应该给出相同的结果 - 但现在声明的源编码应该是 python 源的实际编码。
顺便说一句,原生使用 unicode 的 Python 3.5 IDLE 确认:
>>> 'СЋРЅРёРєРѕРґ'.encode('cp1251').decode('utf8')
'юникод'
