- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
为了将文件上传到 Google 存储,我向 create_upload_url(redirect_path) 返回的网址发送了多部分 POST 请求。 。 POST 请求包含我需要在 redirect_path 中使用的文件和 JSON 字符串。
如果 JSON 字符串包含 unicode 字符,那么在 GAE 将多部分 POST 请求转发给我后,它就会被破坏。
发送到上传网址的 JSON 字符串:
{"subject": "日文", "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAycjkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6ZCQw"}
GAE将请求转发到redirect_path后的JSON字符串
{"subject": "=E6=97=A5=E6=96=87", "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAyc=
jkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6Z=
CQw"}
unicode 变得不可读,并且“=”和“换行符”被意外插入。
奇怪的是,带有 unicode 的较短 JSON 字符串工作正常。
{"subject": "日文", "tag_key": ""}.
其他要点,
该问题仅发生在生产环境中。我无法在本地开发服务器中重现。
对redirect_path 的多部分POST 请求没有问题。该问题仅在发布到 blobstore.create_upload_url 时发生。
我使用GAE标准环境、Python、Django、Django Rest框架和Postman进行测试。
如果您想到任何可能的原因,请告诉我。
最佳答案
您的 json 字符串正在使用 quoted-printable encoding 进行编码用于传输,因为它包含非 ASCII 字符。 quopri Python 标准库中的 module 提供了处理此问题的工具:
>>> import quopri
>>> foo = '{"subject": "日文", "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAycjkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6ZCQw"}'
>>> encoded = quopri.encodestring(foo)
>>> print encoded
{"subject": "=E6=97=A5=E6=96=87", "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAyc=
jkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6Z=
CQw"}
您可以使用quopri.decodestring
进行解码以获取原始字符串:
>>> print quopri.decodestring(encoded)
{"subject": "日文", "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAycjkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6ZCQw"}
编码是由json字符串中存在非ascii字符触发的;插入换行符是因为可打印引用编码强制行长度为 76 个字符。
您可以通过转义 json 字符串中的非 ascii 字符来完全避免此问题 - 例如 Python 的 json 模块会执行此操作 by default :
If ensure_ascii is true (the default), all non-ASCII characters in the output are escaped with
\uXXXX
sequences, and the result is a str instance consisting of ASCII characters only.
>>> json.dumps({"subject": "日文", "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAycjkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6ZCQw"})
{
"tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAycjkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6ZCQw",
"subject": "\u65e5\u6587"
}
关于python - GAE : Unicode JSON String Not Working in Multipart Post After Blob Upload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44715402/
我是一名优秀的程序员,十分优秀!