String JDK1.4与JDK1.5中java URI的变化

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 {

当我在JDK1.4中运行上述代码时,我得到

[空间或其他空间]

当我在JDK 1.5/1.6中运行相同的代码时,我得到以下结果:

[空间%20或%20其他%20空间]

谁能告诉我发生了什么变化

谢谢, 拉吉

编辑

如果我执行以下操作,它会起作用:

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", "\\]"));

   }
}