【发布时间】:2019-09-04 13:01:38
【问题描述】:
我正在使用 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个字节,尽管汉字发生了变化。
我对警告中的“编码”感到困惑。实际上,我对代码中的编码没有做任何事情,所以我认为 Tornado 在 RequestHandler 类中就是这样做的。但是由于 Tornado 默认使用 utf-8 编解码器,那么这个 latin-1 是从哪里来的呢?最重要的是,我该如何解决?
【问题讨论】:
-
警告是否来自
print而不是龙卷风?尝试在您的环境变量中设置 PYTHONIOENCODING=utf-8。 -
@BenDarnell 我在windows环境变量中添加了这个,问题依然存在。
-
@BenDarnell 即使我在处理程序中什么都不做,问题仍然存在
-
问题其实来自函数get_argument。如果存在编解码器错误,则无法获取正确的 POST 参数。我现在正在使用烧瓶来处理请求。我猜想使用带有 tornado WSGIContainer 的烧瓶会导致更多的开销,但至少它可以工作。
-
顺便说一句,我仍然收到有关“latin-1”编解码器的这些警告,但是尽管编解码器错误,flask 还是设法获得了正确的参数
标签: python python-3.x character-encoding tornado