昨天转贴了一篇《Java/J2EE中文问题终极解决之道》的文章(原贴http://www.jdon.com/idea/chinesejava.htm),里面提到“中文乱码问题的根本解决办法是明确地指定整个应用系统统一的字符集”。
要做到以下几点:
一、开发和编译代码时指定字符集为UTF-8。JBuilder和Eclipse都可以在项目属性中设置。
二、使用过滤器,如果所有请求都经过一个Servlet控制分配器,那么使用Servlet的filter执行语句,将所有来自浏览器的请求(request)转换为UTF-8,因为浏览器发过来的请求包根据浏览器所在的操作系统编码,可能是各种形式编码。关键一句:
request.setCharacterEncoding("UTF-8")。
网上有此filter的源码,Jdon框架源码中com.jdon.util.SetCharacterEncodingFilter
需要配置web.xml 激活该Filter。
三、在JSP头部声明:<%@ page contentType="text/html;charset= UTF-8" %>。
四、在Jsp的html代码中,声明UTF-8:<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
五、设定数据库连接方式是UTF-8。例如连接MYSQL时配置URL如下:
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
一般数据库都可以通过管理设置设定UTF-8
mysql可以修改my.ini配置文件,将以下设置改为utf8
[mysql] default-character-set=utf8
六、其他和外界交互时能够设定编码时就设定UTF-8,例如读取文件,操作XML等。
但是经过笔者测试还有几个问题文中的方法不能完全解决:
1.Form里面用GET方法传参时转换的问题;
2.URL后附带中文传参时的转换问题。
环境:操作系统WindowsXP SP2(中文),Eclipse 3.1 with Lomboz,tomcat 5.5.9 ,IE 6.0
一、正常POST方法传参:
页面a.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"%>
</head>
<FORM METHOD=POST ACTION="/webtest/b.jsp"><INPUT TYPE="text" NAME="parm">
<INPUT TYPE="submit"></FORM>
</html>
页面b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"%>
</head>
<%
request.setCharacterEncoding("UTF-8");
String strParm = request.getParameter("parm");
out.println(strParm);
%>
</html>
没有任何问题。
二、Form里面用GET方法传参时转换问题的解决方法:
页面a.jsp
……
<FORM METHOD=GET ACTION="/webtest/b.jsp"><INPUT TYPE="text" NAME="parm">
……
页面b.jsp
……
String strDisplay = new String(strParm.getBytes("ISO8859-1"), "UTF-8");
out.println(strDisplay);
……
分析:根据解决方法判断,可能是在FORM在用GET方法包装参数到地址栏的URL链接时或者是在URL传递前,用的是ISO8859-1的编码(并且所用IE浏览器的高级选项中设置了总是以UTF-8发送URL这项,可以排除是在URL发送后转换的ISO8859-1编码),而这个编码方式的修改好像并不在《Java/J2EE中文问题终极解决之道》文中提到的那几个步骤之中,
三、URL后附带中文传参时的转换问题的解决方法:
修改b.jsp页面
……
String strDisplay = new String(strParm.getBytes("ISO8859-1"), "GBK");
……
分析:根据解决方法判断,URL在传递前,用本地操作系统的默认编码(GBK)把中文编码为ISO8859-1。
同理,使用Servlet测试(包括建立Filter对请求进行编码转化),结果相同,不再赘述。
怎样才能用一种方法,一劳永逸地解决这3种情况下中文乱码问题呢?
1、用获取字符串的编码格式的方法(目前还没找到)来判断后调用各个方法。
2、还有一个是应用中不用GET方法和URL方法来传递参数。
3、必须使用GET方法或者URL方法传中文时,首先进行编码转化,比如建立静态文本常量的XXXX.properties文件,事先用JDK自带的vatie2ascii工具进行转化。
4、还有就是建立个空白页面包装参数再用POST方法转发。