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
  • Вопрос задан
  • 6685 просмотров
Пригласить эксперта
Ответы на вопрос 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
Хотя подозреваю при этом будут портится уже выведенные знаки.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы