Кодировка Unicode UTF-8 / UTF-16 в Python - PullRequest
5 голосов
/ 04 августа 2009

В питоне:

u'\u3053\n'

Это utf-16?

Я на самом деле не знаю всех вещей, связанных с юникодом / кодированием, но этот тип вещей появляется в моем наборе данных например, если у меня есть a=u'\u3053\n'.

print дает исключение и декодирование дает исключение.

a.encode("utf-16") > '\xff\xfeS0\n\x00'
a.encode("utf-8") > '\xe3\x81\x93\n'

print a.encode("utf-8") > πüô
print a.encode("utf-16") >  ■S0

Что здесь происходит?

Ответы [ 4 ]

8 голосов
/ 04 августа 2009

Это символ Unicode, который не отображается в кодировке ваших терминалов. print пытается закодировать объект Unicode в кодировке вашего терминала, и если это невозможно, вы получите исключение.

На терминале, который может отображать utf-8, вы получаете:

>>> print u'\u3053'
こ

Ваш терминал не может отображать utf-8, иначе, по крайней мере, строка print a.encode("utf-8") должна выдавать правильный символ.

7 голосов
/ 05 августа 2009

Вы спрашиваете:

U '\ u3053 \ п'

Это utf-16?

Ответ - нет: это юникод, а не какая-либо конкретная кодировка. utf-16 - это кодировка.

Чтобы эффективно вывести строку Unicode на ваш терминал, вам необходимо выяснить, какую кодировку этот терминал готов принять и может отобразить. Например, Terminal.app на моем ноутбуке настроен на UTF-8 и с расширенным шрифтом, поэтому:

screenshot
(источник: aleax.it )

... буква Хирагана отображается правильно. На рабочей станции Linux у меня есть терминальная программа, которая постоянно переустанавливается на Latin-1, поэтому она будет манипулировать чем-то похожим на вашу - я могу установить ее в utf-8, но в шрифте нет большого количества глифов, поэтому вместо этого он отображал бы несколько бесполезные глифы-заполнители.

2 голосов
/ 04 августа 2009

Персонаж U + 3053 "HIRAGANA LETTER KO".

Бит \xff\xfe в начале двоичного формата UTF-16 является закодированной меткой порядка байтов (U + FEFF), затем «S0» равно \x5e\x30, затем \n из исходной строки. (У каждого из символов свои байты "обращены", так как он использует кодировку UTF-16 с прямым порядком байтов.)

Форма UTF-8 представляет тот же символ Хирагана в трех байтах с битовым шаблоном, как указано здесь .

Теперь, если у вас действительно есть это в вашем наборе данных ... откуда эти данные? Разумно ли, чтобы в нем были символы хираганы?

1 голос
/ 04 августа 2009

Вот документация по Unicode для Python 2.6.2:

http://docs.python.org/howto/unicode.html

Также см. Ссылки в разделе «Справка» этого документа для других объяснений, в том числе Джоэля Спольски.

...