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

Python:为什么是“~”;现在包含在urllib.parse.quote()中的保留字符集中?,python,python-3.x,urlencode,Python,Python 3.x,Urlencode,大多数国家: 在版本3.7中更改:从RFC 2396移动到RFC 3986,用于引用URL字符串。“~”现在包含在保留字符集中 为什么会这样?在中,~不是保留字符: 显式地包含在其中,作为非保留字符: 2.3。无保留字符 URI中允许但没有保留名称的字符 目的被称为无保留。这些包括大写和小写 字母、十进制数字、连字符、句点、下划线和波浪号 unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" 此外,RFC声明(重点): 例如,旧的URI处理实

大多数国家:

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

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

显式地包含在其中,作为非保留字符:

2.3。无保留字符

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

 unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
此外,RFC声明(重点):

例如,旧的URI处理实现通常将对应于波浪号(~)字符的八位字节编码为“%7E”


因此,3.7似乎是不一致的:它声明支持较新的RFC,同时回归
~
的处理。(事实上,在中,
~
也不是保留的,也不是“”)

此错误在中被跟踪并关闭

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

参考号


urllib.parse.quote(“~”)
实际上产生的是
“~”
而不是
%7E
,因此它绝对不是保留的。然而,
urllib.parse.quote('ñ')
产生
'%C3%B1'
reserved=“;”/“|”?”:“|”@“|”;”&“|”=“|”+“|”$”、“|”~”
,但没有详细的解释。看起来好像有人误读了报告,但报告中没有。作者要求将
~
添加到安全字符的显式列表中,如
-
,因此
引用('/~connolly')
将停止产生
'/%7econolly/'
。但它被添加到保留字符列表中,而不是安全字符列表中。(尽管最终的问题最终还是解决了,不知何故?)不,文档代表了预期的功能,也就是说,
~
不应该被编码。但是,代码不正确,现已修复。所以最新的代码确实遵循了RFC3986,就像文档中说的那样。嗯?文档中说“~”是保留的,但实际上不应该保留,正如RFC和代码所示。
 unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
_ALWAYS_SAFE = frozenset(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                     b'abcdefghijklmnopqrstuvwxyz'
                     b'0123456789'
                     b'_.-~')