日期:2014-05-18  浏览次数:20808 次

通过java发现的一个关于IE发送HTTP协议的一个很奇怪的问题,请大家指教
我用java语言编写了一个接收并且显示IE发送的http请求的程序,主要是测试IE究竟是以怎样的编码发送HTTP的头部以及消息体。为了测试,我在URL路径中以及用户的请求参数中都加入了中文字符。选用的字符集如下:

        我测试了四种字符集,分别是GB18030,UTF-8,UTF16(UCS2,大尾,即低位存放高位字节),   unicode(UCS2,小尾,即低位存放在低位字节)。在这其中,GB18030和UTF-8都将字母等ASCII字符用单字节编码,而UTF16以及unicode都将ASCII字符用双字节编码(高位字节补零)。

大家都知道IE中有一个选项,就是“总是以UTF-8发送URL”,现在对这个选项进行测试。

1,选中该选项(默认方式):

        不论页面采用什麽编码,URL路径中的中文字符统一用UTF-8进行编码,然后进行URL编码。

        而对于请求参数中的中文字符,又分了两种情况:
       
                1,如果页面采用的是java语言中默认的unicode字符集编码或者是UTF16,则将请求参数中的中文字符仍用UTF-8编码,然后进行URL编码。
 
                2,如果页面采用的是其他字符集,则将请求参数中的中文字符按照页面采用的字符集进行编码,然后进行URL编码。

2,不选该选项:
       
                1,如果页面采用的是GB18030编码,URL路径中的中文字符用GB18030进行编码,然后直接发送,而请求参数中的中文字符用GB18030进行编码,然后进行URL编码。
               
                2,如果页面采用的是UTF-8编码,与选中“总是以UTF-8发送URL”选项相同。
               
                3,如果页面采用的是UTF16编码,路径以及请求参数中的中文字符都用UTF-8进行编码,然后进行URL编码。
               
                4,   如果页面采用的是unicode编码,URL中的中文用GB18030进行编码,然后直接发送,而而请求参数中的中文字符用UTF-8进行编码,然后进行URL编码。
               

接收HTTP请求的源代码很简单,有两个版本,如下:

                                (打印收到的字符:)
                                ServerSocket   ss   =   new   ServerSocket(80);
    Socket   so   =   ss.accept();
    InputStream   is   =   so.getInputStream();
    BufferedReader   br   =   new   BufferedReader(new   InputStreamReader(is, "GB18030 "));
    String   str;
    while((str   =   br.readLine())   !=   null)
        System.out.println(str);
       
  (打印收到的字节:)
                              ServerSocket   ss   =   new   ServerSocket(80);
    Socket   so   =   ss.accept();
    InputStream   is   =   so.getInputStream();
    BufferedReader   br   =   new   BufferedReader(new   InputStreamReader(is, "GB18030 "));
    int   i   =   0;
    while((i   =   is.read())   !=   -1)
        System.out.print(i+ "   ");
    System.out.flush();


我觉得IE发送HTTP请求编码方案很怪,不明白为何会这样?

------解决方案--------------------
这个我也不太明白,帮顶,期待牛人来解答下。
------解决方案--------------------
那里奇怪啊 就是要这样啊
------解决方案--------------------
原因不清楚,硬性记住就是必要的了.
------解决方案--------------------