Как отобразить 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()
4 ответа
Я знаю, что вы заявляете, что используете Python 2.6, но если вы сможете использовать Python 3.3, вы обнаружите, что это наконец поддерживается.
Используйте команду chcp 65001
перед запуском Python.
См. http://docs.python.org/dev/whatsnew/3.3.html
В Python 3.6 больше нет необходимости использовать chcp
команда, поскольку Python полностью обходит интерфейс консоли байтового уровня и использует вместо этого собственный интерфейс Unicode. См. PEP 528. Изменение кодировки консоли Windows на UTF-8.
Как отмечено в комментариях @mbom007, также важно убедиться, что консоль сконфигурирована с шрифтом, который поддерживает символы, которые вы пытаетесь отобразить.
Никогда не использую setdefaultencoding
, Если вы хотите записать строки юникода в stdio, закодируйте их явно. Обезьяны вокруг с setdefaultencoding
приведет к тому, что модули stdlib и сторонние модули будут ломаться ужасными тонкими способами, позволяя неявное преобразование между str
а также unicode
когда это не должно произойти.
Да, проблема, скорее всего, в том, что ваша кодовая страница установлена неправильно. Однако, используя os.popen
не будет менять кодовую страницу; он создаст новую оболочку, изменит свою кодовую страницу и сразу же завершит работу, не влияя на вашу консоль вообще. Лично я не очень хорошо знаком с Windows, поэтому я не мог рассказать вам, как изменить кодовую страницу вашей консоли из вашей программы на Python.
Способ правильного отображения данных Юникода через utf-8 из python, как упоминалось ранее, заключается в явном кодировании ваших строк перед их печатью: print s.encode('utf-8')
Изменение кодовой страницы консоли не нужно и не сработает (в частности, установка 65001 приводит к ошибке Python). Подробности смотрите в этом вопросе, а также о том, как печатать символы Unicode на консоли независимо от кодовой страницы.
Windows не поддерживает UTF-8 в консоли должным образом. Единственный известный мне способ отображения японского языка в консоли - это изменить (на XP) региональные и языковые параметры панели управления, вкладку "Дополнительно", язык для программ, не поддерживающих Юникод, на японский. После перезагрузки откройте консоль и запустите "chcp", чтобы узнать кодовую страницу японской консоли. Затем либо выведите строки Unicode, либо строки байтов, явно закодированные в правильной кодовой странице.