Как исправить неверно декодированную строку UTF-8? - PullRequest
0 голосов
/ 21 июня 2019

Я использую данные из RESTful API, он возвращает мне строки и целочисленные значения.Однако, кажется, что он возвращает некоторые строковые значения, неправильно закодированные / декодированные (вероятно).

Ожидаемая строка:

criança

Полученная строка:

criança

Вот мойcode:

url = "https://analytics.us.algolia.com/2/searches?index={index}&startDate={yesterday}".format(index=index, yesterday=yesterday)
headers = { 'X-Algolia-Application-Id': app_id,
            'X-Algolia-API-Key': app_key,
            'Content-Type': 'application/json; charset=utf-8'}

response = requests.get(url, headers=headers)
response_json = json.loads(response.text)

print(response_json)

Это для скрипта Python 3.6.x, который будет получать данные из RESTful API Algolia и сохранять их в Amazon Redshift.Я пишу этот скрипт в Ubuntu 18.04, мой кодовый набор символов терминала pt_BR.UTF-8 (echo $LANG) и UTF-8 (locale charmap).

Я вижу, что полученные данные неверны при печатиперед сохранением в базе данных - для использования charset=utf8.Я также могу видеть эти неправильные данные в базе данных через оператор SELECT.

Я нашел эту Диаграмму отладки кодировки UTF-8 , она указывает, что, вероятно, это произошло из-за UTF-8байты интерпретируются как байты Windows-1252 (или ISO 8859-1).

Как я могу обработать это с помощью некоторой функции Python / lib?

1 Ответ

0 голосов
/ 23 июня 2019

Библиотека requests пытается угадать кодировку ответа . Возможно, requests декодирует ответ как cp1252 (он же Windows-1252).

Я догадываюсь об этом, потому что если вы возьмете этот текст и закодируете его обратно в cp1252, а затем расшифруете как utf-8, вы увидите правильный текст:

>>> 'criança'.encode('cp1252').decode('utf-8')
'criança'

Исходя из этого, я предполагаю, что если вы спросите свой ответный объект, какую кодировку он угадал, он скажет вам cp1252:

>>> response.encoding
'cp1252'

Принудительное requests декодирование вместо utf-8, как это, вероятно, решит вашу проблему:

>>> response.encoding = 'utf-8'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...