背景:现写现查的 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
请教到底怎么才能把中文给传过去。
1
izoabr 2016-01-25 16:12:18 +08:00
'name':u'中文'+i
这样试试 |
2
bcllemon 2016-01-25 16:29:01 +08:00
python 里面中文要用 Unicode 编码,可以试试楼上的方法。
|
6
plqws 2016-01-25 18:08:38 +08:00
这么说吧, dict 或者是 json 里面一般是不能有中文字符的,所以就把中文用类似 \ua1b2 的 unicode 编码的形式表示,一般你数据传到后台的话 json parser 是会自动 parse 成中文的,所以根本不用担心…
|
7
mrytsr 2016-01-25 18:09:10 +08:00 via Android
Json.loads
|
8
pinggjayy OP 可是对方的接口不是 python 的。是 java 的,他接收数据的时候并没有这个步骤
|
10
visaxin 2016-01-25 20:01:50 +08:00 via Android
先查清楚什么是乱码再来问吧
|
11
just1 2016-01-25 20:03:53 +08:00 via Android
为什么不用 requests
|
13
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') |
14
mtus 2016-01-25 22:49:24 +08:00
python3 + requests, 省心很多
|
15
BOYPT 2016-01-25 23:26:49 +08:00
首先你要确定对方要什么编码
“中文”对计算机来说毫无意义,计算机看来只有二进制。你把对方需要的二进制 encode 进去相应字段就是了。 |
16
fy 2016-01-25 23:53:53 +08:00
1. 确定双方编码,很重要,建议 utf-8
2. 用 requests 做网络请求,比 urllib2 省心一万倍( HTTP for Humans ,给正常人用的 HTTP ) 3. Python3 ,消灭绝大部分乱七八糟的编码问题 |
17
s12j 2016-01-25 23:54:28 +08:00
加个 u 搞定一切
|
18
zkzipoo 2016-01-26 18:31:05 +08:00
|