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'
На самом деле объект unicode не имеет "кодировка". Тебе стоит почитать Unicode в python, чтобы избежать константы путаница. Эта презентация выглядит адекватный - http://farmdev.com/talks/unicode/ .
вы находитесь на русской версии окна, верно? Вы терминал использует кодировке 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, используемая кодировка?