配置web-xml解决中文乱码问题

配置web-xml解决中文乱码问题

(2012-06-20 15:52:00)
标签:

杂谈

分类: java
http://wenku.baidu.com/view/60c4a2d076a20029bd642d42.html

相信web站点乱码问题都曾使我们困惑加郁闷不少,在此我积累了几点解决方案,用于解决不同情况下的乱码问题,希望能对各位有些许提示作用。

首先应确定不是因为浏览器的原因导致中文乱码。

本人在刚用firefox时就遇到了url中文乱码的问题,找自己程序及配置找了老久也没解决问题,后来才发现原来是浏览器的配置问题。
问题:编码为utf-8url出现乱码。form表单getpost方式都无乱码,页面链接地址也无中文乱码,刷新页面无乱码,但是选中地址栏中的url敲回车,乱码出现了!

原因:浏览器配置问题。
解决方案:ie“internet选项/高级总以utf-8发送网址的选项的配置;
firefox
:地址栏中输入about:config,修改network.standard-url.escape-utf8False (缺省为True);
如果你想让浏览器直接url-encodeutf-8,修改network.standard-url.encode-utf8true(缺省为false)。
解释:根据Web规范,URL必须以UTF-8字符集进行编码。Firefox默认gbkencodeie默认utf8encode;另外Firefox对地址中的中文采取了不同于IE的编码方式,也就是说:当url参数值含有中文时firefox默认使用escape进行编码,当参数值没有用escape进行编码时,使用进行解码IE下不会乱码,但Firefox下会乱码。
附:prefs.converted-to-utf8 *首选项转换成UTF-8编码格式
network.standard-url * Standard URL settings

ok
!确认浏览器配置正确后,仍有中文乱码出现,八成儿就是兄弟你代码的问题了,解决方案大概有以下几种。

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的参数问题;或者设置useBodyEncodingForURItruegetpost都使用过滤器来解决参数问题。

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过滤器
用于处理全站乱码问题,其实主要也是用于actionjsp页面交互时使用。
<!--
用于解决中文乱码问题 -->
<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的配置问题,注意的方面有以下几点:
1conf/httpd.conf
AddDefaultCharset ISO-8859-1改成 AddDefaultCharset GBK
2apache进行了rewrite

把需要rewriteurl中的中文参数进行两次编码(encode),因为apacherewrite时会做一次url解码,这时jk进行请求转发时,就不会再是编码后的字符串了;
或者在接收请求时先用ISO-8859-1取字节流,再使用UFT-8new String(new String(str.getBytes("ISO-8859-1"),"UFT-8"))

6.Struts2乱码处理:

<struts>
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="struts2" extends="struts-default">
<action name="orgAdd" class="orgAddAction">
<result name="success">/org/index.jsp</result>
</action>
</package>
</struts>

通过i18n(Internationalization 编码国际化)和 constant标签设置Action的传值编码为"GBK",当然此编码要跟页面中的编码一致才不会造成中文乱码。

7.Spring处理乱码,在web.xml文件中添加:

<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</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、付费专栏及课程。

余额充值