分享

jsp乱码问题的解决方法

 傻儿儿 2011-03-10

jsp乱码问题的解决方法

文章分类:Java编程
      由于jdk中只规定了必须有一些unicode utf8等编码的实现,好像对汉字编码没有什么实现的硬性规定,所以有时候就会出现乱码问题。

        最简单最根本的解决方案:在允许的情况下,把所有的编码统一的都改为UTF-8

        数据库访问时的乱码问题,可以数据库连接中加上useunicode =true 以及用gbk 或gb2312编码就可以了:
        在建立数据库时,将数据库中的所有表的编码方式都设置为gbk,原因是JSP中也使用了gbk编码,这样统一的结果是可以减少很多不必要的编码转换问题。另外,在使用JDBC连接MySQL数据库时,连接字符串写成如下形式可以避免一些中文问题:

Java代码 复制代码
  1. jdbc://mysql://hostname:port/DBname?user=username&    
  2. password=pwd&    
  3. useUnicode=True&    
  4. characterEncoding=gbk  


        如果是以数据源的方式连接数据库,在配置文件中使用:
Xml代码 复制代码
  1. <parameter>    
  2. <name>url</name>    
  3. <value>    
  4. jdbc://mysql://hostname:port/DBname?&useUnicode=True&characterEncoding=gbk    
  5. </value>    
  6. </parameter>   

        但是,如果使用一个已经存在的数据库,数据库的编码方式是ISO-8859-1,而Web应用中使用UTF-8,且数据库中已经有很多重要信息,因此不能通过更改数据库的编码方式来解决问题。这个时候,在往数据库中写数据库时,一定要在JDBC连接字符串中加入
Java代码 复制代码
  1. “useUnicode=True&characterEncoding=ISO-8859-1”  
这样可以顺利的往数据库中写入正常的数据。但是,在将数据读出数据库时,乱码又会出现,这个时候就应该在数据取出时对其转码,可以将转码功能写为一个函数,具体实现如下:
Java代码 复制代码
  1. public String charConvert(String src){    
  2.        String result=null;    
  3.    if(src!=null){    
  4.    try{    
  5.   
  6. // 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组->通过使用指定的 charset 解码指定的    
  7.   
  8. byte 数组,构造一个新的 String。    
  9.           result=new String(src.getBytes("ISO-8859-1"),"gbk");    
  10.        }catch(Exception e)    
  11.    {    
  12.              result=null;    
  13.              }    
  14.        }    
  15.       return result;    
  16. }  
       于是,在从数据库读出数据过后调用charConvert(rs.getString("colName")),这样就可以正常显示数据库中的中文数据了。


        JSP中输出中文的乱码问题
        所谓在JSP输出中文,即直接在JSP中输出中文,或者给变量赋中文值再输出等,这种情况下的乱码问题往往是因为没有给JSP页面制定显示字符的编码方式,解决问题如下:

        ·在JSP页面头部加上语句<%@ page contentType="text/html;charset=gbk"%>(在Servlet页面中使用

httpServletResponse.setContentType("text/html;charset=gbk")),最好同时在JSP页面的head部分加上<meta http-

equiv="Content-Type" content="text/html;charset=gbk">

        ·在每次要输出中文的地方主动转换编码方式,比如要在页面中输入“中文”二字,就可以用以下方式:
Html代码 复制代码
  1. <%    
  2.        String str="中文";    
  3.       byte[] tmpbyte=str.getBtyes("ISO-8859-1");    
  4.        str=new String(tmpbyte);    
  5.        out.print(str);    
  6. %>  

        获取表单提交的数据时的中文乱码问题

        在没有加任何其他处理之前,用request.getParameter(panamName)获取表单提交中的数据,且表单数据中含有中文时,返回的字符串会出现乱码。出现这种问题的原因是Tomcat的J2EE实现对表单提交,即以POST方式提交的参数采用默认的ISO-8859-1来处理。
        比如,建立一个test.jsp,内容为:
Html代码 复制代码
  1. <%@ page contentTyp="text/html;charset=gbk"%>    
  2. <%    
  3.        String str=request.getParameter("chStr");    
  4.       if(str==null) str="没有输入值";    
  5. %>    
  6. <html>    
  7.    <head>    
  8.       <title>中文Test</title>    
  9.       <meta http-equiv="Content-Type" content="text/html;charset=gbk">    
  10.       <meta http-equiv=param content=no-cache>    
  11.    </head>    
  12.    <body>你输入的内容为:<%=str%><br>    
  13.       <form action="test.jsp" method="post">    
  14.        请输入中文:<input type="text" name="chStr">    
  15.       <input type="submit" value="确定">    
  16.       </form>    
  17.    </body>    
  18. </html>   

        运行过后,在输入框中输入汉字“中文”,提交过后再显示出来后就变成了一堆乱码。解决此问题的办法有两个。一是不修改其他设置,只是在将表单中的中文数据取出来过后再转换编码,方法如语句
Java代码 复制代码
  1. String str=request.getParameter("chStr");   
  2. String str=new String(sre.getByte("ISO-8859-1"),"gbk")  

        但这种方法只是从一个局部来考虑问题,如果这样的地方太多,就不得不将这条语句重复写很多次,在比较大的项目中,这是一种不太可行的方案。另一个方法就是让对所有页面的请求都通过一个Filter,将处理字符集设置为gbk。具体的做法如下(在Tomcat的webapps/servlet-examples目录有一个完整的例子,也可以参考其中web.xml和SetCharacter EncodingFilter的配置):

        首先将%TOMCAT%/webapps/servlets-examples/Web-INF/classes/filters/目录下的文件SetCharacterEncodingFilter.class拷贝到自己应用的/Web-INF/classes/com/util/filter目录下;然后再在web.xml文件的<web-app>后面加上如下配置代码:
Xml代码 复制代码
  1. <filter>    
  2.      <filter-name>Set Character Encoding</filter-name>    
  3.      <filter-class>com.ccut.struts.SetCharacterEncodingFilter</filter-class>    
  4.      <init-param>    
  5.         <param-name>encoding</param-name>    
  6.         <param-value>gbk</param-value>    
  7.      </init-param>    
  8. </filter>    
  9. <filter-mapping>    
  10.      <filter-name>Set Character Encoding</filter-name>    
  11.      <url-pattern>/*<url-pattern>    
  12.     </filter-mapping>   


URL中的中文问题

       对于直接通过在URL中传递中文参数,如“http://localhost/a.jsp?str=中文”这样的get请求,在服务端用request.getParameter("name")时返回的往往是乱码。按以上的做法设置Filter没有用,用request.setCharacterEncoding("gbk")的方式,仍然不管用。
       例如,建立test2.jsp文件,内容为:

Html代码 复制代码
  1. <%@ page contentTyp="text/html;charset=gbk"%>    
  2. <%    
  3.        String str=request.getParameter("chStr");    
  4.       if(str==null) str="没有输入值";    
  5. %>    
  6. <html>    
  7.       <head>    
  8.          <title>中文Test</title>    
  9.          <meta http-equiv="Content-Type" content="text/html;charset=gbk">    
  10.          <meta http-equiv=param content=no-cache>    
  11.       </head>    
  12.       <body>你输入的内容为:<%=str%><br>    
  13.       <form action="test.jsp" method="post">    
  14.          <a href="test2.jsp?chStr=中文">点击这里提交中文参数</a>    
  15.       </form>    
  16.       </body>    
  17. </html>   

        运行后,可见通过URL传递的中文参数取出来过后变成了乱码,造成这种结果的原因是Tomcat中以get方式提交的请求对query-string处理时采用了和post方法不一样的处理方式。
        解决这个问题的方法是打开Tomcat安装目录下的/conf/server.xml文件,找到Connector块,往其中添加URIEncoding="gbk",添加过后完整的Connector块代码如下:
Xml代码 复制代码
  1. <Connector port="8080"                  
  2. maxThreads="150" minSpareThreads="25" maxSpareThreads="75"    
  3. enableLookups="false" redirectPort="8443" acceptCount="100"    
  4.     debug="0" connectionTimeout="20000"    
  5.     disableUploadTimeout="true"    
  6.     URIEncoding="gbk" />   

在Struts中证实可以解决URI传递乱码问题.
可以这样做
1.设定Tomcat的URI编码为"UTF-8":修改%tomcat%\conf\server.xml中的<Connector>在中间加入URIEncoding="UTF-8";
2.先在页面上encodeURI(url);
3.后台代码中直接取出来的中文参数就已经OK了.
4. 试一试request.setCharacterEncoding("GBK");
不过这种方法用在servlet中行不通,在servlet中就必须对URI进行处理,Tomcat中有没有加入URIEncoding都没有差别.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多