Python:为什么"~"现在包含在urllib.parse.quote()中的保留字符集中



urllib的最新文档说明:

在3.7版本中更改:从RFC 2396移动到RFC 3986,用于引用URL字符串。"~"现在包含在保留字符集中。

为什么会出现这种情况?在RFC 3986中,~不是保留字符:

reserved    = gen-delims / sub-delims
gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="

在下一节中,它被明确地包含为一个未保留的字符:

2.3.不保留字符

URI中允许但没有保留的字符目的被称为无保留的。其中包括大写和小写字母、十进制数字、连字符、句点、下划线和波浪号。

unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"

此外,稍后,RFC声明(emphasis mine(:

例如,波浪号("~"(字符对应的八位字节通常编码为"%"7E";通过旧的URI处理实现;

因此,3.7似乎不一致:它断言对较新RFC的支持,同时回归对~的处理。(事实上,在旧的RFC中,~也不是保留的,也不是"不明智的"(

在中跟踪并关闭了此错误https://bugs.python.org/issue16285

事实上,最新版本的代码反映了这些变化。

参考https://github.com/python/cpython/blob/master/Lib/urllib/parse.py

_ALWAYS_SAFE = frozenset(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
b'abcdefghijklmnopqrstuvwxyz'
b'0123456789'
b'_.-~')

最新更新