昨天转贴了一篇《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&amp;characterEncoding=UTF-8
一般数据库都可以通过管理设置设定UTF-8 
六、其他和外界交互时能够设定编码时就设定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方法转发。由于笔者能力有限(从知道JAVA到现在还不到一年)可能考虑的不周,欢迎大家来一起讨论这个问题,把你的解决方法说出来大家一起分享 ^_^

解决方案 »

  1.   

    Jsp页面到java文件得到的是unicode字符,转为UTF8就可以了了
      

  2.   

    怎么使用呢?我这里主要说的是如果在url中传递参数比如b.jap?parm=你好
    这个怎么正确显示的问题
      

  3.   

    这个问题很常见,具体的方法也有一定的适应范围!
    搂住说的用Get方法传递中文时乱码我也遇见过,我用XMLHttpRequest的send用get方法时也是乱码,最后用了很多方法,楼主列出的都用过,我自己用了很多其他的方法还是有问题,又看了一下tomcat的部分源代码,还是有问题,最后只好用post方法才可以!
    希望有这样经历的贴出来看看,分享一下!
      

  4.   

    乱码问题很常见,毕竟java不是中国人开发的。
      

  5.   

    但是经过笔者测试还有几个问题文中的方法不能完全解决:
    1.Form里面用GET方法传参时转换的问题;
    2.URL后附带中文传参时的转换问题。--------------------------------------------
    这两个问题其实是同一个,即get时候的中文问题
    如果使用tomcat作为服务器的话,可以修改tomcat/conf/server.xml里的
        <Connector port="8080"
                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                   enableLookups="false" redirectPort="8443" acceptCount="100"
                   debug="0" connectionTimeout="20000" 
                   disableUploadTimeout="true" URIEncoding="GBK"/>注意,加了一个属性URIEncoding="GBK"
      

  6.   

    另说一句本不该说的废话,banq老师做j2ee都一把年纪了,不去研究些比较有深度的话题,却来搞些随便google一下都大把的《J2EE中文问题“终极”解决之道》之类的噱头,而且还是不完整的“终极”法门,让人不得不一声叹息
      

  7.   

    抱歉,看得有些不仔细
    既然终极解决之道里使用的是UTF-8,那么前面的URIEncoding也应该设置为UTF-8
      

  8.   

    呵呵,他也没闲着,自己搞了一个Jdon的框架,把PerStroe也给用自己的框架重写了,还放言关系数据库要被中间件逐渐取代了。不过好像大家对他的评价褒贬不一啊 ^_^你说的方法试了一下,可以解决第一个问题
    但是如果用户用在地址栏url参数中直接写入中文还是不能解决
    不过应该很好了,因为应用里面几乎没有要求用户在地址栏自己传中文参数的吧
    谢谢
      

  9.   

    GET方式? URL方式? 晕!
    Http请求中只有POST和GET两种方式, URL方式就是GET方式!
    对于GET方式中文为什么会是乱麻而且不能通过类似POST的方式解决,去看看HTTP 1.1的规格文档吧.
    其中有端的意思是,GET方式请求的参数都会被转换成BASE64编码(其实这个我们可以从一些搜索引擎中看到,比如Goodle,是不是历史里面的地址都是你看不懂的东西!),到了服务端被解码并且编码成本地默认编码格式(通常都是ISO8859-1), 这就是为什么你必须用new String(strParm.getBytes("ISO8859-1"), "UTF-8");来对GET方式参数进行重新转换编码的原因.
    不过应用中似乎没有必要用GET方式来进行带中文参数的请求, 而且所有的GET方式都可以用POST方式来替代. 而且POST来得更安全可靠.
      

  10.   

    url就是GET方式我是知道的,但是的确在这个问题中这两个如果都笼统地说GET方式是没法表明我的意思的。
    谢谢楼上的解释,这下明白了为什么会在GET方式中出现乱码^_^在URL中带中文参数当然没有哪个应用会采用,不过在一些情况下还是免不了会使用到GET方式,就像你说的为了安全可靠的问题,最好还是能尽量考虑到所有的情况。
      

  11.   

    eprint自定义打印是一个页面套打工具.它直接在IE浏览器中可视化的设计各种复杂的打印模版,
    能够解决在IE浏览器中打印各种复杂的中国式报表及票据。详见: http://218.30.103.110:8080/eprint/index.htm
    方成eform自定义表单平台,纯BS结构.100%开放源码.可以在 http://218.30.103.110:8080/eform/index.html 在线试用. eform自定义表单平台是一个在IE浏览器中可视化的设计软件界面的工具。无论是输入界面还是报表界面,无论是简单的输入查询还是复杂的逻辑处理。都可以由eform设计出来。 
     
         eform自定义表单平台适用于网上OA系统的自定义表单模块,工作流系统的自定义表单模块,信息管理系统方面的软件开发项目等等