当前位置: 首页 > 知识库问答 >
问题:

如何在json中将汉字编码为“gbk”,以格式化url请求参数字符串?

田文景
2023-03-14

我想转储作为一个json字符串,其中包含一些汉字,并格式化一个url请求参数。

以下是我的python代码:

import httplib
import simplejson as json
import urllib

d={
  "key":"上海",
  "num":1
}

jsonStr = json.dumps(d,encoding='gbk')
url_encode=urllib.quote_plus(jsonStr)

conn = httplib.HTTPConnection("localhost",port=8885)
conn.request("GET","/?json="+url_encode)
res = conn.getresponse()

我对请求字符串的期望是:

GET /?json=%7B%22num%22%3A+1%2C+%22key%22%3A+%22%C9%CF%BA%A3%22%7D
                                                ------------
                                                     |
                                                     V
                       "%C9%CF%BA%A3" represent "上海" in format of 'gbk' in url.

但我得到的是:

GET /?json=%7B%22num%22%3A+1%2C+%22key%22%3A+%22%5Cu6d93%5Cu5a43%5Cu6363%22%7D
                                                ------------------------
                                                         |
                                                         v
           %5Cu6d93%5Cu5a43%5Cu6363  is 'some' format of chinese characters "上海"  

我还试图转储json与ensure_ascii=False选项:

jsonStr = json.dumps(d,ensure_ascii=False,encoding='gbk')

但没有运气。

那么,我该怎么做呢?谢谢。

共有2个答案

凤衡
2023-03-14
"key":"上海",

您将源代码保存为UTF-8,因此这是字节字符串'\xe4\xb8\x8a\xe6\xb5\xb7'

jsonStr = json.dumps(d,encoding='gbk')

JSON格式仅支持Unicode字符串。encoding参数可用于强制json。将转储到允许的字节字符串中,使用给定的编码将其自动解码为Unicode。

然而,字节串的编码实际上是UTF-8而不是'gbk',所以json.dumps解码不正确,导致u'涓捣'。然后,它会产生不正确的JSON输出"\u6d93\u5a43\u6363",该输出将URL编码为"\u6d93\u5a43\u6363"

要解决这个问题,您应该输入一个适当的Unicode(u")字符串到json.dumps

# coding: utf-8

d = {
    "key": u"上海",  # or u'\u4e0a\u6d77' if you don't want to rely on the coding decl
    "num":1
}
jsonStr = json.dumps(d)
...

这将获得JSON“\u4e0a\u6d77”,编码为URL“\u4e0a\u6d77”

如果您真的不想在JSON中转义\u,您确实可以在URL编码之前ensure_ascii=False,然后. encode()输出。但是我不推荐它,因为您将不得不担心目标应用程序在其URL参数中想要什么编码,这是一些痛苦的来源。\u版本被所有JSON解析器所接受,并且在URL编码后通常不会很长。

宦瀚
2023-03-14

确保ascii=False几乎可以得到它。这项工作:

jsonStr = json.dumps(d, encoding='gbk', ensure_ascii=False).encode('gbk')

您需要告诉json。dumps()表示它将读取的字符串是GBK,并且不应尝试对其进行ASCII校验。然后必须重新指定输出编码,因为json。dumps()对此没有单独的选项。

这个解决方案类似于这里的另一个答案:https://stackoverflow.com/a/18337754/4323

所以这就是您想要的,尽管我应该注意到URI的标准似乎说只要可能,它们就应该使用UTF-8。有关详细信息,请参见此处:https://stackoverflow.com/a/14001296/4323

 类似资料:
  • 问题内容: 我正在我的应用程序中实现Google的即时搜索。当用户在文本输入中键入内容时,我想触发HTTP请求。我遇到的唯一问题是,当用户到达名字和姓氏之间的空格时,该空格未编码为,从而破坏了搜索。如何用替换空格,或者仅安全地对字符串进行URL编码? 问题答案: 尝试encodeURIComponent。 通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例,对统一

  • 问题内容: 我需要找出如何将数字格式化为字符串。我的代码在这里: 小时和分钟是整数,而秒是浮点数。str()函数会将所有这些数字转换为十分之几(0.1)。因此,而不是我的字符串输出“ 5:30:59.07 pm”,它将显示类似“ 5.0:30.0:59.1 pm”的内容。 最重要的是,我需要为我执行什么库/函数? 问题答案: 从Python 3.6开始,可以使用格式化的字符串文字或 f-strin

  • 问题内容: 我想用JavaScript格式化价格。我想要一个以a 作为参数并返回如下格式的函数: 最好的方法是什么? 问题答案: 好的,根据您的发言,我正在使用此功能: 我乐于接受改进建议(我不愿意仅仅为了做到这一点就不包括YUI :))我已经知道我应该检测到“”。而不只是将其用作小数点分隔符…

  • 问题内容: 在Python中,有什么简单的方法可以将整数格式化为表示以K表示成千上万,以M表示成千上万,并在逗号后仅保留几位数的字符串? 我想将7436313显示为7.44M,将2345显示为2,34K。 是否有一些可用的%字符串格式化运算符?还是只能通过在循环中实际除以1000并逐步构造结果字符串来完成? 问题答案: 我认为没有内置功能可以做到这一点。您必须自己滚动,例如:

  • 问题内容: 我一直在存储电话号码,所以我想在将电话号码打印为字符串时简单地添加连字符。 我尝试使用,但是不喜欢连字符。可能是因为它用于格式化十进制数字而不是long。 理想情况下,我也想在区号上加上括号。 正确的方法是什么? 问题答案: 这就是我最终这样做的方式: 我知道这不支持国际号码,但是我不是在编写“真实”应用程序,因此我对此并不担心。我只接受10个字符作为电话号码。我只是想以某种格式打印它