我偶然发现了一个奇怪的 Unicode
Flask 中的 URL 编码问题。
@app.route("/it2/<string:name>")
def render_it2(name=""):
name = _fix_encoding(name)
return _render_file("it2", name)
When name
包含 Unicode 字符,
它们被解码为iso-8859-1
代替utf-8
.
所以我必须添加_fix_encoding
功能:
def _fix_encoding(string):
return string.encode('iso-8859-1').decode('utf8')
我知道这是肮脏的黑客,
这就是为什么我想问 Flask/Werkzeug 大师,
我的设置有什么问题吗?为了让 URL 已经以 UTF-8 解码,我应该更改什么,这样就不需要这种丑陋的重新编码?
SO 有很多类似的问题/答案,但没有真正有用的答案,例如:
- 如何在 Flask python 中路由非 ascii URL https://stackoverflow.com/questions/49847076/how-to-route-non-ascii-urls-in-flask-python
我想应该有一些环境变量,或者一些影响默认 Flask 编码的配置选项。
我有以下内容LANG
/LC_*
在该主机上:
$ echo $LANG
en_US.UTF-8
$ export | grep LC
declare -x LC_ADDRESS="en_US.UTF-8"
declare -x LC_IDENTIFICATION="en_US.UTF-8"
declare -x LC_MEASUREMENT="en_US.UTF-8"
declare -x LC_MONETARY="en_US.UTF-8"
declare -x LC_NAME="en_US.UTF-8"
declare -x LC_NUMERIC="en_US.UTF-8"
declare -x LC_PAPER="en_US.UTF-8"
declare -x LC_TELEPHONE="en_US.UTF-8"
declare -x LC_TIME="en_US.UTF-8"
No iso-8859-1
任何。它从何而来?
哪个应用程序/代码/网页创建了嵌入“名称”的 URL?
在生成的 HTTP 标头中,“name”已经是 utf-8 编码,但框架的 HTTP 端被告知它是 latin1。您看不到那么多,因为通常 URL 使用“%HH”进行转义 - 其中“HH”是 UTF-8 序列中的字节。如果可以的话,更改 URL 的来源以正确转义它们(在 Python 中,对此的调用将是urllib.parse.quote(url)
).
在此处查看官方 URL 规范,从会话 2.1 到 2.5:https://www.rfc-editor.org/rfc/rfc3986#section-2.1 https://www.rfc-editor.org/rfc/rfc3986#section-2.1
显然,没有标准方法来告诉 HTTP 服务器组件(在 Python 端、WSGI 层和 Flask 本身)哪个是 URL 本身的文本编码 - 并且这些组件假设为 Latin-1(又名 iso-8859-) 1) 对于 utf-8 数据使用的 ASCII 集之外的字节。
最后 - 如果不能选择在源中引用 URL,那么您的方法就足够了。你可能会更好地保护你的_fix_encoding
函数针对格式错误的 utf-8 数据,否则您的应用程序将失败。 (只需添加一个errors="replace"
调用中的参数.decode
会做)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)