Python: как печатать в cmd.exe и кириллицу, и балтийские символы?

Хочется
а) печатать юникодные символы из Питона в консоль и
б) читать их сразу глазами, без декодера.

Работаю через chcp + PYTHONIOENCODING. И пока что могу успешно распечатать или кириллицу (1251), или балтику (1257), но не вперемешку — тогда выскакивает UnicodeEncodeError. Вобщем-то даже понятно почему не работают все варианты кроме последнего, но вот почему последний не работает, с utf-8, непонятно. Как бы его заработать или по другому получить желаемый результат?

Работаю в FAR/cmd, поэтому хочется чтобы именно под ними всё завелось. Менять сорцы тоже не хочется (но если это вариант вдруг — единственный, пожалуйста, расскажите об этом).

Python 2.7.3, Windows 7

Запускаемый скрипт:

# -*- coding: utf-8 -*-

try:
  print u'Иосиф Кобзон'
except UnicodeEncodeError:
  print 'cannot print cyrillic'

try:
  print u'Eglutės'
except UnicodeEncodeError:
  print 'cannot print baltic'



Лог сессии cmd.exe:

$ chcp 1251  1>nul
$ SET PYTHONIOENCODING=1251
$ python enc.py
Иосиф Кобзон
cannot print baltic

$ chcp 1257  1>nul
$ D:\temp\python-output-encoding>SET PYTHONIOENCODING=windows-1257
$ python enc.py
cannot print cyrillic
Eglutės

$ chcp 65001  1>nul
$ SET PYTHONIOENCODING=utf-8
$ python enc.py
��осиф КобзонTraceback (most recent call last):
  File "enc.py", line 4, in <module>
    print u'Иосиф Кобзон'
IOError: [Errno 2] No such file or directory
  • Вопрос задан
  • 6624 просмотра
Пригласить эксперта
Ответы на вопрос 3
taliban
@taliban
php программист
Попробуйте запускать через power shell и работайте с utf-8, может выйдет что-то.
Ответ написан
Комментировать
briskly
@briskly
как вариант логировать в файл, а от туда читать, если есть необходимость, то можно читать в динамике для *nix: tail -f log.txt
Ответ написан
demmsnt
@demmsnt
Программист
Это потому, что при старте программы он выясняет в какой кодировке sys.stdout Да ты его меняешь, но он уже считает что там cp866. Поэтому придется делать руками unicode('XYZ', 'cp866').encode('baltic_encoding') и перед вызовами chcp делать через os.system
Хотя подозреваю при этом будут портится уже выведенные знаки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы