首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在windows上使用cp1251和utf-8的Unicode

在windows上使用cp1251和utf-8的Unicode
EN

Stack Overflow用户
提问于 2016-03-04 15:29:32
回答 2查看 5.8K关注 0票数 1

我在python中玩unicode

所以有一个简单的脚本:

代码语言:javascript
运行
复制
# -*- coding: cp1251 -*-

print 'юникод'.decode('cp1251')
print unicode('юникод', 'cp1251')
print unicode('юникод', 'utf-8')

在cmd中,我已经将编码转换为Active code page: 1251

这是输出:

代码语言:javascript
运行
复制
СЋРЅРёРєРѕРґ
СЋРЅРёРєРѕРґ
юникод

我有点糊涂。

由于我已经将编码指定为cp1251,所以我希望它将被正确解码。

但结果是有一些垃圾代码点被解释了。我理解'юникод'只是一个字节,如:'\xd1\x8e\xd0\xbd\xd0\xb8\xd0\xba\xd0\xbe\xd0\xb4'

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

好像我误会了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-04 16:00:17

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

# -*- coding: cp1251 -*-解释器仅用于转换ASCII范围之外的源程序Python文件中的字符。无论如何,它只用于unicode垃圾,因为来自原始源的字节给出了.字节字符串中的字节完全相同。有些文本编辑器很好地自动使用这一行(空闲编辑器就是这样),但我对此不太自信,例如,当我使用gvim时,总是会手动地将切换到正确的编码。短篇小说:# -*- coding: cp1251 -*-在您的代码中未使用,并且只会误导读者,因为它不是实际的编码。

如果您想确定源中的内容,最好使用显式转义。在代码页1251中,单词юникод由以下字符组成:'\xfe\xed\xe8\xea\xee\xe4'

如果您编写此源:

代码语言:javascript
运行
复制
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’。

或者,如果您对当前的编辑器感到满意,您可以这样写:

代码语言:javascript
运行
复制
# -*- 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空闲确认:

代码语言:javascript
运行
复制
>>> 'СЋРЅРёРєРѕРґ'.encode('cp1251').decode('utf8')
'юникод'
票数 5
EN

Stack Overflow用户

发布于 2016-03-05 18:34:35

您的问题是编码声明是错误的:您的编辑器使用utf-8字符编码来保存源代码。使用来修复.

代码语言:javascript
运行
复制
>>> 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

下面是完整的代码,供参考:

代码语言:javascript
运行
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print(u'юникод')

注:没有.decode()unicode()。如果使用文字创建字符串;如果字符串包含文本,则应使用Unicode文本。在Python3上,它是唯一的选项,您不能在bytes文本中放置非ascii字符,而且在Python2上也是一个很好的实践(对文本使用Unicode而不是字节字符串)。

如果某个API将字节字符串作为输入(而不是文字),则其编码与编码声明无关。要使用的特定编码取决于数据的来源。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35799809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档