декодировать двоичную строку python, но не обеспечивать символы ascii - PullRequest
0 голосов
/ 18 мая 2018

У меня есть двоичный объект:

b'{"node": "\\u041e\\u0431\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435"}}'

, и я хочу, чтобы он печатался в Unicode, а не строго с использованием символов ASCII.

Существует хакерский способ сделать это:

decoded = string.decode()
parsed_to_dict = json.loads(decoded)
dumped = json.dumps(parsed_to_dict, ensure_ascii=False)
print(dumped)

>>> {"node": "Обновление"}

однако текст не всегда будет разбираться как JSON, поэтому мне нужен более простой способ.

Есть ли способ распечатать мой двоичный объект (или декодированную строку Unicode) в виде строки, отличной от ascii, без разбора / разгрузки JSON?

Например, как напечатать этоb'\\u041e\\u0431\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435' как Обновление?

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

A bytes строка типа

b'\\u041e\\u0431\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435'

была закодирована с использованием escape-последовательностей Unicode.Чтобы преобразовать его обратно в правильную строку Unicode, вам просто нужно указать кодек 'unicode-escape':

data = b'\\u041e\\u0431\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435'
out = data.decode('unicode-escape')
print(out)

output

Обновление

Однако, еслиdata уже является строкой Unicode, затем вам сначала нужно закодировать ее в байтах.Вы можете сделать это с помощью кодека ascii, предполагая, что data содержит только символы ASCII.Если он содержит символы вне ASCII, но в диапазоне от \x80 до \xff, вы можете использовать кодек 'latin1'.

data = '\\u041e\\u0431\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435'
out = data.encode('ascii').decode('unicode-escape')
0 голосов
/ 18 мая 2018

Это должно работать до тех пор, пока все экранированные значения действительны (не один \).

import ast
bytes_object = b'{"node": "\\u041e\\u0431\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435"}}'

unicode_string = ast.literal_eval("'{}'".format(bytes_object.decode()))

вывод:

'{"node": "Обновление"}}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...