Кодировка UTF-16 и японский язык в Python 3 - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь кодировать японские символы в UTF-16; в основном имитируют то, что делает этот онлайн-инструмент: https://www.branah.com/unicode-converter

Например,

'インスタントグラム' 

должно стать

'\u30a4\u30f3\u30b9\u30bf\u30f3\u30c8\u30b0\u30e9\u30e0'

Я использую следующий блок кода:

jp_example = 'インスタントグラム'
jp_example.encode('utf-16')

и вместо этого получите вывод, который выглядит следующим образом:

b'\xff\xfe\xa40\xf30\xb90\xbf0\xf30\xc80\xb00\xe90\xe00'

Есть идеи, что мне не хватает? Я играл с другими кодировками, и у меня ничего не получалось.

FWIW, я использую ноутбук Jupyter с Python 3.6.3rc1 +.

1 Ответ

0 голосов
/ 15 мая 2018

Ваш ожидаемый результат не UTF-16 .UTF-16 - это кодировка , которая использует 2 байта на кодовую точку ;, Кодовая точка Unicode U + 30A4 KATAKANA LETTER I , если она представлена ​​в байтах UTF-16 в виде шестнадцатеричного числа A4 30 или 30 A4, в зависимости от порядка байтов , который выбрал кодировщик .

Вместо этого ожидаемый результат состоит из кодовых точек Unicode, встроенных в экранированные символы \u.Такие экранирования используются в нескольких контекстах, включая строковые литералы Python и данные JSON.

Если вы создаете данные JSON, используйте json.dumps() для создания строки JSON;любые кодовые точки в этой строке вне набора символов ASCII представляются с помощью escape-последовательностей \uhhhh:

>>> jp_example = 'インスタントグラム'
>>> import json
>>> print(json.dumps(jp_example))
"\u30a4\u30f3\u30b9\u30bf\u30f3\u30c8\u30b0\u30e9\u30e0"

В противном случае, если вы генерируете строковые литералы Python, используйте кодек unicode_escape;это также выдает последовательность байтов;в целях печати я снова декодировал эти байты в текст, используя кодек ASCII

>>> print(jp_example.encode('unicode_escape').decode('ascii'))
\u30a4\u30f3\u30b9\u30bf\u30f3\u30c8\u30b0\u30e9\u30e0

. Вы должны быть абсолютно уверены относительно того, для чего используются ваши данные.Строковые литеральные обозначения JSON и Python отличаются, когда дело доходит до кодовых точек за пределами базовой многоязычной плоскости , такой как большинство Emoji:

>>> print(json.dumps('??'))
"\ud83d\udc31\ud83d\udc64"
>>> print('??'.encode('unicode_escape').decode('ascii'))
\U0001f431\U0001f464

JSON использует суррогатные пары для представления таких кодовых точек, в то время как Python использует escape-последовательность \Uhhhhhhhh 8-шестнадцатеричных цифр.

И просто для ясности: то, что производит этот сайт конвертера юникода, не полезно и не вводит в заблуждение.Блок 'UTF-16' создает escape-последовательности JSON-нотации или шестнадцатеричные значения UTF-16 с прямым порядком байтов при установке флажка Remove \ u без метки порядка байтов.Я не совсем понимаю, что должна делать разметка u+ для вывода UTF-32, а блок UTF-8 выводит моджибаке UTF-8-to-Latin-1 .Я бы не использовал этот сайт.

...