Python: Unicode в терминале Windows, кодировка используется? - PullRequest
7 голосов
/ 14 июня 2011

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

Я печатаю:

>>> 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 : как я могу заставить терминал печатать ë как ë вместо'\x89' или u'xeb'? Хм, глупый я.print(s) выполняет свою работу.

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

Ответы [ 8 ]

11 голосов
/ 15 июня 2011

Юникод не является кодировкой. Вы кодируете в байтовые строки и декодируете в 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. IDLE Python покажет кодировку Windows:

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

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

4 голосов
/ 16 мая 2016

Избегайте Windows Terminal

Я не собираюсь выходить из строя, говоря «терминал» более подходящим образом «приглашение DOS», которое поставляется с Windows 7, является абсолютным мусором.Это было плохо в Windows 95, NT, XP, Vista и 7. Может быть, они исправили это с помощью Powershell, я не знаю.Однако это свидетельствует о проблемах, которые мешали разработке ОС в Microsoft в то время.

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

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

set PYTHONIOENCODING=utf-8

./myscript.py > output.txt

Затем, используя Notepad ++ , вы можете увидеть версию вашего вывода в формате UTF-8.

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

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

pip install win-unicode-console

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

py -m run script.py

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

1 голос
/ 30 марта 2015

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

CHCP 65001

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

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

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

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

1 голос
/ 15 июня 2011

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

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

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

import codecs
f = codecs.open('filename.txt','r','utf-8')
1 голос
/ 14 июня 2011

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

>>> s
'\x89'
>>> us=unicode(s,'CP850')
>>> us
u'\xeb'
1 голос
/ 14 июня 2011

Вы ответили на вопрос 1 так, как вы его задали: первая строка является закодированной строкой байтов, но вторая вообще не является кодировкой, она относится к кодовой точке Unicode, что для "LATIN SMALL LETTER EWITH DIAERESIS "hex eb.

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

1 голос
/ 14 июня 2011
  1. На самом деле, объект Unicode не имеет «Кодирование». Вы должны прочитать о Unicode в Python, чтобы избежать констант спутанность сознания. Эта презентация выглядит адекватный - http://farmdev.com/talks/unicode/.

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

1 голос
/ 14 июня 2011

Прочтите этот Python HOWTO о Юникод после прочтения этого раздела из учебника

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

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

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

2-й вопрос:

sys.getdefaultencoding()

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

Но, чтобы процитировать от ссылка :

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

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