+ -
当前位置:首页 → 问答吧 → Tornado获得GET参数时中文的编码问题

Tornado获得GET参数时中文的编码问题

时间:2011-07-17

来源:互联网

先说一下环境
Tornado:2.0 Python:2.7.1

一个很简单的程序
#coding:utf-8

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        s = self.get_argument('name', '')
        self.write(s)

application = tornado.web.Application([
    (r"/", MainHandler),
], debug=True)

if __name__ == "__main__":
    application.listen(888
    tornado.ioloop.IOLoop.instance().start()

以上程序运行时,在FireFox里打开“http://127.0.0.7:8888/?name=测试”,FireFox自动将其
urlencode,变成“http://127.0.0.7:8888/?name=%B2%E2%CA%D4”
页面返回500错误,Trackback:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb2 in position 0:
invalid start byte

现在换成IE打开,地址同样是“http://127.0.0.7:8888/?name=测试”,IE并没有自动将其urlencode,同样
Tornado也未报错,页面返回“²âÊÔ”(乱码),而不是想要的结果。

下面的研究针对于IE,因为使用FireFox连一个完整的请求都无法完成(返回500并抛出异常)

经检查,IE的编码被自动设置为UTF-8,完全正确。因为上面的self.get_argument函数的文档里已经很明确的写到“Return
value are always Unicode”

考虑到Python内部的Unicode实际上是UTF-16的实现,怀疑IE因此不能正确识别,于是将
s = self.get_argument('name', '')
修改为
s = self.get_argument('name', '').encode('utf-8')
乱码依旧,页面仍然显示“²âÊÔ”

请问各位,如何解决这两个问题?已经快被搞疯了,Tornado的代码翻了半天也没有发现问题所在。

作者: sundatong   发布时间: 2011-07-17

本帖最后由 106033177 于 2011-07-17 23:39 编辑

回复 sundatong
B2E2     CAD4实际上是gbk编码。utf-8编码的话应该是'\xe6\xb5\x8b\xe8\xaf\x95'。

作者: 106033177   发布时间: 2011-07-17

将python环境 编码 设置为 utf-8

作者: hiaio   发布时间: 2011-07-17