Json返回特殊字符

时间:2019-03-22 20:47:26

标签: json api encoding special-characters utf

我从api返回一个带有字符“ \ u0083”,“ \ u0087d”和“ \ u008d”的json。我将编码更改为utf-8和ISO-8859-1,但未成功,请以防万一,因为我使用的api不会更改。

更改请求标头编码,但未成功

示例:

''' “ prop”:“SÃ\ u0083OLUÃ\ u008dS”, “ prop”:“ RUA LUIZGUIMARÃ\ u0083ES”, “ prop”:“POÃ\ u0087O DA PANELA”

'''

1 个答案:

答案 0 :(得分:1)

您将UTF-8字节解码为ISO-8859-1。

编码为UTF-8的'SÃOLUÍS'产生以下字节(符号为Python,但原理适用于任何语言)

b'S\xc3\x83O LU\xc3\x8dS' 

解码为ISO-8859-1会产生以下字符串:

'SÃ\x83O LUÃ\x8dS'

UTF-8是多字节编码,但是ISO-8859-1是单字节编码。在这种情况下,UTF-8编码的“Ô和“Í”的首个字节是\xc3,这是“Ô的ISO-8859-1编码。 ISO-8859-1中未定义每个字符的第二个字节,因此在解码过程中它们保持不变。

假设此损坏的数据是由API生成的,则需要对反序列化的json数据进行迭代,并将每个字符串编码为ISO-8859-1,然后将结果字节解码为UTF-8。

>>> bad = 'SÃ\u0083O LUÃ\u008dS'
>>> bad.encode('latin-1').decode('utf-8')
'SÃO LUÍS'