通过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请求编码方案很怪,不明白为何会这样?
------解决方案--------------------这个我也不太明白,帮顶,期待牛人来解答下。
------解决方案--------------------那里奇怪啊 就是要这样啊
------解决方案--------------------原因不清楚,硬性记住就是必要的了.
------解决方案--------------------