人若无名,便可专心练剑

 http 标签

继上一篇文章 http get乱码 问题(彻底释疑)

  |   0 评论   |   2,277 浏览

做j2ee开发已差不多两年了,昨天遇到的问题真的还是纳闷了呢,也算是第一次遇到,可能以前都用post中文了,网上搜了哈,没什么可信的答案

 :-) 为什么只支持iso 8859-1 呢?

疑惑,于是呼,想到了自己买的一个web方面的书未怎么看,回去找找可能有什么要找的答案呢。

正如我所料果然上面有。

:呵呵,于是乎就有了这篇文章


主要原因:

浏览器编码问题:

常用系统一些常用编码无法满足所有字符的表示(参看很多字符根本就不是拉丁体系字母表的),而系统常用ascii表示字符集,so,so 问题出现了

为了解决几乎所有字符集的展示,于是产生了各种8位代码页,使用的是各种高位字符集:ISO 8859-1 CP850 和用于西欧语言体系的windows 1252

;用于东欧和中欧体系iso 8859-2 ,CP 852 windos 1250 ;用于俄文的KOI 8-R windows 1251.。而有些预言字符远非256个字符空间能表示,于是

就产生了一些宽字节编码方式。于是乎产生了另外一种编码格式:uncode以及其改进版本utf-8 ,理论上来说utf-8对于传统8位格式编码应用是安全的。

然而这编码诞生原落后相关web协议的固定基础成型时间,因此就出现另外一种情况。

浏览器开发商似乎有点不知所措,而且没有一个统一的解决方案,于是浏览器一般都会将url的路径信息部分进行内部转码UTF-8(甚至如有可能,

只按照ISO 8859-1 格式编码以及解析),而查询字符部分则按照当前编码进行编码

:-),我们来看看get方式请求吧

 对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://lwww.c2y2.org/admin-index.do?a=1&b=2,而如果查询字段部分不是常用的拉丁字符,那么乱码就会出现,因此浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字 符串 "%82" 表示,其中82为该字节的两位十六进制表示形式。

这里说的可能不清楚,具体介绍可以看下java.net.URLEncoder类的介绍在这里。了解了 URL encode的过程,我们能看到2个很重要的问题,

第一:需要URL encode的字符一般都是非ASCII的字符(即非拉丁字符),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;

第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置 浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用 javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。 {附注:这里会将这个编码统一转为一种格式,最后都会被转为 8859_1这种格式,也就是说接收到的都是8859-1格式的.}完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说 几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.....的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。 

另外一个关键的就是对于我们服务器端接受信息来说,我们自己的服务器没有特别设置url编码的化url

一般都会采用iso8859-1 进行编码,因此我们接收到数据后需按照如下去值

String chinese = request.getParameter ("chinese" )
chinese = new String(chinese.getBytes( "iso8859-1"),"utf8" )


1,相当于我们url信息部分进行url decode 按照iso8859-1

2,后面哪个utf8 是我们页面对信息部分进行的编码


来个总结性的吧:

从form get提交数据到后台接收,并显示

1,提交form (浏览器对url进行utf-8 编码,如:http://www.baidu.com ,对于查询字段部分 如"abc=123&nam=乱码 "按照当前页面编码进行编码)

2,服务器端,如果没有设置特定的url编码:一般会进行iso 8859-1 再次进行编码(此时是整个url)

3,服务器端接收数据:

                        String chinese = request.getParameter ("chinese" )//此时是乱码的

                        解码:两步

                                0x1,按iso 8859-1 进行解码,获取二进制字节

                                ox2 将上一步获取到的二进制字节 按页面上的编码生成相应的信息(此时信息还原,一般都不会乱码拉)




后记:哎,看来没有一个统一的规则,真的很乱(浏览器百家争鸣),呵呵,规则,规定,制度,要是生活中没有了这些,社会将会是怎样的呢!!!!!