import java.net.*;
public class TestURI {
public static void main(String args[]) throws URISyntaxException
{
String first = new String("foo");
String second = new String("bar");
String third = new String("[space or another space]");
URI temp = new URI(first, second, third);
System.out.println(temp.getFragment());
}
}
当我在JDK 1.4中运行上面的代码时,我得到了
[空间或其他空间]
当我在JDK 1.5 / 1.6中运行相同的代码时,我得到以下内容:
[空间%20or%20another%20space]
有人能告诉我改变了什么吗?
谢谢, 拉吉
修改:
如果我执行以下操作,则可以:
import java.net.*;
public class TestURI {
public static void main(String args[]) throws URISyntaxException
{
String first = new String("foo");
String second = new String("bar");
String third = new String("[space or another space]").replaceAll("\\[", "leftSB").replaceAll("\\]", "rightSB");
URI temp = new URI(first, second, third);
System.out.println(temp.getFragment().replaceAll("leftSB", "\\[").replaceAll("rightSB", "\\]"));
}
}
答案 0 :(得分:1)
看起来这些空间已经过URI编码。
%20
是ASCII空格字符的十六进制格式。
我认为空间在片段标识符中是非法的,Java 1.4中的实现不知道。
来自class documentation,我强调:
RFC 2396允许转义的八位字节出现在用户信息,路径,查询和片段组件中。 转义在URI中有两个用途:
当要求URI严格遵守RFC 2396时,要编码非US-ASCII字符 不包含任何其他字符。
引用组件中非法的字符。用户信息,路径,查询, 和片段组件在哪些字符被认为是合法的方面略有不同 和非法的。
这个目的在本课程中由三个相关的操作提供:
- 通过将字符替换为转义的八位字节序列,编码 表示UTF-8字符集中的该字符。 [...]
- 通过编码非法字符引用。 例如,空格字符是 引用替换为“%20”。 [...]
- 一系列转义八位字节已解码,将其替换为字符序列 表示UTF-8字符集。 [...]
这些操作在此类的构造函数和方法中公开,如下所示:
单参数构造函数[...]
多参数构造函数根据组件的要求引用非法字符 它们出现在哪里。百分比字符('%')始终由这些构造函数引用。 保留任何其他字符。
- ...
getUserInfo
,getPath
,getQuery
,getFragment
,getAuthority
和getSchemeSpecificPart
方法解码其相应组件中的任何转义八位字节。这些字符串返回的字符串 方法可能包含其他字符和非法字符,并且不包含任何转义 八位位组。
之后您正在使用三参数构造函数和getFragment
方法。它看起来应该再次解码空间,但事实并非如此。这可能是一个错误,但Sun Bug数据库现在似乎处于脱机状态,所以我无法真正检查这个。