2017-01-15 2 views
0

В моем сценарии я указал 1251 кодовую страницу. Но Python 2.7.13 выход неправильно показывает некоторые кириллические строки:Кириллические символы в Python 2.7

Программа '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

Просьба выслать фрагменты кода, а не скриншоты. – DyZ

+1

Я сделал это сейчас. –

ответ

0

Для 2.7 вы должны сделать строки unicode строками, используя префикс u. Следующие действия выполняются как в 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'xxxx ') не работал. raw_input необходим в 2.x, чтобы избежать ввода eval.

0

я провожу некоторое время выяснить, как правильно использовать Python 2.7 с не-latin1 кодовыми страницами. Самое легкое решение, которое я нашел, на сегодняшний день, это переход на Python 3. Ничто другое не приходит удаленно близко к нему.

+1

Непосредственно ответ на вопрос, почему это происходит, хотя я должен согласиться. – saeleko

0

Оператор печати в python2 оценивает каждое выражение , разделенное запятыми, в скобках и преобразует их в строку перед ее печатью. Вот почему каждый кириллический символ преобразуется в ASCII, когда вы разделяете значения запятыми.

Что вы можете сделать, это следующее:

import codecs 

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

Или:

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

Убедитесь, что вы имеете следующую строку в верхней части вашего питона скрипт, если вы используете python2.

# -*- coding: utf-8 -*- 
+0

В этом случае мой вывод «ВХОД» ВХОД В СЛУЧАЕ «С ... РѕРґР ° ...». –

+0

@ Андрей, похоже, что UTF-8 там неправильно обнаружен. –

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

Ничего не делать с кириллицы - распечатать заявление Python 2 в не круглые скобки.

Итак, здесь вы печатаете tuple("То же", "самое", "сообщение"), а не строку. Это делает то же самое:

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

Либо удалить скобки, или добавить from __future__ import print_function в верхней части модуля.

+0

Ваше предложение избегает печати ложных круглых скобок, но для меня не решена проблема кодирования для 2.7. См. Мой второй ответ. –

+0

@TerryJanReedy: Нет, его отпечатки, где он печатает одну строчку, отлично работают (так как в этом случае символы не имеют значения, '(" abc ")' точно так же, как '' abc ", но с запятой они становятся кортежами, а затем строки напечатаны как их 'repr()'. _ Строки без запятых печатаются хорошо, поэтому проблема с кодировкой отсутствует. Линии с запятыми печатаются как кортежи, потому что они есть. Ничего общего с пробелами. – RemcoGerlich

0

Короткий ответ: Если вы хотите печатать символы, отличные от ascii, или те, которые указаны в вашей кодовой странице по умолчанию в Windows, используйте 3,6+. Объяснение ниже.

Для правильного чтения файла объявление кодировки должно соответствовать фактической кодировке байтов в файле. Если вы используете ограниченную (не-utf) кодировку и хотите печатать строки в командной строке, также должны соответствовать ограниченная кодировка и консольная кодировка. Вернее, подмножество юникода, которое вы пытаетесь распечатать, должно быть включено в подмножество, которое консоль примет.

В этом случае, если вы объявите кодировку как 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 всегда работала для всех базовых многоязычных плоскостей (подмножество BMP) для юникода. Не работает для более высоких кодовых точек - это ток ограничение tk и, следовательно, tkinter, который использует IDLE.)

+0

Не имеет ничего общего с его проблемой, он может отлично печатать кириллицу. – RemcoGerlich

+0

@RemcoGerlich Нельзя печатать кириллицу на консоль Windows, не имея на пульте управления кириллической или utf-кодовой страницы. С 3.x код работает, потому что он печатает на консоли IDLE, который фактически использует кодовую страницу «BMP». С 3,6 код работает в консоли, потому что он переключен на uft_8. –

+0

Да, но, по-видимому, у него это получилось, так как он работает нормально. Его проблема заключается в использовании печати в качестве функции n в Python 2, не имеет ничего общего с кодировкой. – RemcoGerlich

Смежные вопросы