Ваш ожидаемый результат не 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 .Я бы не использовал этот сайт.