springmvc中对中文乱码等的处理


做了一个很简单的安卓手机和后台服务的通信小系统,一直测试是有中文乱码的,但是觉得也有可能是前台的显示字符编码的原因,所以一直没有当回事儿。

开始联调后,发现了一个问题,虽然在WEB页面上显示是乱码,但是在Android手机里获得的却是正常的。不过却多了一对双引号,即是如下情形:

  {"address":"鍦�","age":17,"cardid":"123","name":"jack","sex":"3"}

结果却变成了这样:

"{\"address\":\"涓婂湴\",\"age\":17,\"cardid\":\"123\",\"name\":\"jack\",\"sex\":\"0\"}"

多了一对双引号和一些转义字符。

在后台使用的是阿里的fastjson,转换的形势如下:

@ResponseBody
@RequestMapping
(value = "/getPersonData/{carID}",produces="text/plain;charset=UTF-8")
public ResponseEntity<String> getPersonData(@PathVariable String carID)
//public ResponseEntity<String>getPersonData()
{
    PersonBase pb =
pService.getPersonById(carID);
   
HttpHeaders headers = new HttpHeaders();
   
headers.setContentType(MediaType.TEXT_PLAIN);
   
String s = JSON.toJSONString(pb);
   
return  new ResponseEntity<String>(s,headers,HttpStatus.OK);
}

而在安卓端使用相同的逆向转换:

PersonBase pb = JSON.parseObject(data,PersonBase.class);

结果却报转换结构异常,后来手动去掉了前面提到的双引号,但又报“\不是相关的什么什么的”。

后来仔细考虑,写死字符串才突然明白,原来就是多了双引号,导致内部的转义字符”\”转成了普通字符。但是手工去除这个双引号还不行,必须在传输阶段就去除。

在网上找了好多方法,都不行,比如常见的:

第一种:

<!-- 处理请求时返回json字符串的中文乱码问题-->

   <mvc:annotation-driven>

       <mvc:message-converters>

           <beanclass="org.springframework.http.converter.StringHttpMessageConverter">

                <propertyname="supportedMediaTypes">

                    <list>

                       <value>application/json;charset=UTF-8</value>

                    </list>

                </property>

           </bean>

       </mvc:message-converters>

   </mvc:annotation-driven>

这种处理完成后,就会中文变成了?号,不过也正是从这里入手找到解决方法。因为它处理完成后确实是没有双引号了。

第二种:

RequestMapping中添加如下配置:

produces = {"application/json;charset=UTF-8" } 

可是目前就是使用的这种方法,区别是produces="text/html;,没有啥特别的不同,抱着万一的希望试了试,还是不行。

最后发现这个可以:

http://blog.csdn.net/u010957324/article/details/9174001,非常感谢分享。

<bean id="utf8Charset"class="java.nio.charset.Charset" 

       factory-method="forName"> 

       <constructor-arg value="UTF-8"/> 

   </bean> 

 

   <mvc:annotation-driven> 

       <mvc:message-converters> 

           <beanclass="org.springframework.http.converter.StringHttpMessageConverter"> 

                <constructor-argref="utf8Charset" /> 

           </bean> 

       </mvc:message-converters> 

   </mvc:annotation-driven> 

这个增加进去后就处理好结果了。

但是还是会有中文乱码,好的,这样解决:

<filter>

 <filter-name>characterEncodingFilter</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>

  <init-param>

  <param-name>forceEncoding</param-name>

  <param-value>true</param-value>

  </init-param>

 </filter>

 <filter-mapping>

 <filter-name>characterEncodingFilter</filter-name>

 <url-pattern>/*</url-pattern>

 </filter-mapping>

将这段代码拷贝到web.xml中,结果报错,一查,发现已经有了类似的代码,但是没有红色部分,将红色部分增加,就出现了正常的JSON数据:

{"address":"地","age":17,cardid":"123","name":"jack","sex":"3"}

所以说,JAVA的东西还是配置太多,导致学习的成本还是比较高的,对于老手,可能就是一两分钟的事儿,对于新手,可能就是半天一天,甚至更长。

点滴积累,贵在坚持。

猜你喜欢

转载自blog.csdn.net/fpcc/article/details/71131697
今日推荐