我在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
获得正确的输出?我应该手动构建字节字符串吗?
好像我误会了什么。
发布于 2016-03-04 16:00:17
我想我能理解你发生了什么。最后一行给了我提示,你的垃圾代码点被确认了。您尝试显示cp1251字符,但编辑器被配置为使用utf8。
# -*- coding: cp1251 -*-
解释器仅用于转换ASCII范围之外的源程序Python文件中的字符。无论如何,它只用于unicode垃圾,因为来自原始源的字节给出了.字节字符串中的字节完全相同。有些文本编辑器很好地自动使用这一行(空闲编辑器就是这样),但我对此不太自信,例如,当我使用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 8’。
或者,如果您对当前的编辑器感到满意,您可以这样写:
# -*- 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的Python3.5空闲确认:
>>> 'СЋРЅРёРєРѕРґ'.encode('cp1251').decode('utf8')
'юникод'
发布于 2016-03-05 18:34:35
您的问题是编码声明是错误的:您的编辑器使用utf-8
字符编码来保存源代码。使用来修复.
>>> u'юникод'
u'\u044e\u043d\u0438\u043a\u043e\u0434'
>>> u'юникод'.encode('utf-8')
'\xd1\x8e\xd0\xbd\xd0\xb8\xd0\xba\xd0\xbe\xd0\xb4'
>>> print _.decode('cp1251') # mojibake due to the wrong encoding
СЋРЅРёРєРѕРґ
>>> print u'юникод'
юникод
不要使用字节字符串(''
文本在Python2上创建bytes
对象)来表示文本;使用Unicode字符串 (u''
文字-- unicode
类型)。如果您的代码使用Unicode字符串,那么Windows控制台使用的代码页并不重要,只要选定的字体能够显示相应的(非BMP)字符。请参阅Python, Unicode, and the Windows console
下面是完整的代码,供参考:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print(u'юникод')
注:没有.decode()
,unicode()
。如果使用文字创建字符串;如果字符串包含文本,则应使用Unicode文本。在Python3上,它是唯一的选项,您不能在bytes
文本中放置非ascii字符,而且在Python2上也是一个很好的实践(对文本使用Unicode而不是字节字符串)。
如果某个API将字节字符串作为输入(而不是文字),则其编码与编码声明无关。要使用的特定编码取决于数据的来源。
https://stackoverflow.com/questions/35799809
复制相似问题