因此,在URL中只能未编码使用字母数字、特殊字符"$-_.+!*'()"和用于其保留目的的保留字符。
但是,w3.org的命名和寻址材料指出,星号“保留用于在特定方案中具有特殊意义”,并暗示应对其进行编码。
另外,根据RFC3986,URL是URI的一种:
术语“统一资源定位符”(URL)指的是URI的子集,除了标识资源外,还提供了通过描述其主要访问机制(例如,其网络“位置”)来定位资源的手段。
它还指定星号是“子分隔符”,属于“保留集”中的一部分,并且:
URI生成应用程序应该对与保留集中的字符对应的数据八位组进行百分号编码,除非这些字符明确允许URI方案在该组件中表示数据。
它还明确指定更新了RFC1738。
我理解为URL中需要对星号进行编码,除非它们用于URI方案定义的特殊目的。 RFC1738是否是HTTP URI方案的规范参考?它是否豁免星号编码,或者由于RFC3986而在这方面过时?
维基百科 表示:“当字符没有保留用途时,不需要进行百分比编码。”那么 RFC1738 是否取消了星号的保留用途?
各种资源和工具在这个问题上存在分歧。
PHP 的 urlencode
和 rawurlencode
-- 后者声称遵循 RFC3986 -- 对星号进行编码。
然而,JavaScript 的 escape
和 encodeURIComponent
不对星号进行编码。
Java 的 URLEncoder
不对星号进行编码:
特殊字符 ".", "-", "*", 和 "_" 不改变。
常用的在线 工具(通过Google搜索“online url encoder”得到的前两个结果)也不对星号进行编码。URL 编码与解码工具 明确指出:“只有在特定情况下才需要对保留字符进行编码。”它接着列出了星号和和符号作为保留字符。它对符号进行了编码,但没有对星号进行编码。
在Stack Exchange社区中,其他类似的问题似乎有过时、不完整或不令人信服的答案:
- urlencode() '星号'(*)字符 这个问题突出了Java和PHP对星号的处理方式的差异,并问哪一个是“正确”的。被接受的答案 只引用了 RFC1738,没有提到更近期的 RFC3986 并解决了这个矛盾。另一个答案 承认了差异,并建议星号在URL中特别不同于其他URI,但它并没有为这个结论提供具体的权威来源。
- URL可以有星号吗?一个答案 仅引用了旧的 RFC1738 和 被接受的答案 暗示当作为分隔符时它是可接受的,这可能是“保留目的”。
- 我能在URL中使用星号吗? 被接受的答案 似乎不鼓励使用星号,但没有澄清使用的规则。另一个答案 说你可以使用星号“因为它是一个保留字符”。但如果你只是为了保留目的使用它,那是否正确呢?
- 转义URL中的特殊字符 一个答案 指出“关于星号是否必须在URL中编码存在一些歧义”。我试图通过这个问题解决这个歧义。
- Spring UriUtils 和 RFC3986 这个问题指出UriUtil的
encodeQueryParam
声称遵循RFC3986,但它不对星号进行编码。截至2014-08-01 12:50 PM CDT,没有回答这个问题。 - 如何在JavaScript中编码URL? 这似乎是Stack Overflow上经典的JavaScript URL编码问题,尽管答案指出星号被排除在各种方法之外,但它们并没有解决它们是否应该被排除的问题。