python: unicode в терминале Windows, используется кодировка?

Я использую интерпретатор Python в терминале Windows 7.
Я пытаюсь обернуть голову вокруг unicode и кодировок.

я типа:

>>> s='ë'
>>> s
'x89'
>>> u=u'ë'
>>> u
u'xeb'

Вопрос 1: почему кодировка используется в строке s отличается от того, который используется в строке unicode u?

Я продолжаю и печатаю:

>>> us=unicode(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x89 in position 0: ordinal
not in range(128)
>>> us=unicode(s, 'latin-1')
>>> us
u'x89'

Question2: я пробовал использовать latin-1 кодировка на удачу, чтобы превратить строку в строку unicode (на самом деле, я сначала попробовал кучу других, включая utf-8). Как я могу узнать, какую кодировку терминал использовал для кодирования моей строки?

Вопрос 3: как я могу сделать терминал печати ë as ë вместо 'x89' или u'xeb'? Хм, глупый я. print(s) делает работу.

Я уже смотрел на этот связанный с этим вопрос, но никаких подсказок оттуда:установить кодировку терминала Python на Окна

8 ответов


Unicode-это не кодировка. Вы кодируете в байтовые строки и декодируете в Unicode:

>>> '\x89'.decode('cp437')
u'\xeb'
>>> u'\xeb'.encode('cp437')
'\x89'
>>> u'\xeb'.encode('utf8')
'\xc3\xab'

терминал windows использует устаревшие кодовые страницы для DOS. Для нас Windows это:

>>> import sys
>>> sys.stdout.encoding
'cp437'

приложения Windows используют кодовые страницы windows. Простоя Python покажет кодировку windows:

>>> import sys
>>> sys.stdout.encoding
'cp1252'

ваши результаты могут отличаться.


Избегайте Терминала Windows

Я не собираюсь выходить на Лимб, говоря, что "терминал" более уместно "DOS prompt", который поставляется с Windows 7, является абсолютным мусором. Это было плохо в Windows 95, NT, XP, Vista и 7. Может быть, они исправили это с помощью PowerShell, я не знаю. Тем не менее, это свидетельствует о тех проблемах, которые преследовали разработку ОС в Microsoft в то время.

вывод в файл вместо

установить PYTHONIOENCODING переменные среды и затем перенаправьте вывод в файл.

set PYTHONIOENCODING=utf-8

./myscript.py > output.txt

затем с помощью Блокнот++ затем вы можете увидеть версию UTF-8 вашего вывода.

установить win-unicode-console

win-unicode-console можете исправить ваши проблемы. Вы должны попробовать его

pip install win-unicode-console

если вас интересует сквозное обсуждение вопроса о python и выводе командной строки, проверьте Python issue 1602. В противном случае, просто используйте win-unicode-консольный пакет.

py -m run script.py

запускает его на скрипт или вы можете следовать их указаниям, чтобы добавить win_unicode_console.enable() для каждого вызова, добавив его в usercustomize или sitecustomize.


прочитайте этот python HOWTO о unicode после того, как вы прочитаете этот раздел из учебник

создание строк Unicode в Python так же просто, как создание обычных строк:

>>> u'Hello World !'
u'Hello World !'

чтобы ответить на ваш первый вопрос, они разные, потому что только при использовании u''вы создаете строку unicode.

2-й вопрос:

sys.getdefaultencoding()

возвращает кодировку по умолчанию

но цитата из ссылке:

пользователи Python, которые являются новыми для Unicode, иногда привлекаются кодировкой по умолчанию, возвращаемой sys.getdefaultencoding(). Первое, что вы должны знать о кодировке по умолчанию, это то, что вам не нужно заботиться об этом. Его значение должно быть 'в кодировке ASCII' и он используется при преобразовании байта строки StrIsNotAString для строк в юникоде.


вы ответили на вопрос 1, Как вы его задаете: первая строка является закодированной байт-строкой, но вторая не является кодировкой вообще, она относится к кодовой точке unicode, которая для "Латинской маленькой буквы E с ДИАЕРЕЗИСОМ" является hex eb.

Теперь вопрос о том, что такое первая кодировка, является интересным. Обычно я ожидаю, что это будет либо utf-8, либо, поскольку вы находитесь в Windows, ISO-8859-1 или Win-1252 (что не совсем то же самое, но достаточно близко). Однако нормальное представление этой буквы в utf-8 -c3 ab и в Win-1252 это фактически то же самое, что и код unicode-point - ie hex eb. Так что это немного загадочно.


похоже, вы используете страницу код CP850, что имеет смысл, поскольку это историческая кодовая страница для DOS, которая была перенесена в окно терминала.

>>> s
'\x89'
>>> us=unicode(s,'CP850')
>>> us
u'\xeb'

  1. На самом деле объект unicode не имеет "кодировка". Тебе стоит почитать Unicode в python, чтобы избежать константы путаница. Эта презентация выглядит адекватный - http://farmdev.com/talks/unicode/ .

  2. вы находитесь на русской версии окна, верно? Вы терминал использует кодировке cp1251.


Как вы поняли:

>>> a = "ё"
>>> a
'\xf1'
>>> print a
ё

вы открываете файл, когда получаете такие ошибки? Если да, попробуйте открыть его с помощью

import codecs
f = codecs.open('filename.txt','r','utf-8')

в случае, если другие получают эту страницу при поиске Самый простой способ-сначала установить кодовую страницу в терминале

CHCP 65001

запустите программу.

работает хорошо для меня. Для power shell начните с

powershell.exe -NoExit /c "chcp.com 65001"

С python: unicode в терминале Windows, используемая кодировка?