论坛首页 Java企业应用论坛

gbk编码下json传输中文乱码问题,亟待解决,求技术支持~

浏览 8441 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-09-15  
暑假期间花时间做了一个之前就构想好的社交网站(这学期大四,兴趣爱好做着玩玩的),因为涉及到图片上传等功能,所以struts2配置文件那边必须配置为
<constant name="struts.i18n.encoding" value="gbk"></constant>

但后面像发布状态、回复啊等等之类的功能为改善用户体验不可避免的用到了AJAX,我用的是struts2的json插件,接着乱码的问题就来了。
因为struts2的配置文件中设置了编码格式为gbk,加上在tomcat serve.xml中修改URIEncoding=gbk,但json插件对工程编码的要求却是UTF-8.
中文字符以UTF-8编码时占3个字节,而gbk却是两个,所以这也就产生了一个很有意思但却异常蛋疼的现象,输入的文字为奇数个时,末尾的那个字就会乱码,偶数时则可能不会(只是可能,如输入文字中含有“一”时则各种乱码),之前因为赶着做项目小聪明的用了一个投机取巧的方法,我在使用jquery post请求的时候先判断一下字数,奇数个时我就在末尾添加一个"齱"(这个字因该很少有人用到吧),到action中的时候我再把它截掉,试了试貌似还凑合,就继续赶工了(因为我还要复习考研⊙﹏⊙b汗)。但项目最近做完了,却唯独只剩下了遗留下来的这个隐患,乱码问题依旧还在,一大段文字中总会间或出现几个特不舒服的“??”,辛辛苦苦各种努力改善体验做出来的东西最后却败笔在这个乱码问题上。
我网上涉及到gbk编码下json中文乱码的资料却多是关于PHP的,难道java中很少有人碰到?
唯独找到这篇帖子http://flym.iteye.com/blog/183534#,他的问题是与我一样一样的,不才原本对过滤器就不是特别理解,没看懂他的“像过滤器一样,在进行参数编码前设置正确的编码”解决方式。
大牛们能给我提提解决问题的方法吗?或者帮助我以更好理解的方式解读一下他的解决方法,不甚感激。

   发表时间:2011-09-15  
我也遇到过差不多的问题。
处理方法:
1,ajax提交采用post,请求头设置 Content-Type为application/x-www-form-urlencoded;charset=utf-8;如果使用的是jquery等框架,一般默认就已经添加了这个请求头。
2,对于ajax提交的请求,后台设置request.setCharacterEncoding("utf-8");如果开启了过滤器,可以放置在过滤器中,最好判断下是否ajax请求,如果不是,那么编码设置为gbk。
补充:
如果不解决问题,提交的内容不多的话,可以采用二次编码方式(encodeURIComponent )
后台使用utf-8解码一次即可。
祝你好运
0 请登录后投票
   发表时间:2011-09-15  
用Java bin中的native2ascii.exe去转换试试
0 请登录后投票
   发表时间:2011-09-16  
JSON支持\uXXXX的写法的啊;
后台Java可以这么写:
String json = "{中国:'北京'}";
StringBuilder encodedJson = new StringBuilder();
for(int i=0; i<json.length();i++){
    char c = json.charAt(i);
    if(c>127){
        encodedJson.append("\u").append(Integer.toHexString(c));
        //这里需要考虑补足四位
    }else{
        encodedJson.append(c);
    }
}
return encodedJson.toString();
0 请登录后投票
   发表时间:2011-09-16   最后修改:2011-09-16
问题已解决,通过滤器最终搞定的,之前查询的有的帖子居然已经建议在Jquery或者json-plugin的源码中做修改了,有些夸张了,不多废话。
过滤器:
package com.sobreak.bytefilter;

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;  
import javax.servlet.http.HttpServletResponse;  
  
public class Testfilter implements Filter {  
  protected String encoding=null;  
  protected FilterConfig filterConfig=null;  
  protected boolean ignore=true;  
  
  public void destroy() {  
  
  }  
  
  public void doFilter(ServletRequest servletRequest,  
  ServletResponse servletResponse, FilterChain filterChain)  
  throws IOException, ServletException {  
   
  
  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)||"application/x-www-form-urlencoded; charset=UTF-8".equals(type))) {  
   
  request.setCharacterEncoding("UTF-8");  
  response.setCharacterEncoding("UTF-8");  
  request.getParameterMap();  
  }
   

  
  filterChain.doFilter(request, response);  
  
  }  
  
  public void init(FilterConfig arg0) throws ServletException {  
  // TODO Auto-generated method stub  
   
  }  
 


web.xml中配置
<filter>
  <filter-name>encoding</filter-name>
  <filter-class>com.sobreak.bytefilter.Testfilter</filter-class>
  <init-param>
  <param-name>encoding</param-name>
  <param-value>GBK</param-value>
  </init-param>
  </filter>
  <filter-mapping>
  <filter-name>encoding</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>

 
    <filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
结帖,谢谢大家!
0 请登录后投票
   发表时间:2011-09-17  
...编码和json有什么关系。。
0 请登录后投票
   发表时间:2011-09-17  
  request.setCharacterEncoding("UTF-8");  
  response.setCharacterEncoding("UTF-8");  
0 请登录后投票
   发表时间:2011-09-17  
struts2.1.0好像有此问题。
0 请登录后投票
   发表时间:2011-09-20  
zhongliangjun1 写道
问题已解决,通过滤器最终搞定的,之前查询的有的帖子居然已经建议在Jquery或者json-plugin的源码中做修改了,有些夸张了,不多废话。
过滤器:
package com.sobreak.bytefilter;

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;  
import javax.servlet.http.HttpServletResponse;  
  
public class Testfilter implements Filter {  
  protected String encoding=null;  
  protected FilterConfig filterConfig=null;  
  protected boolean ignore=true;  
  
  public void destroy() {  
  
  }  
  
  public void doFilter(ServletRequest servletRequest,  
  ServletResponse servletResponse, FilterChain filterChain)  
  throws IOException, ServletException {  
   
  
  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)||"application/x-www-form-urlencoded; charset=UTF-8".equals(type))) {  
   
  request.setCharacterEncoding("UTF-8");  
  response.setCharacterEncoding("UTF-8");  
  request.getParameterMap();  
  }
   

  
  filterChain.doFilter(request, response);  
  
  }  
  
  public void init(FilterConfig arg0) throws ServletException {  
  // TODO Auto-generated method stub  
   
  }  
 


web.xml中配置
<filter>
  <filter-name>encoding</filter-name>
  <filter-class>com.sobreak.bytefilter.Testfilter</filter-class>
  <init-param>
  <param-name>encoding</param-name>
  <param-value>GBK</param-value>
  </init-param>
  </filter>
  <filter-mapping>
  <filter-name>encoding</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>

 
    <filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
结帖,谢谢大家!


编码问题,应该和json源码没有关系吧。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics