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 · 13150 次点击
    这是一个创建于 3261 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:现写现查的 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   ·   实用小工具   ·   1099 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:24 · PVG 02:24 · LAX 10:24 · JFK 13:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.