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'_.-~')