Python:为什么是“~”;现在包含在urllib.parse.quote()中的保留字符集中?
大多数国家: 在版本3.7中更改:从RFC 2396移动到RFC 3986,用于引用URL字符串。“~”现在包含在保留字符集中 为什么会这样?在中,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处理实
~
不是保留字符:
显式地包含在其中,作为非保留字符:
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'_.-~')