如何正确修复UTF-8解码字符串?

时间:2019-06-21 13:50:40

标签: python utf-8

我正在使用RESTful API中的数据,它返回给我字符串和整数值。但是,似乎返回的是一些未正确编码/解码的字符串值。

期望的字符串:

criança

收到字符串:

criança

这是我的代码:

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脚本的,该脚本将从Algolia的RESTful API获取数据并将其存储在Amazon Redshift中。我正在Ubuntu 18.04上编写此脚本,我的终端字符编码集是pt_BR.UTF-8echo $LANG)和UTF-8(locale charmap)。

在将其存储在数据库中之前,我打印了接收到的数据时发现它是错误的-设置为使用charset=utf8。我还可以通过SELECT语句在数据库中看到此错误数据。

我发现了这个UTF-8 Encoding Debugging Chart,它指出可能是因为UTF-8字节被解释为Windows-1252(或ISO 8859-1)字节。

如何使用某些Python函数/ lib处理它?<​​/ p>

2 个答案:

答案 0 :(得分:0)

requests库将尝试guess the encoding of the responserequests可能会将响应解码为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'

答案 1 :(得分:-1)

如果问题仍然存在,请将您的项目复制到其他文件夹,并使用其他项目文件名重新导入您的项目。首先重新启动您的Android Studio,然后从其他文件夹导入项目,您应该已经解决了问题!