Java web中编码问题解析

来源:互联网 发布:健步走软件官方下载 编辑:程序博客网 时间:2024/05/20 08:44

相信写过java web程序的人都对乱码恨之入骨,多少好心情就是因为乱码弄得一团糟,就像千里之体溃于蚁穴、一个老鼠害一锅汤一样的感觉!!!

   这里,分享一下我对java web编码的认识,以及乱码的解决方法。

当一个用户从浏览器端发送一个HTTP请求时,这是需要一系列的编码:URL、Cookie、Paramiter。URL就是浏览器地址栏里的网页地址,Cookie先不说,Paramiter是我们要发送到服务器的各种参数。

当服务器接收到这个HTTP请求时,服务器需要进行一系列的解码。

当服务器处理完请求时,要发送一个Response给用户的浏览器,这时又要需要进行编码。

用户的浏览器收到这个Response,再进行解码,把结果呈现给用户。


好了,这就是一个HTTP请求中涉及到的编解码,其中如果编码与解码用的不是同一种编码,那就会出现乱码了。

那我们就依次分析其中乱码原因和解决方案:

一、表单的get方式提交

<form action="query" method="get">请输入查询学生名字:<input name="queryName" type="text"/><input type="submit" value="查询"/></form>
上面的表单就是一个“get”方式提交的表单,当表单以这种方式提交时,浏览器会把参数按照页面上charset中的编码进行编码,网页中一般会有content="text/html; charset=UTF-8"这样一句话,如果没有,一般默认使用“ISO-8859-1”这种编码方式。当参数编码后发送到服务器,服务器进行解码,服务器解码使用的编码一般可以进行设置,对于Tomcat服务器,默认是ISO-8859-1,所以如果页面以“UTF-8”编码,发送给服务器后,使用String queryName=request.getParameter("queryName");来获取参数一般会出现未知字符。

对于编码“ISO-8859-1”,就像一个黑洞,中文字符进去后,要想正常的解码出来,就要用准确的编码进行解码。这里有一个万能的方法:

String queryName=new String(request.getParameter("queryName").getBytes("ISO-8859-1"),"utf-8");
当页面的charset是“utf-8”时,用上面的语句可以正确获得中文参数,如果是其他编码,就把上面语句的最后一个参数替换成页面的charset值。


二、表单的post方式提交

这种方式提交的参数,首先浏览器会按照页面的charset属性进行编码,发送到服务器端后,服务器端也按照request请求中的charset属性进行解码,所以一般post提交上来的参数不会出现乱码问题,但是,有时候request中的charset属性是null,这是服务器就会使用默认的“ISO-8859-1”进行解码,造成乱码。

如何解决呢?首先要设置request中charset属性,而且必须在服务器解析参数之前,也就是在

request.getParameter("queryName");
这句话之前设置charset属性,设置charset属性的语句是:

request.setCharacterEncoding("utf-8");
一定要在获取参数之前设置charset属性


三、网页中存在带中文参数的链接

<a href="query?queryName=刘昂 ">查询</a>
这种情况,浏览器首先按照页面的charset进行编码,发送到服务器,服务器按照自身设置进行解码,这个过程和“get”表单是一样的,所以解决方法也是一样的,万能解决语句:

String queryName=new String(request.getParameter("queryName").getBytes("ISO-8859-1"),"utf-8");
四、数据库存储

数据库也经常出现乱码情况,至于这种情况,我在http://blog.csdn.net/zsmj_2011/article/details/7943734中写了关于mysql乱码原因和解决方法,可以参考一下

还有一种解决方法,就是在数据库连接字符串中添加参数:

jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8

正常的数据库连接字符串是没有后面的参数的,这种方法我没有真正实践过,不知道是否正确。

总结一下:

1.出现乱码时不要着急,关键找准乱码出现的点,然后对症下药。如何找到乱码发生的点呢?debug一下,这个不用多讲了,或者使用System.out.println,在使用到参数的地方都把参数先打印出来,很轻松找到乱码出现的点,然后对症下药。

2.保持一个好的编码习惯,页面要设置pageEncoding、charset等着写属性,而且要编码一致,数据库和服务器的编码设置也很重要,尽量与页面的编码一致。

3.尽量全部使用utf-8的编码。为什么不用gb2312、gbk、gb18030呢,我只想说,改革开放都30年了,要走出国门,面向世界,请使用Unicode编码。至于这几种编码的区别,可以再查查,utf-8十分适合网络编程中使用,因为编码采用变长技术,不会浪费字节。

原创粉丝点击