【发布时间】:2011-08-16 01:46:34
【问题描述】:
我从如下所示的 API 获得 JSON 响应:
{"excerpt":"...where we\u00e2\u0080\u0099ll just have to wait and see, I\u00e2\u0080\u0099m sure official announcements with start flowing in the coming months \u2013special\u2013..."}
这是从 API 调用返回的原始 JSON 响应。现在,正如您所看到的,该 JSON 文档中有一些代码点,这是传输 unicode 数据时应该使用的代码点。但是 API 响应返回了错误的代码点,因为“摘录”在该摘录所属的原始来源处以“... where we'll ...”开头。如您所见,\u00e2\u0080\u0099 序列用于表示 ' -右单引号 - 字符,但该字符的代码点实际上是 \u2019,编码为 utf-8 的等效字节串是 \xe2\x80\x99。所以它返回相应的字节串而不是代码点。另一个问题是此响应包含正确的代码点,如上一个响应中的 \u2013 (破折号字符),它使我的代码无法处理这两种情况。
我最终必须从此响应中获取一些字段(可能使用 json.loads 并将 \u00e2\u0080\u0099 转换为 \xe2\x80\x99 但对 \u2013 没有任何作用),连接这些字段并发送结果到另一个库,该库最终使用 urllib.urlencode 将该结果编码为有效的 utf-8 url 参数,以发送另一个 API。
所以这是我的问题:有没有办法将包含 utf-8 字节串和 unicode 代码点的字符串(这是执行 json.loads 的结果)编码为另一个仅包含代码点或 utf-8 字节串的字符串所以我可以在 urllib.urlencode 中使用它,或者在做 json.loads 之前可能有解决方案? 注意:我使用的是 Python 2.6.1
我已经联系了 API 所有者并告知他们应该使用有效的代码点而不是字节串,但我不确定他们何时会联系我,所以我正在尝试针对当前情况提出解决方案。
任何帮助将不胜感激。
【问题讨论】:
-
为了澄清,您使用的是 Python 3 吗? (我假设你是,否则 unicode 转义不应出现在返回的字符串中。)无论如何,@Mark Tolonen 的解决方案应该可以通过一些修改来工作。
标签: python unicode encoding utf-8