Как отобразить utf-8 в консоли Windows

Я использую Python 2.6 на Windows 7

Я заимствовал у меня код: Python, Unicode и консоль Windows

Моя цель - отображать строки uft-8 в консоли Windows.

Как явствует из python 2.6,

sys.setdefaultencoding()

больше не поддерживается

Тем не менее, я написал reload (sys), прежде чем попытался его использовать, и это волшебным образом не ошибкой.

Этот код НЕ будет ошибкой, но он отображает смешные символы вместо японского текста. Я считаю, проблема в том, что я не успешно изменил кодовую страницу консоли Windows.

Это мои попытки, но они не работают:

reload(sys)
sys.setdefaultencoding('utf-8')

print os.popen('chcp 65001').read()

sys.stdout.encoding = 'cp65001'

Возможно, вы можете использовать win32console для изменения кодовой страницы? Я пробовал код с сайта, который я связал, но он также ошибочен с win32console.. возможно, этот код устарел.

Здесь мой код, который не вызывает ошибку, но печатает смешные символы:

#coding=<utf8>
import os
import sys
import codecs



reload(sys)
sys.setdefaultencoding('utf-8')
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)

#print os.popen('chcp 65001').read()
print(sys.stdout.encoding)
sys.stdout.encoding = 'cp65001'
print(sys.stdout.encoding)

x = raw_input('press enter to continue')

a = 'こんにちは世界'#.decode('utf8')
print a

x = raw_input()

Ответы

Ответ 1

Я знаю, что вы заявляете, что используете Python 2.6, но если вы можете использовать Python 3.3, вы обнаружите, что это наконец поддерживается.

Используйте команду chcp 65001 перед запуском Python.

См. http://docs.python.org/dev/whatsnew/3.3.html#codecs

Ответ 2

Никогда никогда не используйте setdefaultencoding. Если вы хотите написать строки unicode в stdio, закодируйте их явно. Обезвреживание с помощью setdefaultencoding приведет к тому, что модули stdlib и сторонние модули сломаются ужасно тонкими способами, разрешив неявное преобразование между str и unicode, когда этого не произойдет.

Да, проблема скорее всего в том, что ваша кодовая страница настроена неправильно. Однако использование os.popen не изменит кодовую страницу; он создаст новую оболочку, изменит ее кодовую страницу и сразу же выйдет, не затрагивая вашу консоль вообще. Я лично не очень хорошо знаком с окнами, поэтому я не мог сказать вам, как изменить свою кодовую страницу консоли из вашей программы python.

Способ корректного отображения данных Unicode через utf-8 из python, как упоминалось ранее, заключается в явном кодировании ваших строк перед их печатью: print s.encode('utf-8')

Ответ 3

Изменение кодовой страницы консоли не нужно и не будет работать (в частности, установив ее на 65001 в ошибка Python), Подробнее см. этот вопрос и о том, как печатать символы Unicode на консоли независимо от кодовой страницы.

Ответ 4

Windows не поддерживает UTF-8 в консоли должным образом. Единственный способ, с помощью которого я могу показать японский язык в консоли, - это изменить (на XP) региональные и языковые параметры панели управления, вкладку "Дополнительно", "Язык для программ, не поддерживающих Unicode", на японский язык. После перезагрузки откройте консоль и запустите "chcp", чтобы узнать японскую кодовую страницу консоли. Затем либо печатайте строки Unicode, либо строки байтов, явно закодированные на правильной кодовой странице.