Строка Python 2 каким-то образом сохранена как чистый Unicode

У меня есть следующие строки на китайском языке, которые сохраняются в следующей форме как тип "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

Кодировка называется unicode-escape, например. u'国道'.encode('unicode-escape'). Однако в результате будет получена строка с обратной косой чертой, буквой «u», цифрами и буквами. Это отличается от строкового литерала "\u72ec\u5230" в исходном коде; этот строковый литерал содержит два китайских символа, выраженных в escape-последовательности Unicode строкового литерала, а не обратную косую черту, «u» и т. д. Итак, несколько неясно, что именно вы хотите.

deceze 10.04.2018 16:56

@deceze, что вы подразумеваете под "строкой с обратной косой чертой"? В нем не обязательно должно быть 2 символа, это был только мой пример.

ivan_bilan 10.04.2018 17:00

@deceze похоже, что это был unicode-escape, большое спасибо!

ivan_bilan 10.04.2018 17:17

Показанный код работает только на python3, но не на python2.

MisterMiyagi 10.04.2018 17:21

@deceze Я вижу, что он почему-то дважды выводит обратную косую черту: print(u"国".encode('unicode-escape')) выводит b'\\u56fd'. Я предполагаю, что начальная обратная косая черта была впоследствии удалена.

ivan_bilan 10.04.2018 17:21

@MisterMiyagi Понятно, я напортачил. Очевидно, я использовал Python 3! Теперь он работает в Python 2: print(u"国".encode('unicode-escape')) выводит \u56fd, а это именно то, что я хочу!

ivan_bilan 10.04.2018 17:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

\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

Другие вопросы по теме