一中文论码问题出现的由来
之所以会产生乱码问题,不仅仅是中文乱码,其原因就在于:编码和解码采用了不同的码表。而之所以会有编码和解码这一回事,也是因为,无论数据是在传输还是存储等等过程中,都是以字节的方式在运行,所以就有了编码问题,又因为技术发展,各国国情等等各方面的因素导致了这个世界上产生了很多种编码方式。
二常见的编码方式
I.ISO-8859-1拉丁编码,,通常叫做Latin-1,Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符。
2.GBK,GB2312标准中文字符集,目前中国境内的浏览器的默认编码就是GBK;
3.UTF-8是 UNICODE 的一种变长字符编码,即 RFC 3629。简单的说——大字符集。可以解决多种语言文本显示问题,从而实现应用国际化和本地化。
三response乱码问题
response响应对象,可以向客户端输出响应正文.response中提供了两个两个响应流,分别是字符响应流和字节响应流。其中字符响应流只能用来输出字符,而字节响应流可以用来输出任何东西。
1.字符流问题
(1)设置response的字符流的编码方式为UTF-8;
其代码为:response.setCharacterEncoding("UTF-8");
(2)设置浏览器解码是用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,所以也会出现中文乱码问题。 解决方案如下:
(1)对字符进行编码的时候,指定编码方式。
其代码为:response.getOutputStream().write("北京".getBytes("UTF-8"));
(2)同时设置浏览器的解码方式。
其代码为:response.setHeader("content-type", "text/html;charset=UTF-8");
或response.setContentType("text/html;charset=UTF-8");
四.request乱码问题
我们先来理下思路,我们向服务器端发送数据,但我们是怎么发的呢?总的来说,我们有这么两种方式,一是自己在地址栏中写上请求地址加请求参数;二是通过点击表单或者是超链接来向服务器发送数据。那么对于刚刚提到的第一种方式,我们这里不作处理,因为我想,一般没人这么干吧,如果他要真这么干了,让他自己去处理吧。所以接下来,我们将会处理第二种方式的中文乱码问题,这又可以分为get请求和post请求两种。
1.post请求乱码问题
对于post请求,根据我们刚刚提到的,我们向服务器发送数据,是通过点击表单或者是超链接,那么说 明此时我们是在已经拿到服务器发送给客服端的页面了,而这种情况下,页面的编码方式一般情况下已经被设置了UTF-8,所以我们只需要设置服务器端的解码方式也为UTF-8即可。
其代码为:request.setCharacterEncoding("UTF-8");
2.get请求乱码问题
对于get请求方式,理论上,我们也只需要告诉服务器以UTF-8的方式解码即可,但不幸的是,它不允许我们以编写代码的方式来更改服务器的解码方式,只能通过修改服务器的配置文件,具体操作就是,在服务器的conf目录下的server.xml文件中找到代码,然后在里面再添加一个属性URIEncoding,值为UTF-8.
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
既然不能通过编写代码的方式来更改解码方式,那怎么解决这个问题呢?其解决办法就是反编码,即,我们先对通过request.getParameter("参数");等函数得到的数据进行ISO-8859-1方式解码,然后把得到的字节再通过UTF-8解码,就得到了。
其代码为:String str = new String(request.getParameter("参数").getBytes("ISO-8859-1"), "UTF-8");