在我的脚本中,我指出了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 для выхода...
之前我读过this和this主题,但它对我没有帮助。我试过这样的变种:
# -*- 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 для выхода...")
答案 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使用。)