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

时间:2018-07-14 00:27:19

标签: python python-3.x urlencode

最多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'))

1 个答案:

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