ajax是一项很好的技术,但是它带来方便的同时也有很多限制,比如它只能处理utf-8的字符。
在ajax的请求和结果中经常会出现乱码的问题,主要就是因为utf-8和网页的gb2312或者gbk的转换问题。
1、如果网页使用的不是utf-8,那么在提交时就会出现乱码问题。
2、如果服务器使用的不是utf-8,那么在返回时就会出现乱码问题。
有种简单的处理方法,就是把网页的编码和服务器的编码都改成utf-8,就不会出现乱码问题,但问题是,现在以gb字符
集的网页有很多,这种方法显然不能普遍适用。那么就出现了一些其他的方法,在这里总结一些自己测试成功的方法:
首先比较方便的方法是设置filter,但是如果本来有自己的filter的话,为了兼容,可以加上一个header分辨一下,下面是
csdn上一位朋友写得filter的代码,这里摘过来了:
- package ajax_start.common;
- import java.io.IOException;
- 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;
- public class SetCharacterEncodingFilter implements Filter {
- public SetCharacterEncodingFilter() {
- super();
- }
- protected FilterConfig filterConfig = null;
- protected String ajaxEncoding = "UTF-8";
- protected String commonEncoding;
- protected boolean ignore = true;
- public void init(FilterConfig filterConfig) throws ServletException {
- this.filterConfig = filterConfig;
- commonEncoding = filterConfig.getInitParameter("CommonRequestEncoding");
- String value = filterConfig.getInitParameter("ignore");
- if (value == null)
- this.ignore = true;
- else if (value.equalsIgnoreCase("true"))
- this.ignore = true;
- else if (value.equalsIgnoreCase("yes"))
- this.ignore = true;
- else
- this.ignore = false;
- }
- public void doFilter(ServletRequest req, ServletResponse res,
- FilterChain filterChain)
- {
- try {
- HttpServletRequest request = (HttpServletRequest) req;
- if (ignore || (request.getCharacterEncoding() == null)) {
- if (request.getHeader("RequestType") != null
- && request.getHeader("RequestType").equalsIgnoreCase(
- "ajax")) {
- request.setCharacterEncoding(ajaxEncoding);
- } else if (commonEncoding != null) {
- request.setCharacterEncoding(commonEncoding);
- } else {
- request.setCharacterEncoding("UTF-8");
- }
- }
- filterChain.doFilter(req, res);
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ServletException e) {
- e.printStackTrace();
- }
- }
- public void destroy() {
- this.commonEncoding = null;
- this.filterConfig = null;
- }
- }
web.xml的设置如下:
- <filter>
- <filter-name>SetCharacterEncodingFilter</filter-name>
- <filter-class>
- ajax_start.common.SetCharacterEncodingFilter
- </filter-class>
- <init-param>
- <param-name>CommonRequestEncoding</param-name>
- <param-value>gb2312</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>SetCharacterEncodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
在js里面的处理放方法:
- function sendReq(queryStr) {
- http_request = false;
- if (window.ActiveXObject) {
- try {
- http_request = new ActiveXObject("Msxml2.XMLHTTP");
- } catch (e) {
- try {
- http_request = new ActiveXObject("Microsoft.XMLHTTP");
- } catch (e) {
- eventFlag = "true";
- }
- }
- }else if(window.XMLHttpRequest){
- http_request = new XMLHttpRequest();
- }
- if (!http_request) {
- eventFlag = "true";
- window.alert("xmlhttp not supported!");
- return false;
- }
- http_request.onreadystatechange = processReq;
- http_request.open("GET", queryStr, true);
- http_request.setRequestHeader("RequestType","ajax"); //加上header
- inprocess = true;
- http_request.send(null);
- }
在action里面需要加上一句:
- String name = new String(formbean.getName().getBytes("iso8859-1"));
这样ajax的中文请求就能解决了。
下面是ajax的中文返回方法,网上有很多如为response加上setHeader或者setCharacterEncoding的方法,但是不太好用,我找到了一个比较简单的方法,在取PrinterWriter的时候使用
- PrintWriter writer = new PrintWriter(new OutputStreamWriter(response.getOutputStream(),"utf-8"));
就能简单的完成中文返回的任务了。
希望对大家有所帮助,还有什么好的方法欢迎交流。