Python 2.7中的西里尔字符

时间:2017-01-15 07:51:40

标签: python python-2.7

在我的脚本中,我指出了1251代码页。但是Python 2.7.13输出错误地显示了一些西里尔字符串:

Программа 'Game Over' 2.0
('\xd2\xee \xe6\xe5', '\xf1\xe0\xec\xee\xe5', '\xf1\xee\xee\xe1\xf9\xe5\xed\xe8\xe5')
('\xd2\xee\xeb\xfc\xea\xee', '\xf7\xf3\xf2\xfc-\xf7\xf3\xf2\xfc', '\xef\xee\xe1\xee\xeb\xfc\xf8\xe5')
оно...

       GAME OVER




Нажмите Enter для выхода...

之前我读过thisthis主题,但它对我没有帮助。我试过这样的变种:

# -*- coding: utf-8 -*-
# -*- coding: cp1251 -*-

为什么会发生这种情况?如何解决?

同时,Python 3.6.0输出正确写入所有西里尔字符,即使没有代码页指向

Программа 'Game Over' 2.0
То же самое сообщение
Только чуть-чуть побольше
оно...

       GAME OVER




Нажмите Enter для выхода...

我的代码:

# coding: cp1251
# game_over.py
# © Andrey Bushman, 2017

print("Программа 'Game Over' " + "2.0")
print("То же", "самое", "сообщение")
print("Только", "чуть-чуть", "побольше")
#print("Вот", end=" ")
print("оно...")

print("""
       GAME OVER
      """)
print("\a")
input("\n\nНажмите Enter для выхода...")

5 个答案:

答案 0 :(得分:1)

print("То же", "самое", "сообщение")

与Cyrillic无关 - Python 2的print语句没有括号。

所以,你在这里打印元组 ("То же", "самое", "сообщение"),而不是字符串。这也是做同样的事情:

tmp = ("То же", "самое", "сообщение")
print tmp

删除括号,或在模块顶部添加from __future__ import print_function

答案 1 :(得分:1)

对于2.7,您应该使用u前缀使字符串成为unicode字符串。以下内容适用于IDLE和控制台(当控制台代码页设置为1251且chcp 1251时)。

# coding: utf_8
# game_over.py
# Andrey Bushman, 2017
from __future__ import print_function

print(u"Программа 'Game Over' 2.0"
      )
print (u"То же самое сообщение")
print(u"Только чуть-чуть побольше")
print(u"оно...")

print("""
       GAME OVER
      """)
print(u"\n\nНажмите Enter для выхода...", end='')
a = raw_input()

我将提示和输入分开,因为输入(u&#39; xxxx&#39;)无效。 <2.}}在2.x中需要raw_input来避免输入。

答案 2 :(得分:0)

我花了很多时间弄清楚如何在非latin1代码页中正确使用Python 2.7。到目前为止,我发现最简单的解决方案是切换到Python 3.没有其他任何东西可以远离它。

答案 3 :(得分:0)

python2中的print语句评估括号内的每个逗号分隔的表达式,并在打印之前将它们转换为字符串。这就是为什么当用逗号分隔值时,每个西里尔字符都会转换为ASCII。

您可以做的是:

import codecs

text = ("То же", "самое", "сообщение")
for i in text:
    (codecs.decode(i, 'utf-8'))

或者:

text = ("То же", "самое", "сообщение")
print(' '.join(text))

如果您使用的是python2,请确保在python脚本的顶部有以下行。

# -*- coding: utf-8 -*-

答案 4 :(得分:0)

简答:如果要打印除ascii之外的字符或Windows上默认代码页中的字符,请使用3.6+。以下说明。

要正确读取文件,编码声明必须与文件中字节的实际编码相匹配。如果您使用有限(非utf)编码并希望将字符串打印到命令提示符,则有限编码和控制台编码也应匹配。或者更确切地说,您尝试打印的unicode子集必须包含在控制台将接受的子集中。

在这种情况下,如果您将编码声明为cp1251并使用IDLE保存,则IDLE似乎会使用该编码进行保存。根据定义,文件中唯一的字符必须位于cp1251子集中。打印这些字符时,控制台必须至少接受相同的子集。您可以通过运行chcp 1251作为命令使命令提示符接受俄语。 (chcp == CHange CodePage。)警告:此命令仅影响当前的命令提示符窗口。无论如何,通过匹配编码声明和控制台代码页,我让你的代码在控制台中的2.7,3.5和3.6 上运行(但不在IDLE 2.7中)。但是,当然,您的代码生成的非ascii,非西里尔字母将无法打印。

在3.x中,Python期望默认情况下代码为utf_8。对于3.6,Python的Windows控制台界面被重写,以便将控制台置于utf_8模式。因此,在编辑器中编写代码,将其保存为utf_8,正如您所注意到的,在Windows中打印到控制台的工作方式是3.6。 (在3.x中,打印到IDLE的shell一直适用于unicode的所有基本多语言平面(BMP子集)。不适用于更高的代码点是tk的当前限制因此tkinter,IDLE使用。)