От оболочки Python 2.6:
>>> import sys
>>> print sys.getdefaultencoding()
ascii
>>> print u'\xe9'
é
>>>
Я ожидал иметь или немного мусора или Ошибку после оператора печати, так как "é" символ не является частью ASCII, и я не указал кодирование. Я предполагаю, что не понимаю то, что означает ASCII, являющийся кодировкой по умолчанию.
Править
Я переместил редактирование в раздел Answers и принял его, как предложено.
Когда символы 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 отсутствуют, и отображается правильный символ, если шрифт его поддерживает. Даже если шрифт не поддерживает , символы все равно можно вырезать и вставить из терминала в приложение с поддерживающим шрифтом, и это будет правильно. Обновление!
Python REPL пытается выбрать, какую кодировку использовать из вашей среды. Если он найдет что-то разумное, тогда все будет просто работать. Когда он не может понять, что происходит, он выходит из строя.
>>> print sys.stdout.encoding
UTF-8
Вы указали кодировку, введя явную строку Unicode. Сравните результаты без использования префикса u
.
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> '\xe9'
'\xe9'
>>> u'\xe9'
u'\xe9'
>>> print u'\xe9'
é
>>> print '\xe9'
>>>
В случае \ xe9
Python принимает кодировку по умолчанию (Ascii), таким образом печатая ... что-то пустое.