【问题标题】:Python requests Json body includes some thai values, needs to be encoded as it isPython 请求 Json 正文包含一些泰语值,需要按原样编码
【发布时间】:2019-09-06 13:13:26
【问题描述】:

我有一些 json 包含一些 thai 值。它看起来像

{
   "TitleName": "คุณ",
   "FirstName": "Simar"
}

我需要用这个带有确切thai 值的json 主体发出一个Http POST 请求。我正在使用Python 3 requests 库来发出请求。 我试过这个

headers = {
        'Content-Type': "application/json",
        'Authorization': "xxx",
        'cache-control': "no-cache",
        'Postman-Token': "xxx"
    }    
response = requests.request("POST", url, json=request, headers=headers)

它将json值生成为

"TitleName": "\\u0e04\\u0e38\\u0e13",
"FirstName": "Simar"

我也试过了

json_request = json.dumps(self.request_data,ensure_ascii=False).encode('utf8')     
response = requests.request("POST", url, json=json_request, headers=headers)

它将json值生成为

"TitleName": "\xe0\xb8\x84\xe0\xb8\xb8\xe0\xb8\x93",
"FirstName": "Simar"

但我希望将 json 值生成为

   "TitleName": "คุณ",
   "FirstName": "Simar"

我们将不胜感激。提前致谢。

【问题讨论】:

  • 为什么需要保持原样?我认为 Python 不会打印奇怪的字符(如表情符号),这并不意味着您不能在网站上使用它。
  • 在 JSON 中,\u0e04 与 คุ 是同一个字符。 (\\u0e04 是否只是碰巧包含 JSON 的文本字符串的 Python 文字表示,可能如调试器所示?)
  • 我想保持原样,因为我要访问的 API 仅适用于泰语值,而不适用于“\u0e04”或“\xe0”等文字
  • @TomBlodget 是的,我从调试器中选择了这个值
  • 感谢您的解释。 \x 表示法不是有效的 JSON,但 \u 是。太糟糕了,您的客户不合规。我没有比@snakecharmerb 更好的解决方案(但其他人可能)。

标签: python json character-encoding python-requests thai


【解决方案1】:

要在 POST 请求中保留非 ascii 字符,您需要手动序列化为 json,并显式设置 content-type 标头。

data = json.dumps(my_dict, ensure_ascii=False)
r = requests.post(url, headers={'content-type': 'application/json'},
                  data=data.encode('utf-8'))

【讨论】:

  • 我想我已经做了与问题中提到的相同的事情。但它给了我“TitleName”的值:“\xe0\xb8\x84\xe0\xb8\xb8\xe0\xb8\x93”
  • 您可以尝试将标题设置为'application/json;charset=utf8' 吗?您的问题中有类似的代码,但是 requests 要求您在执行此操作时设置内容类型标头,并且您的问题不会显示您要发送的标头。
  • 我已经尝试使用标题为'application/json' 以及'application/json; charset=utf8'。但都没有奏效。
  • 另外,我已经编辑了问题以指定使用的标题。
猜你喜欢
  • 2013-03-19
  • 1970-01-01
  • 2021-10-27
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 2018-05-27
  • 1970-01-01
相关资源
最近更新 更多