从 flask 的 request.form 中取得值之后,怎样作 urldecode?

2016-11-19 16:01:01 +08:00
 72vc48
一个表单需要提交一个中文字符,如 astr=%E6%88%91%E4%BB%AC%E5%A4%A7%E5%AE%B6 ,原字符是“我们大家”, UTF-8 编码,然后在视图函数中用 request.form['astr']取得的值也是这个%E6%88%91%E4%BB%AC%E5%A4%A7%E5%AE%B6 ,我想用 urllib.unquote(),结果返回的字符串类型竟然是 unicode ,并且已经是乱码了,求解怎样进行 urldecode 合适?
3906 次点击
所在节点    Python
8 条回复
72vc48
2016-11-19 16:03:02 +08:00
s = urllib.unquote(request.form['astr'])
assert type(s) == unicode
sun1991
2016-11-19 16:49:34 +08:00
以下是我在 py2 上的测试结果, 你用的是 py3?

Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:19:22) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ss = '%E6%88%91%E4%BB%AC%E5%A4%A7%E5%AE%B6'
>>> import urllib
>>> s = urllib.unquote(ss)
>>> s
'\xe6\x88\x91\xe4\xbb\xac\xe5\xa4\xa7\xe5\xae\xb6'
>>> s.decode('utf8')
u'\u6211\u4eec\u5927\u5bb6'
>>> print(s.decode('utf8'))
我们大家
>>> type(s)
<type 'str'>
>>>
72vc48
2016-11-19 17:00:01 +08:00
@sun1991
我用的是 Python 2.7.11 。
我在 shell 里边试验是和你的试验结果一样的,但是到了 flask 的视图函数中,情况就不同了。 urllib.unquote()的结果竟然已经是 unicode
banxi1988
2016-11-19 17:15:40 +08:00
Flask 默认已经使用 utf-8 编码对 请求参数(如 Query 参数) 进行了 utf-8 解码.
并且已经进行了 url_unquote_plus 操作了.
你要测试也是侧重在 Flask 环境下测试解决问题.
在 Python 或 iPython 上直接对原始字符串进行操作.场景不一样.
72vc48
2016-11-19 17:17:32 +08:00
搞定。分享一下。从 request.form 中取得的值,是 unicode 的,作为参数传给 urllib.unquote(), urllib.unquote 就会返回 unicode 类型的字符串。那么只要 request.form['astr'].encode('ascii')一下,再传进去,就能返回 str 类型了(在这里其实是 utf-8 编码)。
72vc48
2016-11-19 17:20:36 +08:00
@banxi1988 一开始我也以为是环境不同,结果是传参类型的问题。花掉我一下午的时间。。。
jimzhong
2016-11-19 17:41:42 +08:00
py3 里面好像会自动解码
72vc48
2016-11-19 17:48:40 +08:00
@jimzhong 有机会试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/321704

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX