У меня есть следующие строки на китайском языке, которые сохраняются в следующей форме как тип "str":
\u72ec\u5230\u7528\u8272
Я использую Python 2.7, когда я печатаю эти строки, они печатаются как настоящие китайские иероглифы:
chinese_list = ["\u72ec\u5230", "\u7528\u8272", "\u72ec"]
print(chinese_list[0], chinese_list[1], chinese_list[2])
>>> 独到 用色 独
Я не могу понять, как они были сохранены в такой форме, для меня это похоже на Unicode. Цель состоит в том, чтобы взять другие китайские иероглифы, которые у меня есть, и сохранить их в той же кодировке. Скажем, у меня есть «国 道», и мне нужно, чтобы они были сохранены так же, как в оригинальном chinese_list.
Я пытался закодировать его как utf-8, а также другие кодировки, но никогда не получаю того же результата, что и в оригинале:
new_string = u"国道"
print(new_string.encode("utf-8"))
# >>> b'\xe5\x9b\xbd\xe9\x81\x93'
print(new_string.encode("utf-16"))
# >>> b'\xff\xfe\xfdVS\x90'
Любая помощь приветствуется!
Обновлено: в нем не обязательно должно быть 2 китайских символа.
EDIT2: По-видимому, кодировка была unicode-escape. Спасибо @deceze.
print(u"国".encode('unicode-escape'))
>>> \u56fd
@deceze, что вы подразумеваете под "строкой с обратной косой чертой"? В нем не обязательно должно быть 2 символа, это был только мой пример.
@deceze похоже, что это был unicode-escape, большое спасибо!
Показанный код работает только на python3, но не на python2.
@deceze Я вижу, что он почему-то дважды выводит обратную косую черту: print(u"国".encode('unicode-escape')) выводит b'\\u56fd'. Я предполагаю, что начальная обратная косая черта была впоследствии удалена.
@MisterMiyagi Понятно, я напортачил. Очевидно, я использовал Python 3! Теперь он работает в Python 2: print(u"国".encode('unicode-escape')) выводит \u56fd, а это именно то, что я хочу!






\u.... - это escape-синтаксис Unicode. Это работает аналогично тому, как \n является новой строкой, а не двумя символами \ и n.
Элементы вашего списка никогда фактически содержат байтовую строку с буквенными символами \, u, 7 и так далее. Они содержат строку юникода с фактическими символами юникода, то есть 独 и так далее.
Обратите внимание, что это работает только со строками Unicode! В Python2 вам нужно написать u"\u....". Python3 всегда использует строки Unicode.
Управляющее значение символа в кодировке Unicode можно получить с помощью встроенной функции ord. Например, ord(u"国") дает 22269 - то же значение, что и 0x56fd.
Чтобы получить шестнадцатеричное escape-значение, преобразуйте результат в шестнадцатеричный.
>>> def escape_literal(character):
... return r'\u' + hex(ord(character))[2:]
...
>>> print(escape_literal('国'))
\u56fd
Кодировка называется
unicode-escape, например.u'国道'.encode('unicode-escape'). Однако в результате будет получена строка с обратной косой чертой, буквой «u», цифрами и буквами. Это отличается от строкового литерала"\u72ec\u5230"в исходном коде; этот строковый литерал содержит два китайских символа, выраженных в escape-последовательности Unicode строкового литерала, а не обратную косую черту, «u» и т. д. Итак, несколько неясно, что именно вы хотите.