Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java urlencode()表示';星号';(明星?)性格_Java_Php_Urlencode - Fatal编程技术网

Java urlencode()表示';星号';(明星?)性格

Java urlencode()表示';星号';(明星?)性格,java,php,urlencode,Java,Php,Urlencode,我正在测试PHPurlencode()与JavaJava.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:

我正在测试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();
}
String all=”“;
对于(int i=32;i<256;++i){
全部+=(字符)i;
}
System.out.println(“所有字符:-| |“+All+”| |-”;
试一试{
System.out.println(“编码字符:-| |”+urlcoder.encode(全部,“utf8”)+“| |-”;
}捕获(不支持的编码异常e){
e、 printStackTrace();
}
PHP

$all = "";
for($i = 32; $i < 256; ++$i)
{
    $all = $all.chr($i);
}

echo($all.PHP_EOL);
echo(urlencode(utf8_encode($all)).PHP_EOL);
$all=”“;
对于($i=32;$i<256;++$i)
{
$all=$all.chr($i);
}
echo($all.PHP\u EOL);
echo(urlencode(utf8_encode($all)).PHP_EOL);
所有字符的编码方式似乎与这两个函数相同,除了“星号”字符不是由Java编码的,而是由PHP转换为%2A。哪种行为应该是“正确的”,如果有的话


注意:我也尝试过使用
rawurlencode()
,但运气不好。

在URL中使用
*
是可以的,(但也可以使用编码形式)

声明如下:

保留:

[……]

通常,当使用八位字节时,URL具有相同的解释 由字符表示,并在编码时使用。然而,这并非如此 保留字符为true:编码为保留字符保留的字符 特定方案可能会更改URL的语义

因此,只有字母数字,特殊字符
“$-!*”(),“
,以及 可以使用用于保留目的的保留字符 URL中未编码的

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

当涉及URI时,
*
是保留字符,如果不用于保留目的,则必须对其进行编码。根据第12-13页:

URI包括由分隔的组件和子组件 “保留”集中的字符。这些字符称为 “保留”,因为它们可以(也可以不)由定义为分隔符 通用语法,按每个方案特定的语法,或按 URI的解引用算法的特定于实现的语法。 如果URI组件的数据与保留的 字符作为分隔符的用途,则冲突数据必须 在形成URI之前编码的百分比

(仍然允许
*
字符未编码的事实是,is没有保留的用途i URL,因此不必进行编码。因此,您是否必须对其进行编码取决于您创建的URI类型。)

指的是HTML规范:

此类包含用于将字符串转换为
应用程序/x-www-form-urlencoded
MIME格式的静态方法。有关HTML表单编码的更多信息,请参阅HTML规范

关于这个问题非常不清楚,并提到,aioobe引用了:

控件名称和值被转义。空格字符替换为“+”,然后按照[RFC1738]第2.2节所述对保留字符进行转义:非字母数字字符替换为“%HH”,一个百分号和两个十六进制数字表示字符的ASCII码。换行符表示为“CR LF”对(即“%0D%0A”)

但是,直接声明不应对
*
进行编码:

  • 如果字符不在U+0020、U+002A、U+002D、U+002E、U+0030到U+0039、U+0041到U+005A、U+005F、U+0061到U+007A的范围内
    用如下格式的字符串替换字符:
  • 否则
    让角色保持原样

请您在页面中引用
*
应该编码的内容,好吗?@aioobe:Done。URL和URI RFC之间似乎存在差异,URL RFC实际上覆盖了URI RFC要求编码
*
。因此,答案实际上取决于您创建的URI的类型。
urlencode
java.net.URLEncoder
表明他在查找URL。RFC3986明确声明它更新了RFC1738,因此我认为任何不一致性都会得到有利于RFC3986的解决。RFC3986说URL是URI的一个示例,如果URI必须编码星号,那么URL也应该编码。但是不同的在线工具做这件事的方式不同(参见,例如,和)+1,事实上,与集合
$-.+!*'(),
,Java只使用未编码的形式的
-..*
:Java和PHP之间的唯一区别似乎是星号:PHP使用
%2A
,而Java使用
*
。我请a尝试获得更全面的答案。
  reserved    = gen-delims / sub-delims

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

  sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="