java中文编码乱码

开发中遇到中文乱码,请检查“jsp-tomcat-struts1-ajax-webservice”,请检查以下几处:

1.jsp页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ page language="java" pageEncoding="GBK" contentType="text/html;charset=GBK"%>
<script type="text/javascript" src="${pageContext.request.contextPath }/tsjs/userinfo.js" charset="GBK"></script>

2.Action类:

	request.setCharacterEncoding("GBK");
/**...**/	response.setContentType("text/html");
        response.setCharacterEncoding("GBK");
        PrintWriter out = response.getWriter();
        out.write(price);
        out.flush();
        out.close();

3.tomcat配置中(修改tomcat下的conf/server.xml文件),Tomcat(默认ISO-8859-1编码)****此处可不做修改

<!--修改前<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />-->
<!--修改后-->
<Connector port="8080"  protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

4.最后就是自己写一个过滤器,这个是最有效的解决中文访问(request/response)的办法了:

字符编码过滤器类EncodingFilter:

package com.ts.filter;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

 /**
 * ClassName: EncodingFilter Chinese encoding exception <br/>
 * Date: 2015-1-15 下午01:37:20 <br/>
 * <br/>
 * 
 * @author tskk@ts.com
 * 
 * first made 
 * @version 0.0.1<br/>
 * 
 */

public class EncodingFilter implements Filter {
    private FilterConfig config;
    private String encoding;
    /**
     * filter Chinese encoding
     * */
    @SuppressWarnings("unchecked")
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException {
        HttpServletRequest reqhttp = (HttpServletRequest) request;
        encoding = config.getInitParameter("encoding");
        encoding = encoding == null ? "GBK" : encoding;
        //if ajax request
        if(reqhttp.getHeader("X-Requested-With") != null && reqhttp.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest")){
            request.setCharacterEncoding("UTF-8");
        //webservice req res
        }else if(reqhttp.getHeader("soapaction") != null){
            request.setCharacterEncoding("UTF-8");
        //other req
        }else{
          //post http req
          if(reqhttp.getMethod().equalsIgnoreCase("POST")){
              request.setCharacterEncoding(encoding);
          }
          //get http req
          if(reqhttp.getMethod().equalsIgnoreCase("GET")){
              Map map = reqhttp.getParameterMap();
              Set set = map.entrySet();
              for(Object obj : set){
                  //value entry.getKey() no encoding error
                  Map.Entry entry = (Map.Entry)obj;
                  String [] value = (String[]) entry.getValue();
                  for(int i = 0,j = value.length;i < j;i++){
                     String reqEncoding  = reqhttp.getCharacterEncoding();
                     reqEncoding = reqEncoding == null ? "ISO8859-1" : reqEncoding;
                     value[i] = new String(value[i].getBytes(reqEncoding),encoding);
                  }
              }
              request = reqhttp;
          }
        }
        chain.doFilter(request,response);
    }
    /**
     * init encoding
     * @param config encoding
     * */
    @Override
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }
    
    /**
     * destroy encoding
     * */
    @Override
    public void destroy() {
        this.config = null;
    }
}

web.xml配置:

	<!-- Chinese encoding -->
	<filter>
		<filter-name>EncodingFilter</filter-name>
		<filter-class>com.ts.filter.EncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>GBK</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>EncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值