`

java乱码处理集中营

阅读更多

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

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

jdbc://mysql://hostname:port/DBname?user=username&
password=pwd&
useUnicode=True&
characterEncoding=gbk

       如果是以数据源的方式连接数据库,在配置文件中使用:
<parameter>
<name>url</name>
<value>
jdbc://mysql://hostname:port/DBname?&useUnicode=True&characterEncoding=gbk
</value>
</parameter>
       但是,如果使用一个已经存在的数据库,数据库的编码方式是ISO-8859-1,而Web应用中使用UTF-8,且数据库中已经有很多重要信息,因此不能通过更改数据库的编码方式来解决问题。这个时候,在往数据库中写数据库时,一定要在JDBC连接字符串中加入“useUnicode=True&characterEncoding=ISO-8859-1”,这样可以顺利的往数据库中写入正常的数据。但是,在将数据读出数据库时,乱码又会出现,这个时候就应该在数据取出时对其转码,可以将转码功能写为一个函数,具体实现如下:
public String charConvert(String src){
       String result=null;
   if(src!=null){
   try{

// 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组->通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
          result=new String(src.getBytes("ISO-8859-1"),"gbk");
       }catch(Exception e)
   {
             result=null;
             }
       }
      return result;
}       于是,在从数据库读出数据过后调用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">

       ·在每次要输出中文的地方主动转换编码方式,比如要在页面中输入“中文”二字,就可以用以下方式:




<%
       String str="中文";
      byte[] tmpbyte=str.getBtyes("ISO-8859-1");
       str=new String(tmpbyte);
       out.print(str);
%>


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

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

       运行过后,在输入框中输入汉字“中文”,提交过后再显示出来后就变成了一堆乱码。解决此问题的办法有两个。一是不修改其他设置,只是在将表单中的中文数据取出来过后再转换编码,方法如语句String str=request.getParameter("chStr");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>后面加上如下配置代码:
<filter>
     <filter-name>Set Character Encoding</filter-name>
     <filter-class>com.ccut.struts.SetCharacterEncodingFilter</filter-class>
     <init-param>
        <param-name>encoding</param-name>
        <param-value>gbk</param-value>
     </init-param>
</filter>
<filter-mapping>
     <filter-name>Set Character Encoding</filter-name>
     <url-pattern>/*<url-pattern>
    </filter-mapping>


URL中的中文问题


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

<%@ page contentTyp="text/html;charset=gbk"%>
<%
       String str=request.getParameter("chStr");
      if(str==null) str="没有输入值";
%>
<html>
      <head>
         <title>中文Test</title>
         <meta http-equiv="Content-Type" content="text/html;charset=gbk">
         <meta http-equiv=param content=no-cache>
      </head>
      <body>你输入的内容为:<%=str%><br>
      <form action="test.jsp" method="post">
         <a href="test2.jsp?chStr=中文">点击这里提交中文参数</a>
      </form>
      </body>
</html>

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

分享到:
评论

相关推荐

    java乱码处理

    很详细的java中文乱码处理文档,当然着是对于struts2之前的,初学者比较合适去看看

    java 中文乱码 处理

    java中文乱码处理,本文中几个方法解决了中文乱码的问题 希望对你有帮助

    java乱码处理汇总

    乱码的处理!程序员永远无法避免的话题,解决乱码总汇

    Java编程乱码处理方法大全(附图说明)

    Java编程乱码处理方法大全,包括纯Java代码,servlet类,JSP类,EJB类的乱码处理方法。希望大家能用的着。

    java URL中文参数乱码处理

    js 中乱码处理法方式 encodeURIComponent(encodeURIComponent(customerAddress)) decodeURIComponent(customerName) js到java encodeURI(url) String qijuType= new String(request.getParameter( (...

    JAVA 乱码问题集合

    JAVA 乱码问题,JAVA 乱码问题,JAVA 乱码问题JAVA 乱码问题JAVA 乱码问题JAVA 乱码问题

    乱码处理文件 乱码处理文件

    乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理文件乱码处理...

    解析Java中文乱码的处理方法

    解析Java中文乱码的处理方法解析Java中文乱码的处理方法解析Java中文乱码的处理方法解析Java中文乱码的处理方法解析Java中文乱码的处理方法

    Java乱码学习 Java乱码学习

    Java乱码学习 免费下载 欢迎分享 Java乱码学习 免费下载 欢迎分享

    java乱码自己解决的办法

    java乱码自己解决的办法

    java乱码解决方法

    解决java web开发中遇到的前后台传值乱码问题。

    java处理中文乱码

    java处理中文乱码的三中方法 1.类字符转换 2.struts配置文件处理 3.web.xml配置文件处理

    java乱码转换

    java 乱码 转换 utf

    java乱码解决方案

    java乱码解决方案,在使用eclipse时出现的乱码问题,帮助解决

    java开发乱码问题处理大全

    java开发乱码问题处理大全,让你迅速成为高手

    java中文乱码大全

    本资源用来解决java中文乱码问题,有很多解决java中文乱码的方法

    Java乱码问题解决方法

    Java乱码问题解决方法,java乱码怎么解决,java项目乱码,java乱码处理,

    Java乱码问题解决

    在Java编程中,经常会碰到汉字的处理及显示问题,以不小心就会产生一大堆乱码或者问号。造成这种问题的根本原因是Java中默认的编码方式是Unicode,而中国人通常使用的文件和DB都是基于GB2312或BIG5等编码,故会出现...

Global site tag (gtag.js) - Google Analytics