V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · Jan 25, 2016 · 13964 views
    This topic created in 3758 days ago, the information mentioned may be changed or developed.

    背景:现写现查的 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 replies    2016-01-26 18:31:05 +08:00
    izoabr
        1
    izoabr  
       Jan 25, 2016
    'name':u'中文'+i

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

    对方看是乱码是因为他用的解码格式和你用的编码格式不一样,如果对方用的是 gbk ,你可以这样写 u'中文'.encode('gbk')
    mtus
        14
    mtus  
       Jan 25, 2016
    python3 + requests, 省心很多
    BOYPT
        15
    BOYPT  
       Jan 25, 2016
    首先你要确定对方要什么编码
    “中文”对计算机来说毫无意义,计算机看来只有二进制。你把对方需要的二进制 encode 进去相应字段就是了。
    fy
        16
    fy  
       Jan 25, 2016
    1. 确定双方编码,很重要,建议 utf-8
    2. 用 requests 做网络请求,比 urllib2 省心一万倍( HTTP for Humans ,给正常人用的 HTTP )
    3. Python3 ,消灭绝大部分乱七八糟的编码问题
    s12j
        17
    s12j  
       Jan 25, 2016
    加个 u 搞定一切
    zkzipoo
        18
    zkzipoo  
       Jan 26, 2016
    你可以试试
    ret = requests.post(data=json.dumps(xxx))
    print repr(ret.text)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   878 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 204ms · UTC 20:13 · PVG 04:13 · LAX 13:13 · JFK 16:13
    ♥ Do have faith in what you're doing.