根据RFC1738,可以在URL中使用未编码的星号(*)":
因此,只有字母数字,特殊字符"$ -_.+!*'(),"和用于其保留目的的保留字符可以在URL中未编码使用.
然而,w3.org的命名和寻址材料表明,星号"保留用于在特定方案中具有特殊的重要性",并暗示它应该被编码.
此外,根据RFC3986,URL是一个URI:
术语"统一资源定位符"(URL)指的是URI的子集,其除了标识资源之外,还通过描述其主要访问机制(例如,其网络"位置")来提供定位资源的手段.
它还指定星号是"sub-delim",它是"保留集"的一部分,并且:
URI生成应用程序应对与保留集中的字符对应的数据八位字节进行百分比编码,除非URI方案明确允许这些字符表示该组件中的数据.
它还明确指定它更新RFC1738.
我将所有这些都理解为要求将星号编码在URL中,除非它们用于URI方案定义的特殊用途.
是RFC1738的HTTP URI方案标准基准?它是否以某种方式免除星号编码,或者由于RFC3986而在这方面是否过时?
维基百科说,"当没有保留目的时,他不需要对字符进行百分比编码." RFC1738是否删除了星号的保留用途?
各种资源和工具似乎在这个问题上分开了.
PHP urlencode和rawurlencode- 后者声称遵循RFC3986 - 对星号进行编码.
然而,JavaScript的escape和encodeURIComponent 不编码的星号.
并且Java URLEncoder 不对星号进行编码:
特殊字符"."," - ","*"和"_"保持不变.
流行的在线 工具(谷歌搜索"在线网址编码器"的前两个结果)也不编码星号.该URL编码和解码工具明确指出,"[T]他保留的字符只有在特定情况下进行编码." 它继续列出星号和&符作为保留字符.它编码&符号,但不编码星号.
Stack Exchange社区中的其他类似问题似乎有陈旧,不完整或难以令人信服的答案:
我正在测试PHP urlencode()与Java java.net.URLEncoder.encode().
Java的
String all = "";
for (int i = 32; i < 256; ++i) {
all += (char) i;
}
System.out.println("All characters: -||" + all + "||-");
try {
System.out.println("Encoded characters: -||" + URLEncoder.encode(all, "utf8") + "||-");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
PHP
$all = "";
for($i = 32; $i < 256; ++$i)
{
$all = $all.chr($i);
}
echo($all.PHP_EOL);
echo(urlencode(utf8_encode($all)).PHP_EOL);
Run Code Online (Sandbox Code Playgroud)
除了没有用Java编码的"星号"字符和PHP翻译为%2A之外,所有字符似乎都以相同的方式编码.哪个行为应该是'正确的',如果有的话?
注意:我也尝试rawurlencode()过 - 没有运气.
我在阅读有关此功能的书籍中似乎得到了相互矛盾的建议.我想知道是否有人可以澄清.例如,Nicholas Zakas声明函数参数具有格式函数的签名(match,pos,originalText)(P139:Pro JavaScript for Web Developers 2nd ed:Wrox)
他继续说当正则表达式有一个匹配时,函数会传递三个参数(如上所述).当有多个捕获组时,每个匹配的字符串作为参数传入,最后两个位置是position和originalText ...
然后我们来到Doug Crockfords,JavaScript:The Good Parts.(P90):他再次规定语法为字符串(searcValue,replaceValue)searchValue可以是一个正则表达式 - 很棒的匹配..如果replaceValue是一个函数,第一个参数是匹配的文本,那么第二个是捕获组1,第三个是捕获组2等等.这里有一个明显的区别.(即没有位置参数)
我还在查看Pro JavaScript设计模式(APress P152)中的一个示例,它启动了整个交叉引用过程.这些人(Ross Harmes/Dustin Diaz)用两个名为a&b的参数非常无益地指定了replaceValue函数.但它倾向于强化Doug Crockford描述的概念.
有人可以确认尼古拉斯扎卡斯的描述是否确实是一个有效的选择?
http ×1
java ×1
javascript ×1
php ×1
replace ×1
rfc ×1
string ×1
url ×1
url-encoding ×1
urlencode ×1