我正在进行一个API调用,响应包含unicode字符。将此响应加载到文件中会引发以下错误:
'ascii' codec can't encode character u'\u2019' in position 22462
我尝试过解码和编码的所有组合('utf-8')。在
代码如下:
^{pr2}$很多开发者都面临这个问题。很多地方都要求使用.decode('utf-8')
,或者在python的顶部使用# _*_ coding:utf-8 _*_
。在
它仍然没有帮助。在
有人能帮我解决这个问题吗?在
以下是线索:
Traceback (most recent call last):
File "/Users/SM/PycharmProjects/zendesk/zendesk_tickets_api.py", line 102, in main
cleaned_data = json.loads(encoded_data)
File "/Users/SM/anaconda/lib/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/Users/SM/anaconda/lib/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Users/SM/anaconda/lib/python2.7/json/decoder.py", line 380, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Invalid \escape: line 1 column 2826494 (char 2826493)
|********************************************************|
Invalid \escape: line 1 column 2826494 (char 2826493)
text
属性是一个Unicode字符串,它从原始字节解码,使用的是请求模块从HTTP报头猜测可能正在使用的任何编码。在您可能不希望这样;JSON对于编码应该是什么有自己的想法,所以您应该让JSON解码器通过从
resp.content
获取原始响应字节并直接传递给json.loads
来实现这一点。在更重要的是,请求有一个快捷的方法来做同样的事情:
^{pr2}$resp.json()
。在尝试对JSON字符串文本格式的输入执行此操作是一个坏主意:您将错过一些有效的转义,而错误地取消转义其他转义。替换Unicode是对输入的实际错误。例如,考虑输入JSON:
更换后:
这显然不是有效的JSON。在
与其尝试对JSON编码的字符串进行操作,不如让
json
对输入进行解码,然后过滤结构化输出中的任何字符串。这可能涉及到使用递归函数深入到每个级别的数据,以查找要筛选的字符串。例如相关问题 更多 >
编程相关推荐