Android Volley 框架JSON中文乱码问题的解决

近期在项目中使用Volley作为网络通信框架,却发现在传输中文时会出现乱码。先交代一下项目的软硬件的基础设施
线上:
Django+restful_framework+monogdb
APP:
Android + volley

在使用android端测试之前,我使用了chrome中的Postman这款插件进行了测试,发现,中文读取是正常的。说明服务器返回的是UTF-8字符编码的数据。
但是为什么在Android端会出现乱码的现象呢。
我在想是不是本地端的字符编码出了问题?
我就是用String类的转码功能,发现不起作用。
一筹莫展。
我去网上搜索了一下,大部分都是volley默认采用的是UTF8的字符编码格式。可是服务器返回来的UTF-8的字符串为什么就是显示乱码呢。
接着我就想到了查看volley的源代码。
我发现volley的整个框架的结构是这个样子的,首先Android端构造不同类型的request对象,总得来说有这几大类:

  • JSONObjectRequest
  • JSONArrayRequest
  • StringRequest
    它们都有一个共同的基类——Reuqest。所有继承Request的子类都必须覆盖以下两个方法:
  • protected Response<T> parseNetworkResponse(NetworkResponse response);
  • protected void deliverResponse(T response);
    第一个方法是用来解析服务器返回的原始数据。response对象包含了返回数据的body、headers等内容,需要在该方法中对返回数据进行解析。比如JSONObjectRequest就是使用response中的body字符串
    构造一个JSONObject对象,传递给监听器的对象。这样的设计默认了消息的发送者必将知道服务器的返回是如何解析的这一潜规则。
    接着,我就查看了一下JSONOBjectReuqest类中的parseNetworkResponse方法,看看它在将结果传递给监听器之前做了什么。
    源代码如下:
    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString =
                new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONObject(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }
    

    我们看到了,JSONObjectRequest这个类在将数据返回给监听器之前,是对字符串进行了转码的。我们貌似接近了问题的本质。那就接着查看HttpHeaderParser.parseCacheHeaders(response),是怎么获取字符集的。我猜想里面肯定包含了默认的字符集的定义。
    打开代码:

    /**
     * Returns the charset specified in the Content-Type of this header,
     * or the HTTP default (ISO-8859-1) if none can be found.
     */
    public static String parseCharset(Map<String, String> headers) {
        String contentType = headers.get(HTTP.CONTENT_TYPE);
        if (contentType != null) {
            String[] params = contentType.split(";");
            for (int i = 1; i < params.length; i++) {
                String[] pair = params[i].trim().split("=");
                if (pair.length == 2) {
                    if (pair[0].equals("charset")) {
                        return pair[1];
                    }
                }
            }
        }
        return HTTP.DEFAULT_CONTENT_CHARSET;
    }
    

    看到了注释,一切都水落石出了,原来,如果在服务器的返回数据的header中没有指定字符集那么就会默认使用 ISO-8859-1 字符集。
    ISO-8859-1的别名叫做Latin1。这个字符集支持部分是用于欧洲的语言,不支持中文~
    很不能理解为什么将这个字符集作为默认的字符集。Volley这个框架可是要用在网络通信的环境中的。
    吐槽也没有用,我们来看一下如何来解决中文乱码的问题。有以下几种解决方式:

  • 在服务器的返回的数据的header的中contentType加上charset=UTF-8的声明。
  • 当你无法修改服务器程序的时候,可以定义一个新的子类。覆盖parseNetworkResponse这个方法,直接使用UTF-8对服务器的返回数据进行转码。
    好的,写完了。
    我们总结一下,从这个问题的解决中,我们能够获取以下的经验:
    1.网上的信息不能够全信,要相信自己的判断。
    2.看源代码很重要,一般通过源代码找问题解决的办法是最快的。比在网上漫无目的的搜索要来的高效。
时间: 2024-10-15 19:50:49

Android Volley 框架JSON中文乱码问题的解决的相关文章

SpringMVC的@ResponseBody返回JSON,中文乱码问题的解决.

SpringMVC的@ResponseBody,返回json,如果有中文显示乱码的解决办法. 在SpringMVC的配置文件中 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> </bean> 查看了AnnotationMethodHandlerAdapter的源码,发现其默认编码为构造参数有StringHttpMessageC

arcgis for android 读取shp文件中文乱码解决方法

设置注册表默认字符,即可解决中文乱码问题. 'dbfDefault' 设置方法1.开始--运行,输入”Regedit“,打开注册表.2.如是用的是 10.x 版本 ArcGIS Desktop,定位到”My Computer\HKEY_CURRENT_USER\Software\ESRI\Desktop 10.x' (如果是9.3.1之前的版本,定位到 'My Computer\HKEY_CURRENT_USER\Software\ESRI').3.创建项 'Common',接着创建 'Code

springmvc 提供的统一解决json中文乱码配置

<!--springmvc 统一解决json中文乱码问题--><mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value=&qu

CentOS中文乱码问题的解决方法

一.CentOS系统访问 xxx.cn ,发现中文乱码于是用以前的方式:# yum -y install fonts-chinese # yum -y install fonts-ISO8859 CentOS系统安装完成后,重新启动即可. 二.终端. gedit 显示乱码# vim /etc/sysconfig/i18n 将:LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16" 修改原内容为: LANG="zh_CN

get/post时中文乱码问题的解决办法

常有的方法,get请求用在tomcat的编码改为utf-8 即可 post 过滤器就可以 一.常识了解 1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码: 3.getBytes() 是通过平台默认字符集进行编码: 二.中文乱码出现 在学习任何一门技术时,经常会有初学者遇到中文乱码问题,比如MySQL,是因为在安装时没有设置:而在Servlet中

Sublime Text 3中文乱码问题的解决(最有效)

Sublime Text 3中文乱码问题的解决(最有效) Sublime Text 3是很好的代码编辑器,没有之一,因为她的性感高亮代码配色,更因为它的小巧,但是它默认不支持GBK的编码格式,因此打开GBK的代码文件,如果里面有中文的话,就会乱码,如下所示:  解决步骤如下: 大家如果是在官网下载的Sublime Text 3,那么首先需要安装一个 Package Control包,这是一个用来安装其他插件的包,不管装什么插件,首先要先装这个包才行  按ctrl+~快捷键,调出一个小文本款,然后

IDEA2014开发Java程序以及中文乱码问题的解决

IDEA2014开发Java程序以及中文乱码问题的解决 我们知道IDEA是可以很强大的集成开发环境,不仅可以开发Web工程,还可以开发Java运行程序,但是在进行Java开发之前,我们需要对IDEA做一些配置工作.步骤如下: 下载IDEA2014下载地址,过期私聊我(http://pan.baidu.com/s/1jIfbtdW) 下载JDK64位机(http://download.oracle.com/otn-pub/java/jdk/8u77-b03/jdk-8u77-windows-x64

jquery.ajax的url中传递中文乱码问题的解决方法

jquery.ajax的url中传递中文乱码问题的解决方法 JQuery JQuery默认的contentType:application/x-www-form-urlencoded 这才是JQuery正在乱码的原因,在未指定字符集的时候,是使用ISO-8859-1 ISO8859-1,通常叫做Latin-1.Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符. JQuery的Ajax根本没有考虑到国际化的问题,使用了欧洲的字符集,所以才引起了传递中文出现乱码的问题. 而我们的UTF-8

windows下mysql中文乱码, 配置解决方法

内容源自:windows下mysql中文乱码, 配置解决方法 解决方法:打开mysql安装目录,打开my.ini文件(如果只有my-default.ini文件,先将其改名为my.ini!!!) 修改内里配置: [mysqld] character-set-server=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8 如图: 修改完成后重启MySQL服务:(右键重新启动) 完成: 原文地址:ht