Джсон возвращается со специальными символами - PullRequest
1 голос
/ 22 марта 2019

Я получаю в качестве возврата от API JSON с символами "\ u0083", "\ u0087d" и "\ u008d". Я изменил кодировку на utf-8 и ISO-8859-1, но мне это не удалось, пожалуйста, кто-нибудь может помочь в этом случае, потому что API, который я использую, не изменится.

Изменение в кодировке заголовка запроса, но безуспешно

Примеры:

''» "prop": "SÃ \ u0083O LUÃ \ u008dS", "prop": "RUA LUIZ GUIMARÃ © u0083ES", "prop": "POÃ \ u0087O DA PANELA"

'' '

1 Ответ

1 голос
/ 28 июня 2019

У вас есть UTF-8 байтов, которые декодируются как ISO-8859-1.

'SÃO LUÍS', закодированный как UTF-8, приводит к следующим байтам (обозначение - 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'
...