最多recent documentation for urllib
个状态:
版本3.7中的更改:从RFC 2396移至RFC 3986,以引用URL字符串。现在,保留字符集中已包含“〜”。
为什么会这样?在RFC 3986中,~
不是保留字符:
reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
在the next section中明确地将其作为未保留字符包括在内:
2.3。保留字符
URI中允许但没有保留的字符 目的被称为无保留。这些包括大写和小写 字母,十进制数字,连字符,句号,下划线和波浪号。
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
此外,later on,RFC指出(强调我的意思):
例如,较旧的 URI处理实现通常将与波浪号(“〜”)相对应的八位字节编码为“%7E”;
因此3.7似乎不一致:它断言了对较新RFC的支持,同时使~
的处理退步了。 (实际上,在older RFC中,~
也不保留,也不是'unwise'))
答案 0 :(得分:2)
已在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'_.-~')