问题描述:
使用StringRequest这个类访问网络的时候,返回来的数据包含中文,出现了中文乱码,无论怎么改服务端的文件或是改项目编码,或是用gbk和utf-8去重新编码返回来的字符串,都无法解决编码问题。
打开这个类的源码,看看他是如何编码。
解决方案:
打开StringRequest类的源码,处理编码的方法如下:
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
打开HttpHeaderParser类的parseCharset方法,处理编码的方法如下:
public static String parseCharset(Map<String, String> headers) {
return parseCharset(headers, HTTP.DEFAULT_CONTENT_CHARSET);
}
其中HTTP.DEFAULT_CONTENT_CHARSET就是 ISO-8859-1。这段代码会根据服务器端返回来的网页头信息获取Content-Type中的charset,如果没有获取到, 默认编码就是ISO-8859-1。
只要把HTTP.DEFAULT_CONTENT_CHARSET改成需要的编码就可以了,比如我的就改成:HTTP.UTF_8。
或者直接在parseNetworkResponse方法中不根据网页头信息获取编码,而是直接指定编码:
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, <span style="font-family: KaiTi_GB2312; font-size: 18px;">HTTP.UTF_8</span>);
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
根据具体需求使用具体的方式。
Volley是Google提供的网络通信库,使得网络请求更简单、更快速。
项目地址:https://android.googlesource.com/platform/frameworks/volley