Skip to main content
 首页 » 编程设计

python之Windows 上带有 cp1251 和 utf-8 的 Unicode

2025年05月04日16Free-Thinker

我正在 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') 
'юникод'