【发布时间】:2019-11-04 09:12:56
【问题描述】:
我正在使用来自 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-8 (echo $LANG) 和 UTF-8 (locale charmap)。
当我在将其存储到数据库之前打印接收到的数据时,我发现接收到的数据是错误的——数据库设置为使用charset=utf8。我也可以通过SELECT 语句在数据库中看到这个错误的数据。
我发现了这个UTF-8 Encoding Debugging Chart,它指出可能是因为 UTF-8 字节被解释为 Windows-1252(或 ISO 8859-1)字节。
如何使用一些 Python 函数/lib 来处理它?
【问题讨论】:
-
这意味着响应被视为 ASCII 而不是 UTF8。这不是编码的问题。您现在阅读的页面是 UTF8,但是,如果您检查源代码,您会发现不涉及任何编码。请发布您的代码。很可能那里有一个尝试“解码”或将该字符串转换为其他内容的调用,从而导致问题
-
另一种可能性是字符串是正确的,但您检查的方式却不是。如果您的终端或控制台未设置为 UTF8,则 UTF8 字节将显示为 ASCII 字符,而表示
ç的两个字节将显示为ç。如果您将数据保存到文件中,您可能会将其读取为 ASCII 而不是 UTF8 -
@PanagiotisKanavos,感谢您的支持。我检查了我的终端字符编码,它设置为 UTF-8。我应该明确做任何设置来使 Python 与 UTF-8 一起工作吗?
-
没什么。它不需要任何东西。发布您的代码。 it 以某种方式将响应视为 ASCII 而不是 UTF8。或者可能是响应在
Content-Type标头中包含错误的charset。当您尝试检索 this 页面时会发生什么? -
@GabrielAtaide
Content-Type仅允许在 PUT/POST 请求中使用。在 GET 中,它只能显示为 response 标头。使用Accept-Charset请求 UTF8 响应。我怀疑你调用的 HTTP 服务默认为 Latin1(又名 1252,ISO-8859-1)