解码python二进制字符串但不保证ascii符号

时间:2018-05-18 11:12:51

标签: python unicode

我有一个二元对象:

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 :(得分:2)

bytes字符串,如

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

已使用Unicode转义序列进行编码。要将其转换回正确的Unicode字符串,您只需指定'unicode-escape'编解码器:

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

<强>输出

Обновление

但是,如果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')

答案 1 :(得分:0)

只要所有转义都有效(没有单\),这就应该有效。

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": "Обновление"}}'