python post 如何传递中文

2016-01-25 16:10:32 +08:00
 pinggjayy

背景:现写现查的 python 水平!
需求:把数据通过 post 方式提交到第三方的接口
问题:无法解决中文乱码的问题(找遍了 google...)
意思代码:
request = {}
request['key'] = key
request['timestamp'] = '134143154532'
request['token'] = 'fagfsfdgfds'
data = []
for i in users:
user = {
'name':'中文'+i
}
data.append(user)
request['data'] = data
request_encode = urllib.urlencode(request)
req = urllib2.Request(url=requestURL,data=request_encode)
res_data = urllib2.urlopen(req)
res = res_data.read()
print(res)

在打印 data 处就已经是 16 进制的格式了,传过去对方也说是乱码。
然后找了方式在 16 行前加上
reques = json.dumps(request,ensure_ascii=False)
然后打印 request 是能显示中文,但是 16 就报错了:
TypeError: not a valid non-string sequence or mapping object

请教到底怎么才能把中文给传过去。

12906 次点击
所在节点    Python
18 条回复
izoabr
2016-01-25 16:12:18 +08:00
'name':u'中文'+i

这样试试
bcllemon
2016-01-25 16:29:01 +08:00
python 里面中文要用 Unicode 编码,可以试试楼上的方法。
pinggjayy
2016-01-25 17:43:37 +08:00
@izoabr 谢谢!!但是不行~,打印 data 的时候里面是 'name': u'\u4e2d\u6587'
plqws
2016-01-25 17:51:17 +08:00
@pinggjayy 这个才是正确的结果, parser 之后就是正常的中文了。
pinggjayy
2016-01-25 17:54:48 +08:00
@plqws 在哪 parse 呢
plqws
2016-01-25 18:08:38 +08:00
这么说吧, dict 或者是 json 里面一般是不能有中文字符的,所以就把中文用类似 \ua1b2 的 unicode 编码的形式表示,一般你数据传到后台的话 json parser 是会自动 parse 成中文的,所以根本不用担心…
mrytsr
2016-01-25 18:09:10 +08:00
Json.loads
pinggjayy
2016-01-25 18:22:33 +08:00
可是对方的接口不是 python 的。是 java 的,他接收数据的时候并没有这个步骤
bdbai
2016-01-25 19:36:30 +08:00
@pinggjayy 这个是 JSON 的事情,与语言无关。只要是符合标准的解释器都认识。
visaxin
2016-01-25 20:01:50 +08:00
先查清楚什么是乱码再来问吧
just1
2016-01-25 20:03:53 +08:00
为什么不用 requests
just1
2016-01-25 20:04:21 +08:00
@just1 或者 httplib2
stillwater
2016-01-25 21:48:20 +08:00
TypeError: not a valid non-string sequence or mapping object 说的是 urlencode 的参数传的不对,因为你在前面用 json.dumps 把 request 这个字典变成了字符串。

对方看是乱码是因为他用的解码格式和你用的编码格式不一样,如果对方用的是 gbk ,你可以这样写 u'中文'.encode('gbk')
mtus
2016-01-25 22:49:24 +08:00
python3 + requests, 省心很多
BOYPT
2016-01-25 23:26:49 +08:00
首先你要确定对方要什么编码
“中文”对计算机来说毫无意义,计算机看来只有二进制。你把对方需要的二进制 encode 进去相应字段就是了。
fy
2016-01-25 23:53:53 +08:00
1. 确定双方编码,很重要,建议 utf-8
2. 用 requests 做网络请求,比 urllib2 省心一万倍( HTTP for Humans ,给正常人用的 HTTP )
3. Python3 ,消灭绝大部分乱七八糟的编码问题
s12j
2016-01-25 23:54:28 +08:00
加个 u 搞定一切
zkzipoo
2016-01-26 18:31:05 +08:00
你可以试试
ret = requests.post(data=json.dumps(xxx))
print repr(ret.text)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/253243

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX