Почему Python печатает unicode символы, когда кодировкой по умолчанию является ASCII?

От оболочки Python 2.6:

>>> import sys
>>> print sys.getdefaultencoding()
ascii
>>> print u'\xe9'
é
>>> 

Я ожидал иметь или немного мусора или Ошибку после оператора печати, так как "é" символ не является частью ASCII, и я не указал кодирование. Я предполагаю, что не понимаю то, что означает ASCII, являющийся кодировкой по умолчанию.

Править

Я переместил редактирование в раздел Answers и принял его, как предложено.

137
задан Michael Ekoka 2 August 2018 в 21:44
поделиться

3 ответа

Когда символы Unicode выводятся на стандартный вывод, используется sys.stdout.encoding . Предполагается, что символ не-Unicode находится в sys.stdout.encoding и просто отправляется на терминал. В моей системе (Python 2):

>>> import unicodedata as ud
>>> import sys
>>> sys.stdout.encoding
'cp437'
>>> ud.name(u'\xe9') # U+00E9 Unicode codepoint
'LATIN SMALL LETTER E WITH ACUTE'
>>> ud.name('\xe9'.decode('cp437')) 
'GREEK CAPITAL LETTER THETA'
>>> '\xe9'.decode('cp437') # byte E9 decoded using code page 437 is U+0398.
u'\u0398'
>>> ud.name(u'\u0398')
'GREEK CAPITAL LETTER THETA'
>>> print u'\xe9' # Unicode is encoded to CP437 correctly
é
>>> print '\xe9'  # Byte is just sent to terminal and assumed to be CP437.
Θ

sys.getdefaultencoding () используется только тогда, когда у Python нет другого варианта.

Обратите внимание, что Python 3.6 или более поздней версии игнорирует кодировки в Windows и использует API Unicode для записи Unicode в терминал. Предупреждения об ошибке UnicodeEncodeError отсутствуют, и отображается правильный символ, если шрифт его поддерживает. Даже если шрифт не поддерживает , символы все равно можно вырезать и вставить из терминала в приложение с поддерживающим шрифтом, и это будет правильно. Обновление!

25
ответ дан 23 November 2019 в 23:35
поделиться

Python REPL пытается выбрать, какую кодировку использовать из вашей среды. Если он найдет что-то разумное, тогда все будет просто работать. Когда он не может понять, что происходит, он выходит из строя.

>>> print sys.stdout.encoding
UTF-8
8
ответ дан 23 November 2019 в 23:35
поделиться

Вы указали кодировку, введя явную строку Unicode. Сравните результаты без использования префикса u .

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> '\xe9'
'\xe9'
>>> u'\xe9'
u'\xe9'
>>> print u'\xe9'
é
>>> print '\xe9'

>>> 

В случае \ xe9 Python принимает кодировку по умолчанию (Ascii), таким образом печатая ... что-то пустое.

4
ответ дан 23 November 2019 в 23:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: