龙卷风无效的 x-www-form-urlencoded 正文:'latin-1' 编解码器无法对位置 774-777 中的字符进行编码:序号不在范围内 (256)

Tornado Invalid x-www-form-urlencoded body: 'latin-1' codec can't encode characters in position 774-777: ordinal not in range(256)

我正在使用 tornado 来接受一些我无权访问的客户端发送的数据。如果数据中只出现英文字符,一切正常。当数据中包含 utf-8 编码的汉字(3 个字节)时,Tornado 会给我这个警告,并且 'get_argument' 函数根本无法获取任何内容。

我调试并简化了我的代码,但仍然出现警告

class DataHandler(tornado.web.RequestHandler):
    def post(self):
        print("test")
        print(self.get_argument("data"))
        print("1")

application = tornado.web.Application([
    (r"/data", Data),
])

application.listen(5000)
tornado.ioloop.IOLoop.instance().start()

数据格式如下:

data={"id":"00f1c423","mac":"11:22:33:44:55:66"}

数据是 x-www-form-urlencoded 的,WireShark 显示汉字是完美的 3 字节 utf-8,以 E(1110) 开头。警告中提到的位置(774-777)是汉字开始的位置,尽管汉字发生变化,但始终为5个字节。

我对警告中的 'encode' 感到困惑。实际上我在我的代码中没有做任何关于编码的事情,所以我认为这是 Tornado 在 RequestHandler class 中所做的事情。但是由于 Tornado 默认使用 utf-8 编解码器,那么这个 latin-1 是从哪里来的呢?最重要的是,我该如何修复它?

这将不再是问题。 Tornado 做了一些更改以支持 x-www-form-url 编码的主体,其值由未 url 编码为 ascii 的编码字节组成。

参见:tornado merge request

另外:github issue #2733