python post 如何传递中文 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
pinggjayy
V2EX    Python

python post 如何传递中文

  •  
  •   pinggjayy 2016-01-25 16:10:32 +08:00 13577 次点击
    这是一个创建于 3557 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:现写现查的 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

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

    18 条回复    2016-01-26 18:31:05 +08:00
    izoabr
        1
    izoabr  
       2016-01-25 16:12:18 +08:00
    'name':u'中文'+i

    这样试试
    bcllemon
        2
    bcllemon  
       2016-01-25 16:29:01 +08:00
    python 里面中文要用 Unicode 编码,可以试试楼上的方法。
    pinggjayy
        3
    pinggjayy  
    OP
       2016-01-25 17:43:37 +08:00
    @izoabr 谢谢!!但是不行~,打印 data 的时候里面是 'name': u'\u4e2d\u6587'
    plqws
        4
    plqws  
       2016-01-25 17:51:17 +08:00
    @pinggjayy 这个才是正确的结果, parser 之后就是正常的中文了。
    pinggjayy
        5
    pinggjayy  
    OP
       2016-01-25 17:54:48 +08:00
    @plqws 在哪 parse 呢
    plqws
        6
    plqws  
       2016-01-25 18:08:38 +08:00
    这么说吧, dict 或者是 json 里面一般是不能有中文字符的,所以就把中文用类似 \ua1b2 的 unicode 编码的形式表示,一般你数据传到后台的话 json parser 是会自动 parse 成中文的,所以根本不用担心…
    mrytsr
        7
    mrytsr  
       2016-01-25 18:09:10 +08:00 via Android
    Json.loads
    pinggjayy
        8
    pinggjayy  
    OP
       2016-01-25 18:22:33 +08:00
    可是对方的接口不是 python 的。是 java 的,他接收数据的时候并没有这个步骤
    bdbai
        9
    bdbai  
       2016-01-25 19:36:30 +08:00 via iPhone
    @pinggjayy 这个是 JSON 的事情,与语言无关。只要是符合标准的解释器都认识。
    visaxin
        10
    visaxin  
       2016-01-25 20:01:50 +08:00 via Android
    先查清楚什么是乱码再来问吧
    just1
        11
    just1  
       2016-01-25 20:03:53 +08:00 via Android
    为什么不用 requests
    just1
        12
    just1  
       2016-01-25 20:04:21 +08:00 via Android
    @just1 或者 httplib2
    stillwater
        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')
    mtus
        14
    mtus  
       2016-01-25 22:49:24 +08:00
    python3 + requests, 省心很多
    BOYPT
        15
    BOYPT  
       2016-01-25 23:26:49 +08:00
    首先你要确定对方要什么编码
    “中文”对计算机来说毫无意义,计算机看来只有二进制。你把对方需要的二进制 encode 进去相应字段就是了。
    fy
        16
    fy  
       2016-01-25 23:53:53 +08:00
    1. 确定双方编码,很重要,建议 utf-8
    2. 用 requests 做网络请求,比 urllib2 省心一万倍( HTTP for Humans ,给正常人用的 HTTP )
    3. Python3 ,消灭绝大部分乱七八糟的编码问题
    s12j
        17
    s12j  
       2016-01-25 23:54:28 +08:00
    加个 u 搞定一切
    zkzipoo
        18
    zkzipoo  
       2016-01-26 18:31:05 +08:00
    你可以试试
    ret = requests.post(data=json.dumps(xxx))
    print repr(ret.text)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4433 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 04:07 PVG 12:07 LAX 21:07 JFK 00:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86