Получение 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