[摘]javaeye论坛中关于AJAX中文乱码问题的讨论摘录
1.页面的所有编码设置(包括meta 标签)都设成utf-8
2.后台加个字符编码过滤器,主要代码就是
Java代码
httpServletRequest.setCharacterEncoding("UTF-8");
若要输出内容,则输出之前加
Java代码
httpServletResponse.setCharacterEncoding("utf-8");
---------------------------------------------------------------
在页面encodeURI()一次,在后台URLDecoder.decode(request.getParameter(“参数名”), "utf8")
页面Ajax部分:
var url = '/sample.do?name=' + encodeURIComponent('中文名字');
new Ajax.Request(url, {
method: 'get',
encoding:'UTF-8' ,
onSuccess: function(transport) {
var notice = $('notice');
if(transport.responseText!=null) {
notice=transport.responseText;
alert(notice);
}
}
});
在Servlet或Action里
String str=request.getParameter("name");
response.setCharacterEncoding("UTF-8");
或
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(str);
---------------------------------------------------------------
有这么几种做法,很常见:
1.客户端提交时使用encodeURI或者encodeurIcompent参数来进行utf-8编码,然后发送给服务器,如果使用post方式的话可以通过request.setCharacterEncoding来设定用来解读参数的编码。如果用get方式的话,使用new String(arg.getBytes("iso-8859-1"),"utf-8")的方式来转码。
2.发送ajax请求时,请使用post方式,由于AJAX默认使用utf-8的编码提交参数,因此如果不是文件上传得话,为ajax的Content-Type请求头设置"application/x-www-form-urlencoded;charset="utf-8",以此来通知服务器,客户端发送参数所使用的编码。这样,服务器端可以直接通过String word = request.getParameter("word");来获取经过转码后的参数值,省去了request.setCharacterEncoding。
---------------------------------------------------------------
清一色UTF8,然后Ajax的get里有中文的时候encodeURIComponent一下;
utf-8 ,一定要处理 http 头中的编码格式
---------------------------------------------------------------
最老土的办法末过于结合 getByte,new String (...,'编码格式') 最终转化为所需要的中文字符;
下面介绍一个不需要如此烦琐的方法来实现,也许你们已经知道
-------------------------------------------------------------------
ajax默认中文提交以utf-8格式,所以只需要在你的web服务加个过滤器,设置下编码格式即可;
1.注意为防止编码设置无效,请在编码设置完后,显示调用下request.getParameter("");(tomcat5.0测试通过)
据说其他服务器,可能显示调用了,也有可能被服务器重置;
2.有时已经有filter需要设置gbk编码,为了不影响原先的filter功能,我是直接在ajax提交时候,带个服务端要设置的编码格式 例如 Ajax.request("/myaction.do?charset=utf-8")
服务端filter,要用request.getQueryString() 截取charset值 ,注意千万不要用request.getParameter("charset");
3.注意,在没设置编码格式前,不要加 watch监控 比如有个表达式 request.getParameter("*");
核心代码如下:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException,
ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
try {
String queryString = httpRequest.getQueryString();
//获取浏览器提交的charset
String charset = (String)HttpUtil.getParams(queryString).get("charset");
if(charset!=null){
httpRequest.setCharacterEncoding(charset);
}
else{
httpRequest.setCharacterEncoding("gbk");
}
//使编码生效,在这之前不要调用request.getParameter
request.getParameter("");
} catch (UnsupportedEncodingException e) {
}
// move on to the next
chain.doFilter(request, response);
}
---------------------------------------------------------------
试试这个filter,记得要放到你的Filter最前端,特别是你的EncodeFilter前面
Java代码
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
if (logger.isDebugEnabled()) {
logger
.debug("doFilter(ServletRequest, ServletResponse, FilterChain) - start"); //$NON-NLS-1$
}
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String requestedWith = request.getHeader("x-requested-with");
String type = request.getContentType();
if (requestedWith != null && "XMLHttpRequest".equals(requestedWith)
&& null != type
&& "application/x-www-form-urlencoded".equals(type)) {
logger.info("This's ajax post.set encode is UTF-8.");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
request.getParameterMap();
}
filterChain.doFilter(request, response);
if (logger.isDebugEnabled()) {
logger
.debug("doFilter(ServletRequest, ServletResponse, FilterChain) - end"); //$NON-NLS-1$
}
}
Java代码
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter>
<filter-name>ajaxEncodeFilter</filter-name>
<filter-class>
com.pengpeng.framework.common.filter.AjaxEncodeFilter
</filter-class>
</filter>
---------------------------------------------------------------
ajax默认中文提交以utf-8格式,所以只需要在你的web服务加个过滤器,设置下编码格式即可;
1.注意为防止编码设置无效,请在编码设置完后,显示调用下request.getParameter("");(tomcat5.0测试通过)
据说其他服务器,可能显示调用了,也有可能被服务器重置;
2.有时已经有filter需要设置gbk编码,为了不影响原先的filter功能,我是直接在ajax提交时候,带个服务端要设置的编码格式 例如 Ajax.request("/myaction.do?charset=utf-8")
服务端filter,要用request.getQueryString() 截取charset值 ,注意千万不要用request.getParameter("charset");
3.注意,在没设置编码格式前,不要加 watch监控 比如有个表达式 request.getParameter("*");
首先分析通过正常GET,Post提交页面和AJAX提交页面有什么不同看截图
Get ,Post正常方式提交数据
AJAX方式提交数据
主意AJAX多了个x-requested-with信息所以可以采用获取HTTP Header方法来判断是采用那种提交方式提交数据的所以
主要代码如下
Java代码
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String requestedWith = httpRequest.getHeader("x-requested-with");
String type = request.getContentType();
if (requestedWith != null && "XMLHttpRequest".equals(requestedWith)
&& null != type
&& "application/x-www-form-urlencoded".equals(type)) {
httpRequest.setCharacterEncoding("UTF-8");
httpResponse.setCharacterEncoding("UTF-8");
httpRequest.getParameterMap();
} else {
request.setCharacterEncoding("gbk");
response.setContentType("text/html;charset=" + "gbk");
}
chain.doFilter(request, response);
}
---------------------------------------------------------------
---------------------------------------------------------------
posted on 2011-03-26 15:23 LeeXiaoLiang 阅读(158) 评论(0) 收藏 举报
浙公网安备 33010602011771号