做了一个很简单的安卓手机和后台服务的通信小系统,一直测试是有中文乱码的,但是觉得也有可能是前台的显示字符编码的原因,所以一直没有当回事儿。
开始联调后,发现了一个问题,虽然在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的东西还是配置太多,导致学习的成本还是比较高的,对于老手,可能就是一两分钟的事儿,对于新手,可能就是半天一天,甚至更长。
点滴积累,贵在坚持。