长颈鹿Giraffe

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

乱码对于使用非英语程序员基本上是一直缠绕在身边的麻烦事,这个谁也避免不了。以下是我的一些解决乱码问题的方法或经验的汇总,欢迎指正或补充。

一、乱码发生的情况和应对措施

1.开发环境乱码

  由于Java默认使用UTF-8编码,而且网上很多人都建议Web开发的时候应尽量选用UTF-8做为默认编码,而非GBK。有时候或许会碰到这样的问题,成员A在他机器上看到的是正常的中文注释,你通过SVN下载到你机器上时,却发现注释全变成乱码了,这时候一定是你们的IDE的默认编码不同了。所以项目组成员在使用Eclipse等IDE的时候,应统一将default text editor改为UTF-8编码,免得日后后悔再改就惨了。

2.POST请求乱码
  适用于POST请求过程中, 在接收POST 提交的中文参数出现乱码的情况。解决方案可以使用SetCharacterEncodingFilter,这个很基础的一套过滤器,将所有来自页面的POST请求全部过滤为UTF-8编码。在web.xml文件中加入以下代码:

View Code
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>

<!-- filter mapping -->
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

3.GET请求乱码

  如果在本项目中采用了get方式提交请求并附加参数,结果导致编码乱码,原因是Tomcat默认请求编码是ISO8859,需要在Tomcat的配置文件server.xml中找到以下代码:

View Code
<connector port="8080" maxthreads="150" minsparethreads="25" maxsparethreads="75" enablelookups="false" redirectport="8443" acceptcount="100" debug="0" connectiontimeout="20000" disableuploadtimeout="true">
</connector>

并添加一个参数,URIEncoding="UTF-8",这样请求中附件的参数就会以UTF-8来进行编码。修改后如下所示:

View Code
<connector port="8080" maxthreads="150" minsparethreads="25" maxsparethreads="75" enablelookups="false" redirectport="8443" acceptcount="100" debug="0" connectiontimeout="20000" disableuploadtimeout="true" uriencoding="UTF-8">
</connector>

4.JSP ,HTML页面乱码
  将JSP页面全部改为charset=UTF-8,这样可以保证与后台交互的时候都是UTF-8编码,一般应用做了以上工作就基本可以应付了。如下所示:

View Code
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

5.Ajax请求乱码
  使用Ajax,JS也是默认使用ISO8859编码,所以在进行请求时遇到中文参数需要进行编码,如:var url = "GetSelectListAction.do?queryData=subTrade" + "&queryId=" + encodeURI(obj.value) + "&r=" + Math.random();  
  这里有两个地方需要注意:第一个地方是encodeURI(),方法,可以将参数进行转码,默认是转化为UTF-8,如果需要转为其他码制,需要在方法中添加第二个参数。
  第二个地方是Math.random(),由于Ajax有缓存机制,在接受请求的时候第一时间先判断该请求的地址是否被访问过,如果被访问过则 直接使用缓存中的内容返回,这个东西很讨厌,客户在访问过一次出错后以后每次出现的都是这个错误,所以在请求中给其增加一个时间戳,只要可以随机生成一个 不同的字串就可以,保证Ajax每次都去访问服务器。


posted on 2011-10-21 22:21  长颈鹿Giraffe  阅读(400)  评论(0编辑  收藏  举报