标签:
近期在项目中使用Volley作为网络通信框架,却发现在传输中文时会出现乱码。先交代一下项目的软硬件的基础设施 
线上: 
Django+restful_framework+monogdb 
APP: 
Android + volley
在使用android端测试之前,我使用了chrome中的Postman这款插件进行了测试,发现,中文读取是正常的。说明服务器返回的是UTF-8字符编码的数据。 
但是为什么在Android端会出现乱码的现象呢。 
我在想是不是本地端的字符编码出了问题? 
我就是用String类的转码功能,发现不起作用。 
一筹莫展。 
我去网上搜索了一下,大部分都是volley默认采用的是UTF8的字符编码格式。可是服务器返回来的UTF-8的字符串为什么就是显示乱码呢。 
接着我就想到了查看volley的源代码。 
我发现volley的整个框架的结构是这个样子的,首先Android端构造不同类型的request对象,总得来说有这几大类:
protected Response<T> parseNetworkResponse(NetworkResponse response);protected void deliverResponse(T response); @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 字符集。 Android Volley 框架JSON中文乱码问题的解决
标签:
原文地址:http://my.oschina.net/u/1247737/blog/393959