urlencode()'星号'(星号?)字符

eti*_*nne 16 php java urlencode

我正在测试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()过 - 没有运气.

aio*_*obe 10

*在URL中可以有一个(但是也可以以编码形式使用它).

RFC1738:统一资源定位符(URL)指出以下内容:

版权所有:

[...]

当八位字节由一个字符表示并且在编码时,URL通常具有相同的解释.但是,保留字符不是这样:编码为特定方案保留的字符可能会更改URL的语义.

因此,只有字母数字,特殊字符"$-_.+!*'(),"和用于其保留目的的保留字符可以在URL内未编码使用.

另一方面,不需要编码的字符(包括字母数字)可以在URL的方案特定部分内编码,只要它们不用于保留目的即可.

  • Java和PHP之间的唯一区别似乎是星号:PHP使用`%2A`,而Java使用**。 (2认同)

You*_*You 7

维基百科建议,当涉及到URI时,它*是一个保留字符,如果不用于保留目的,它必须进行编码.根据RFC3986,第12-13页:

URI包括由"保留"集中的字符分隔的组件和子组件.这些字符称为"保留",因为它们可能(或可能不)通过通用语法,每种特定于方案的语法或URI的解除引用算法的特定于实现的语法定义为分隔符.如果URI组件的数据与保留字符作为分隔符的目的冲突,则冲突数据必须在形成URI之前进行百分比编码.

  reserved    = gen-delims / sub-delims

  gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

  sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="
Run Code Online (Sandbox Code Playgroud)

(URL RFC仍允许*字符进行未编码的事实是,没有保留的目的i URL,因此不必编码.所以你必须编码或不编码取决于什么你正在创建的那种URI.)

  • `urlencode`和`java.net.URLEncoder`表示他在URL之后. (2认同)