我想转储作为一个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')
但没有运气。
那么,我该怎么做呢?谢谢。
"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编码后通常不会很长。
用确保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个字符作为电话号码。我只是想以某种格式打印它