Как закодировать строку Python 3 с помощью escape-кода \u?

В Python 3 предположим, что у меня есть

>>> thai_string = 'สีเ'

Использование encode дает

>>> thai_string.encode('utf-8')
b'\xe0\xb8\xaa\xe0\xb8\xb5'

Мой вопрос: как я могу заставить encode() возвращать последовательность bytes, используя \u вместо \x? И как я могу decode вернуть их к типу Python 3 str?

Я попытался использовать встроенную функцию ascii, которая дает

>>> ascii(thai_string)
"'\\u0e2a\\u0e35'"

Но это кажется не совсем правильным, так как я не могу раскодировать его обратно, чтобы получить thai_string.

документация Python говорит мне, что

  • \xhh экранирует символ с шестнадцатеричным значением hh, а
  • \uxxxx экранирует символ с 16-битным шестнадцатеричным значением xxxx

В документации сказано, что \u используется только в строковых литералах, но я не уверен, что это значит. Это намек на то, что мой вопрос имеет ошибочную предпосылку?


person Michael Currie    schedule 28.08.2015    source источник
comment
А как насчет .decode('utf-8')? В любом случае, строки в юникоде Python не являются?   -  person Zizouz212    schedule 29.08.2015
comment
@ Zizouz212 Zizouz212, ни thai_string, ни ascii(thai_string) не имеют метода decode, а thai_string.encode('utf-8').decode('utf-8') возвращает меня к тому, с чего я начал, thai_string, что не является желаемым результатом.   -  person Michael Currie    schedule 29.08.2015
comment
Документация Python, относящаяся к escape-последовательности \u: docs.python.org/3/reference/lexical_analysis .html и docs.python.org/3. /library/codecs.html#encodings-and-unicode   -  person Ioannis Filippidis    schedule 08.04.2021
comment
Релевантно: stackoverflow.com/q/1347791/1959808   -  person Ioannis Filippidis    schedule 08.04.2021
comment
Отвечает ли это на ваш вопрос? Как работать с суррогатными парами в Python?   -  person ti7    schedule 26.07.2021
comment
Я также использую ascii(sku).replace(r"\x", r"\u00") и работает лучше   -  person Felipe Buccioni    schedule 28.07.2021


Ответы (1)


Вы можете использовать unicode_escape:

>>> thai_string.encode('unicode_escape')
b'\\u0e2a\\u0e35\\u0e40'

Обратите внимание, что encode() всегда будет возвращать строку байтов (bytes) и кодировку unicode_escape предназначен:

Создайте строку, подходящую в качестве литерала Unicode в исходном коде Python.

person Simeon Visser    schedule 28.08.2015
comment
Идеальный. Но почему в этой строке две косые черты перед u, а перед x только одна? - person Michael Currie; 31.08.2015