Получение python для печати в UTF8 в Windows XP с помощью консоли

Я хотел бы настроить мою консоль в Windows XP для поддержки UTF8 и установить python и работать с ней.

До сих пор мои попытки:

C:\Documents and Settings\Philippe>C:\Python25\python.exe
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print u'é'
é
>>> import sys
>>> sys.stdout.encoding
'cp437'
>>> quit()

Итак, по умолчанию я нахожусь в cp437, и python обнаруживает, что это просто отлично.

C:\Documents and Settings\Philippe>chcp 65001
Active code page: 65001

C:\Documents and Settings\Philippe>python
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding
'cp65001'
>>> print u'é'
C:\Documents and Settings\Philippe>

Кажется, что печать в UTF8 теперь вызывает сбой python...

Ответ 1

Я хотел бы настроить консоль на Windows XP для поддержки UTF8

Я не думаю, что это произойдет.

Кодовая страница 65001 ошибочна; некоторые вызовы stdio ведут себя некорректно и разбивают многие инструменты. Пока вы можете зарегистрировать cp65001 в качестве кодировки вручную:

def cp65001(name):
    if name.lower()=='cp65001':
        return codecs.lookup('utf-8')

codecs.register(cp65001)

и это позволяет вам print u'some unicode string', это не позволяет вам писать символы, отличные от ASCII, в этой строке Unicode. Вы получаете те же нечетные ошибки (IOError 0 и др.), Которые вы делаете, когда пытаетесь записать последовательности без ASCII UTF-8 непосредственно в виде строк байтов.

К сожалению, UTF-8 является гражданином второго сорта под Windows. Модель NT Unicode была разработана до того, как существовал UTF-8, и поэтому вы ожидаете использовать кодировки с двумя байтами на код (UTF-16, первоначально UCS-2) в любом месте, где вы хотите согласовать Unicode. Использование байтовых строк, как и многие портативные приложения и языки (например, Python), написанные с помощью C stdio, не соответствует этой модели.

И переписывание Python для использования консольных вызовов Windows Unicode (например, WriteConsoleW) вместо переносимых C stdio не очень хорошо работает с трюками оболочки, такими как конвейер и перенаправление на файл. (Не говоря уже о том, что вам все равно придется менять шрифт терминала по умолчанию на TTF, прежде чем вы сможете увидеть результаты, которые работают вообще...)

В конечном счете, если вам нужна командная строка с поддержкой UTF-8 для приложений на основе stdio, вам, вероятно, будет лучше использовать альтернативу консоли Windows, которая ее намеренно поддерживает, например, Cygwin или Python IDLE или pywin32 Pythonwin.

Ответ 2

Когда я пытаюсь сделать то же самое на Python 2.7, я получаю сообщение об ошибке import sys:

LookupError: неизвестная кодировка: cp65001

Это означает, что Python не знает, как работать со специальной кодовой страницей Windows UTF-8, а 2.5 безжалостно справляется с ситуацией.

По-видимому, это было исследовано и не зафиксировано в Python 3.2: http://bugs.python.org/issue6058

Обновление: В Что нового в Python 3.3 в нем отображается поддержка cp65001 как новая функция.

Ответ 3

У меня возникли проблемы с отображением символа Евро в консоли cmd с Python script с использованием Windows Vista. Вот то, что сработало для меня:

Кулак, мне нужно убедиться, что шрифт установлен как Lucinda Console, а не растровые шрифты, которые не работают. Это можно сделать, установив свойства по умолчанию в консоли в раскрывающемся меню окна консоли и перезапустив консольное окно с помощью cmd.exe.

Во-вторых, когда я запускаю cmd, я устанавливаю кодовую страницу с chcp 1252.

В-третьих, я уверен, что мой редактор (Notepad ++) имеет правильные настройки кодировки. В раскрывающемся меню Encoding в Notepad ++ выберите Encode in UTF-8.

Это сработало для меня.

Ответ 4

установите это в своей победе:

set PYTHONIOENCODING=utf-8