Преобразовать экранированную строку «\ x» в читаемую строку в python - PullRequest
2 голосов
/ 02 августа 2020

Есть ли способ преобразовать \x экранированную строку, например "\\xe8\\xaa\\x9e\\xe8\\xa8\\x80", в читаемую форму: "語言"?

>>> a = "\\xe8\\xaa\\x9e\\xe8\\xa8\\x80"
>>> print(a)
\xe8\xaa\x9e\xe8\xa8\x80

Я знаю, что есть аналогичный вопрос здесь , но, похоже, решение только для латинских символов. Как преобразовать эту форму строки в читаемые символы CJK?

Ответы [ 2 ]

3 голосов
/ 02 августа 2020

Сначала декодируйте его, используя 'unicode-escape' , затем как 'utf8':

a = "\\xe8\\xaa\\x9e\\xe8\\xa8\\x80"
    
decoded = a.encode('latin1').decode('unicode_escape').encode('latin1').decode('utf8')
print(decoded)

# 語言

Обратите внимание, что, поскольку мы можем декодировать только байтовые объекты, нам нужно прозрачно кодировать его между ними, используя latin1.

1 голос
/ 02 августа 2020

Начиная со строки a, которая, по-видимому, соответствует правилам экранирования в шестнадцатеричном формате python, вы можете декодировать ее в байтовый объект плюс длину декодированной строки.

>>> a = "\\xe8\\xaa\\x9e\\xe8\\xa8\\x80"
>>> import codecs
>>> codecs.escape_decode(a)
(b'\xe8\xaa\x9e\xe8\xa8\x80', 24)

Вам не нужно длина здесь, так что просто возьмите элемент 0. Теперь пришло время немного угадать. Предполагая, что эта строка на самом деле представляет кодировку utf-8, теперь у вас есть массив байтов, который вы можете декодировать

>>> codecs.escape_decode(a)[0].decode('utf-8')
'語言'

. Если базовая кодировка была другой (скажем, кодовая страница Windows CJK), вы пришлось бы декодировать его декодером.

...