几种针对乱码的解决办法


1tomcat服务器配置server.xml文件
主要用户处理与页面交互时产生的乱码问题,例如提交表单等。
<!-- Define a non-SSL HTTP/1.1 Connector on port 80-->
<Connector acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192" maxSpareThreads="75" maxThreads="150" minSpareThreads="25" port="80" redirectPort="8443"
  URIEncoding="GBK" useBodyEncodingForURI="true"   />

URIEncoding 用来设定通过   URI   传递的内容使用的编码, tomcat   将使用这里指定的编码对客户端传送的内容进行编码 。我们通过   get   方法提交的参数实际上都是通过   uri   提交的,由这个参数管理 ,如果没有设定这个参数,则   tomcat   将使用默认的   iso8859-1   对客户端的内容进行编码。
useBodyEncodingForURI 使用与   Body   一样的编码来处理   URI,   这个设定是为了与   tomcat4 保持兼容,原来在   tomcat4     tomcat5   中队参数的处理是不一样的,在   tomcat4     get     post   的编码是一样的,所以只要在过滤器中通过   request.setCharacterEncoding   设定一次就可以解决   get     post   的问题。然而,在   tomcat5   中, get     post   的处理是分开进行的,对   get   的处理通过前面的   URIEncoding   进行处理,对   post   的内容依然通过   request.setCharacterEncoding   处理,为了保持兼容,就有了这个设定。
所以,设置 URIEncoding 解决 get 中的参数问题,配置过滤器解决 post 的参数问题;或者设置 useBodyEncodingForURItrue get post 都使用过滤器来解决参数问题。

2、数据库bean配置
主要针对与数据库交互时产生的乱码问题,例如插入中文记录或读取中文数据。  
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/newfang?useUnicode=true&amp;
characterEncoding=gbk &amp;autoReconnect=true</value>
</property>
3、代码中局部解决乱码问题
      主要用于解决个别乱码问题,例如网页显示时中文均显示正常除一两条语句外,那么针对这一两条语句的乱码问题可用该方法。
qString = new String(qString.
getBytes ("ISO8859_1"), "GBK");
  qString = URLEncoder.encode(qString, "GBK"); //java url   编码方法
4web.xml配置,添加filter过滤器
      用于处理全站乱码问题,其实主要也是用于 action jsp 页面交互时使用。
<!--
  用于解决中文乱码问题   -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>
com.qa.util.SetEncodingFilter </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>

SetEncodingFilter 代码:
package com.qa.util;
import javax.servlet.*;
import java.io.*;

public class SetEncodingFilter implements Filter
{
protected String encoding=null;//
定义缺省字符编码方式
protected boolean ignore=true;//
定义客户端指定的编码方式是否应被忽略
protected FilterConfig filterConfig=null;//
定义过滤器配置对象 , 若为 null, 则说明过滤器未配置

public void destroy()//
停止过滤器的工作
{
this.encoding=null;
this.filterConfig=null;
}
//
设置字符编码
public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)
throws IOException,ServletException
{
if(ignore||(req.getCharacterEncoding()==null))
{
req.
setCharacterEncoding (selectEncoding(req));
}
chain.doFilter(req,res);
}
//
启动过滤器
public void init(FilterConfig filterConfig)throws ServletException
{
this.filterConfig=filterConfig;
this.encoding=filterConfig.
getInitParameter ("encoding");
String value=filterConfig.getInitParameter("ignore");
if(value==null) this.ignore=true;
else if(value.equalsIgnoreCase("true")
||value.equalsIgnoreCase("yes")) this.ignore=true;
else this.ignore=false;
}
//
选择合适的字符编码方式
protected String selectEncoding(ServletRequest req)
{
return this.encoding;
}
//
返回 filterConfig 对象
public FilterConfig getFilterConfig()
{
return filterConfig;
}
//
设置 filterConfig 对象
public void setFilterConfig(FilterConfig filterConfig)
{
this.filterConfig=filterConfig;
}
}

5、服务器apache上的乱码。
除了以上的情况外,还有 apache 的配置问题,注意的方面有以下几点:
1 conf/httpd.conf  
AddDefaultCharset ISO-8859-1   改成   AddDefaultCharset GBK
    
  2 apache 进行了 rewrite
把需要 rewrite url 中的中文参数进行 两次 编码 (encode) ,因为 apache rewrite 时会做一次 url 解码,这时 jk 进行请求转发时,就不会再是编码后的字符串了;
或者在接收请求时先用 ISO-8859-1 取字节流,再使用 UFT-8 new String (new String(str.getBytes("ISO-8859-1"),"UFT-8") )



转自:http://blog.sina.com.cn/s/blog_6310009d01014v9d.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值