Tomcat与Web.xml配置
1、编码配置
<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” />
url使用GBK进行编码。
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的参数问题;或者设置useBodyEncodingForURI为true,get、post都使用过滤器来解决参数问题。
2、网页编码可以设置请求头:在head中添加
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
3、修改浏览器配置
ie:“internet选项/高级”中“总以utf-8发送网址”的选项的配置;
firefox:地址栏中输入about:config,修改network.standard-url.escape-utf8 为False (缺省为True);
如果你想让浏览器直接url-encode成utf-8,修改network.standard-url.encode-utf8为true(缺省为false)。
4、使用Spring时可能还有如下配置
主要针对与数据库交互时产生的乱码问题,例如插入中文记录或读取中文数据。
<property name=”driverClassName”>
<value>com.mysql.jdbc.Driver</value>
</property>
<property name=”url”>
<value>jdbc:mysql://localhost:3306/newfang?useUnicode=true&characterEncoding=gbk&autoReconnect=true</value>
</property>
5、代码中解决乱码问题
主要用于解决个别乱码问题,例如网页显示时中文均显示正常除一两条语句外,那么针对这一两条语句的乱码问题可用该方法。
qString = new String(qString.getBytes(“ISO8859_1″), “GBK”);
或 qString = URLEncoder.encode(qString, “GBK”); //java url 编码方法
5、高级,web.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; } }
6、服务器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