Строка Unicode u"\u4E0D\u65E0"
состоит из двух текста символов 不
и 无
.
Когда кодируется строка Unicode, она преобразуется в последовательность байтов (не двоичную). В зависимости от того, какая кодировка используется, сопоставление текстовых символов с байтами может не совпадать. Например, кодировка utf8 может использовать от одного до трех байтов для представления одного символа:
>>> u'\u65E0'.encode('utf8')
'\xe6\x97\xa0'
Теперь, прежде чем последовательность байтов может быть напечатана 1014 *, python (или IDLE) должен попытаться декодировать ее. Но поскольку он не может узнать, какая кодировка использовалась, он вынужден угадывать. По некоторым причинам кажется, что IDLE, возможно, неправильно угадал "cp1252" для одного из примеров:
>>> text = u'\u65E0'.encode('utf8').decode('cp1252')
>>> text
u'\xe6\u2014\xa0'
>>> print text
æ—
Обратите внимание, что в text
есть три символа - последний является неразрывным пробелом.
EDIT
Строго говоря, IDLE неправильно угадывает "cp1252" для всех трех примеров. Второй только «успешно», потому что каждый байт совпадает с действительным символом текста («cp1252» является 8-битной однобайтовой кодировкой) Два других примера содержат байт \x8d
, который не определен в «cp1252». В этих случаях IDLE (в конце концов) возвращается к «utf8», что дает правильный вывод.