Символ Unicode, который не работает один, Python - PullRequest
1 голос
/ 05 ноября 2011

Хорошо, у меня есть еще одна проблема с Python Unicode. В IDLE Windows 7, следующий код:

uni = u"\u4E0D\u65E0"
binary = uni.encode("utf-8")
print binary

печатает два китайских символа, 不 无, правильные. Однако, если я заменю первую строку на

uni = u"\u65E0"

т.е. только второй символ, вместо него печатается æ—. Хотя я заменю его только первым символом

u"\u4E0D"

это дает правильный вывод 不

Это ошибка или что я делаю не так?

ПОЛНЫЙ КОД:

uni = u"\u4E0D\u65E0"

binary = uni.encode("utf-8")

print binary

uni = u"\u65E0"

binary = uni.encode("utf-8")

print binary

uni = u"\u4E0D"

binary = uni.encode("utf-8")

print binary

ВЫВОД:

不 无

1021 * AE- *

1 Ответ

4 голосов
/ 05 ноября 2011

Строка 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», что дает правильный вывод.

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