Как отобразить utf-8 в консоли Windows - PullRequest
14 голосов
/ 26 августа 2010

Я использую 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()

Ответы [ 4 ]

15 голосов
/ 10 марта 2012

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

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

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

В Python 3.6 больше нет необходимости даже использовать команду chcp, поскольку Python полностью обходит интерфейс консоли байтового уровня и вместо него использует собственный интерфейс Unicode.См. PEP 528: измените кодировку консоли Windows на UTF-8 .

Как отмечено в комментариях @ mbom007, также важно убедиться, что консоль настроена с использованием шрифта, который поддерживаетсимволы, которые вы пытаетесь отобразить.

9 голосов
/ 27 августа 2010

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

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

6 голосов
/ 09 января 2011

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

3 голосов
/ 27 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...