在Windows上使用cp1251和utf-8的Unicode

xiº*_*xiº 1 python unicode encoding python-2.7

我正在玩unicodepython.

所以有一个简单的脚本:

# -*- coding: cp1251 -*-

print '??????'.decode('cp1251')
print unicode('??????', 'cp1251')
print unicode('??????', 'utf-8')
Run Code Online (Sandbox Code Playgroud)

在cmd中我已将编码切换为Active code page: 1251.

还有输出:

????????????
????????????
??????
Run Code Online (Sandbox Code Playgroud)

我有点困惑.

由于我已经指定了编码,cp1251我希望它能被正确解码.

但结果是有一些垃圾代码点被解释.据我所知,这'??????'只是一个字节: '\xd1\x8e\xd0\xbd\xd0\xb8\xd0\xba\xd0\xbe\xd0\xb4'.

但有一种方法可以在终端中获得正确的输出cp1251?我应该手动构建字节字符串吗?

好像我误解了一些东西.

Ser*_*sta 5

我想我能理解你发生了什么事.最后一行给了我一个暗示,你的垃圾代码点已经确认.您尝试显示cp1251字符但编辑器配置为使用utf8.

# -*- coding: cp1251 -*-仅用于由Python解释器的字符从作为外部ASCII范围的源蟒文件转换.无论如何它只用于unicode litterals,因为来自原始源的字节给出了字节字符串中完全相同的字节.一些文本编辑器非常友好地自动使用这一行(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')
Run Code Online (Sandbox Code Playgroud)

并在配置为使用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')
Run Code Online (Sandbox Code Playgroud)

应该给出相同的结果 - 但现在声明的源编码应该是python源的实际编码.


BTW,原生使用unicode的Python 3.5 IDLE证实:

>>> '????????????'.encode('cp1251').decode('utf8')
'??????'
Run Code Online (Sandbox Code Playgroud)