Python 2.7: вывод utf-8 в консоль Windows - PullRequest
6 голосов
/ 16 августа 2011

Допустим,

s = u"test\u0627\u0644\u0644\u0647 \u0623\u0643\u0628\u0631\u7206\u767A\u043E\u043B\u043E\u043B\u043E"

Если я попытаюсь напечатать его напрямую,

>>> print s
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'cp932' codec can't encode character u'\u0627' in position 4: illegal multibyte sequence

Поэтому я изменяю консоль на UTF-8 из Python (иначе она не пойметмой ввод).

import win32console
win32console.SetConsoleOutputCP(65001)
win32console.SetConsoleCP(65001)

А затем выведите строку, закодированную как utf-8, потому что Python не знает, что chcp 65001 - это UTF-8 (известная ошибка ).

>>> print s.encode('utf-8')
testالله أكبر爆発ололоTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 0] Error

Как видите, он печатается успешно, пока не достигнет новой строки, затем выдает ошибку IOError.

Работает следующий обходной путь:

def safe_print(str):
    try:
        print str.encode('utf-8')
    except:
        pass
    print

>>> safe_print(s)
testالله أكبر爆発ололо

Но естьдолжно быть лучше.Есть предложения?

Ответы [ 2 ]

4 голосов
/ 20 сентября 2011

Поиск SO для python utf8 windows ставит в качестве первого результата вопрос Получение python для печати в UTF8 в Windows XP с помощью консоли , которая описывает, чтопроблема с печатью utf8 в Windows из Python.

1 голос
/ 22 августа 2011

Я не тестировал его в Windows, но здесь вы можете получить небольшой скрипт инициализации для win / linux для правильной настройки выходной кодировки, включая интерфейс регистрации и т. Д. Модуль также делает вывод цветным ( включая обновление интерфейса 'logging')? но вы можете легко отключить ненужные функции: -).

Как вызвать неокрашенный вариант:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from setupcon import setup_console
setup_console('utf-8', False)

и цветной вариант:

import setupcon
setupcon.setup_console()
import logging
#...
if setupcon.ansi:
    logging.getLogger().addHandler(setupcon.ColoredHandler())

Если решение работает для вас, вы можете прочитать документацию здесь: http://habrahabr.ru/blogs/python/117236/, на русском языке или я / кто-то может перевести его для вас по требованию: -).

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