request与response的编码和解码
既然不能通过编写代码的方式来更改解码方式,那怎么解决这个问题呢?其解决办法就是反编码,即,我们先对通过request.getParameter("参数");等函数得到的数据进行ISO-8859-1方式解码,然后把得到的字节再通过UTF-8解码,就得到了。其代码为:String str = new String(request.getParameter("参数").getBytes("ISO-8859-1"), "UTF-8");
一中文论码问题出现的由来
之所以会产生乱码问题,不仅仅是中文乱码,其原因就在于:编码和解码采用了不同的码表。而之所以会有编码和解码这一回事,也是因为,无论数据是在传输还是存储等等过程中,都是以字节的方式在运行,所以就有了编码问题,又因为技术发展,各国国情等等各方面的因素导致了这个世界上产生了很多种编码方式。
二常见的编码方式
1ISO-8859-1拉丁编码,供西方那帮哥们用的,里面压根就没有中文编码,所以使用了ISO-8859-1编码,不用说,一定会乱。
2GBK,GB2312这是中国的国标码,目前中国境内的浏览器的默认编码就是GBK;
3UTF-8由于编码太多了,不利于统一,就产生了2个或4个字节的Unicode编码,这种编码方式支持全世界各个国家的编码,所以编写程序,一般就选择UTF-8了,万国码嘛,没办法。
三response乱码问题
response响应对象,可以向客户端输出响应正文,response中提供了两个两个响应流,分别是字符响应流和字节响应流。其中字符响应流只能用来输出字符,而字节响应流可以用来输出任何东西。
1字符流问题
对于字符响应流而言,其字符响应流的默认编码方式是ISO-8859-1,所以当我们在使用字符流来输出中文的时候,如果不更改编码方式,那肯定乱码,那如何来解决中文乱码问题呢?
解决方案:
a:设置response的字符流的编码方式为UTF-8;其代码为:response.setCharacterEncoding("UTF-8");
b:设置浏览器解码是用UTF-8的码表来解码;其代码为:response.setHeader("content-type", "text/html;charset=UTF-8"); 但是在设置了response.setHeader("content-type", "text/html;charset=UTF-8");其实不用书写response.setCharacterEncoding("UTF-8");因为前面的那句代码不仅设置了浏览器的解码方式,与此同时,也设置了服务器的编码方式。还有一种简便的书写方式为:response.setContentType("text/html;charset=UTF-8");这句代码也是在设置了浏览器的解码方式的同时也设置了服务器段的编码方式,所以一般采用这种代码书写方式。
2字节流问题
对于字节响应流而言,其默认的编码方式也是ISO-8859-1,所以也会出现中文乱码问题。
解决方案:
a,对字符进行编码的时候,指定编码方式。其代码为:response.getOutputStream().write("北京".getBytes("UTF-8"));
b,同时设置浏览器的解码方式。其代码为:response.setHeader("content-type", "text/html;charset=UTF-8");或response.setContentType("text/html;charset=UTF-8");
四request乱码问题
我们先来理下思路,我们向服务器端发送数据,但我们是怎么发的呢?总的来说,我们有这么两种方式,一是自己在地址栏中写上请求地址加请求参数;二是通过点击表单或者是超链接来向服务器发送数据。那么对于刚刚提到的第一种方式,我们这里不作处理,因为我想,一般没人这么干吧,如果他要真这么干了,让他自己去处理吧。所以接下来,我们将会处理第二种方式的中文乱码问题,这又可以分为get请求和post请求两种。
1post请求乱码问题
对于post请求,根据我们刚刚提到的,我们向服务器发送数据,是通过点击表单或者是超链接,那么说明此时我们是在已经拿到服务器发送给客服端的页面了,而这种情况下,页面的编码方式一般情况下已经被设置成了UTF-8,所以我们只需要设置服务器端的解码方式也为UTF-8即可。其代码为:request.setCharacterEncoding("UTF-8");
2get请求乱码问题
对于get请求方式,理论上,我们也只需要告诉服务器以UTF-8的方式解码即可,但不幸的是,它不允许我们以编写代码的方式来更改服务器的解码方式,只能通过修改服务器的配置文件,具体操作就是,在服务器的conf目录下的server.xml文件中找到
[html] view plain copy 1.<Connector port="8080" protocol="HTTP/1.1" 2. connectionTimeout="20000" 3. redirectPort="8443" />
然后在里面再添加一个属性URIEncoding,值为UTF-8.虽然这种方式可以解决问题,但我们不会用,因为不可能我们在自己的机器写代码时,把这个配置改了,然后将来把项目移交的时候,顺便说下,大兄弟,回头记得把配置改下啊。你觉得可能吗?所以我们不采用这样的方式。