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

cow*_*ert 11 python urlencode python-3.x

近期的文件urllib中指出:

在版本3.7中更改:从RFC 2396移至RFC 3986以引用URL字符串."〜"现在包含在保留字符集中.

为什么会这样?在RFC 3986中,~不是保留字符:

 reserved    = gen-delims / sub-delims

 gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

 sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
             / "*" / "+" / "," / ";" / "="
Run Code Online (Sandbox Code Playgroud)

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

2.3.未保留的角色

URI中允许但没有保留目的的字符称为unreserved.这些包括大写和小写字母,十进制数字,连字符,句点,下划线和波浪号.

 unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
Run Code Online (Sandbox Code Playgroud)

此外,后来,RFC声明(强调我的):

例如,对应于波浪号(​​"〜")字符的八位字节通常由较旧的 URI处理实现编码为"%7E" ;

所以看起来3.7是不一致的:它断言对新RFC的支持,同时回归处理~.(事实上​​,在较旧的RFC中,~也不是保留也不是' 不明智 ')

Nos*_*osh 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'_.-~')
Run Code Online (Sandbox Code Playgroud)