JDK 1.4与JDK 1.5中的java URI更改

时间:2011-07-26 17:33:07

标签: string uri java

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

   }
}

1 个答案:

答案 0 :(得分:1)

看起来这些空间已经过URI编码。

%20是ASCII空格字符的十六进制格式。

我认为空间在片段标识符中是非法的,Java 1.4中的实现不知道。

来自class documentation,我强调:

  

RFC 2396允许转义的八位字节出现在用户信息,路径,查询和片段组件中。   转义在URI中有两个用途:

     
      
  • 当要求URI严格遵守RFC 2396时,要编码非US-ASCII字符   不包含任何其他字符。

  •   
  • 引用组件中非法的字符。用户信息,路径,查询,   和片段组件在哪些字符被认为是合法的方面略有不同   和非法的。

  •   
     

这个目的在本课程中由三个相关的操作提供:

     
      
  • 通过将字符替换为转义的八位字节序列,编码   表示UTF-8字符集中的该字符。 [...]
  •   
  • 通过编码非法字符引用例如,空格字符是   引用替换为“%20”。 [...]
  •   
  • 一系列转义八位字节已解码,将其替换为字符序列   表示UTF-8字符集。 [...]
  •   
     

这些操作在此类的构造函数和方法中公开,如下所示:

     
      
  • 单参数构造函数[...]

  •   
  • 多参数构造函数根据组件的要求引用非法字符   它们出现在哪里。百分比字符('%')始终由这些构造函数引用。   保留任何其他字符。

  •   
  • ...
  •   
  • getUserInfogetPathgetQuerygetFragmentgetAuthoritygetSchemeSpecificPart   方法解码其相应组件中的任何转义八位字节。这些字符串返回的字符串   方法可能包含其他字符和非法字符,并且不包含任何转义   八位位组。
  •   

之后您正在使用三参数构造函数和getFragment方法。它看起来应该再次解码空间,但事实并非如此。这可能是一个错误,但Sun Bug数据库现在似乎处于脱机状态,所以我无法真正检查这个。