Получение python для печати в UTF8 на Windows XP с консоли - PullRequest
11 голосов
/ 10 августа 2011

Я бы хотел настроить мою консоль в 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 ...

Ответы [ 4 ]

8 голосов
/ 11 августа 2011

Я хотел бы настроить консоль в 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,Модель Unicode в NT была разработана до появления UTF-8, и, следовательно, ожидается, что вы будете использовать кодирование по два байта на единицу кода (UTF-16, первоначально UCS-2) везде, где вам нужен согласованный Unicode.Использование байтовых строк, таких как многие переносимые приложения и языки (например, Python), написанные с помощью stdio, не подходит для этой модели.

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

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

4 голосов
/ 10 августа 2011

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

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

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

Очевидно, это было исследовано, и not исправлено в Python 3.2: http://bugs.python.org/issue6058

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

0 голосов
/ 18 мая 2015

установите это в своем выигрыше:

set PYTHONIOENCODING=utf-8
0 голосов
/ 31 мая 2014

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

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

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

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

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

...