String JDK1.4与JDK1.5中java URI的变化
当我在JDK1.4中运行上述代码时,我得到 [空间或其他空间] 当我在JDK 1.5/1.6中运行相同的代码时,我得到以下结果: [空间%20或%20其他%20空间] 谁能告诉我发生了什么变化 谢谢, 拉吉 编辑: 如果我执行以下操作,它会起作用:String JDK1.4与JDK1.5中java URI的变化,string,uri,java,String,Uri,Java,当我在JDK1.4中运行上述代码时,我得到 [空间或其他空间] 当我在JDK 1.5/1.6中运行相同的代码时,我得到以下结果: [空间%20或%20其他%20空间] 谁能告诉我发生了什么变化 谢谢, 拉吉 编辑: 如果我执行以下操作,它会起作用: import java.net.*; public class TestURI { public static void main(String args[]) throws URISyntaxException {
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());
}
}
看起来这些空间是URI编码的
%20
是ASCII空格字符的十六进制格式
我假设片段标识符中的空格是非法的,Java 1.4中的实现不知道
我强调的是:
RFC2396允许转义八位字节出现在用户信息、路径、查询和片段组件中。
转义在URI中有两个用途:
- 当URI需要严格符合RFC 2396时,对非美国ASCII字符进行编码 不包含任何其他字符
- 引用组件中非法的字符。用户信息、路径、查询、, 片段成分在哪些字符被认为是合法的方面略有不同 而且是非法的
- 一个字符的编码方式是将其替换为 在UTF-8字符集中表示该字符。[……]
- 非法字符仅通过编码引用例如,空格字符是 将其替换为“%20”引用。[……]
- 转义的八位字节序列是通过将其替换为所需的字符序列来解码的 在UTF-8字符集中表示。[……]
- 单参数构造函数[…]
- 多参数构造函数根据组件的要求引用非法字符 它们出现在其中。这些构造函数始终引用百分比字符(“%”)。 任何其他字符都将被保留
,getUserInfo
,getPath
,getQuery
,getFragment
和getAuthority
方法对其相应分量中的任何逃逸八位元进行解码。这些函数返回的字符串 方法可以同时包含其他字符和非法字符,并且不包含任何转义字符 八位组getSchemeSpecificPart
之后,您将使用三参数构造函数和
getFragment
方法。看起来它应该再次解码这些空格,但事实并非如此。这可能是一个bug,但Sun bug数据库现在似乎处于脱机状态,因此我无法真正检查此问题。谢谢。问题似乎是,任何给定给URI构造函数的字符串(其中包含[])都不会被getFragment函数解码。一个可能的原因是[]是保留字符:保留所有点状字符以及字符串“/[]@”中的字符
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", "\\]"));
}
}