您的位置:首页 > 移动开发 > Android开发

Android-Volley解析中文乱码

2016-01-21 14:13 176 查看
用Volley解析数据的时候,出现中文全部为乱码,出现乱码的问题,通常都是编码问题,那如果数据被加密了,是否也会乱码呢?应该也会乱码吧,不过这种情况下,就不光是中文乱码了。

Android-HttpClient连接网络获取数据中使用HttpURLConnection 的时候,就手动去设置了编码格式:

public String getStringFromStream(InputStream in, int len) throws UnsupportedEncodingException, IOException{
Reader reader = null;
reader = new InputStreamReader(in, "UTF-8");
char[] buffer = new char[len];
reader.read(buffer);
return new String(buffer);
}
而Volley没有给我们手动设置编码格式的入口,说明被封装在代码里边,剩下的就是在Volley找到设置编码方式的code了。怎么找?

看Volley源代码了,比较稳妥的办法。当然也有些小技巧,不是特么一定是对的方法,或者说只是针对个人的一些习惯,比如我在找Volley设置编码方式的地方,我的第一反应不是去一步一步分析源代码,从而找到设置编码方式的地方,即使我之前分析过Volley的源码,但是我依然不会首选一步步分析源码到设置编码的地方。

我通常是这么干的:既然要去解析数据,那么就跟解析挂钩,解析的英文大致是parse,然后看看volley的源文件,看看那个类名有parse,不过很幸运的是,在Volley看到有parse字样的一个类名:HttpHeaderParser.java,然后就在方法parseCharset()看到了设置编码方式的地方:

/**
* 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;
}
此方法最后返回的并不是UTF-8,所以将它改为返回UTF-8:
/**
* 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.UTF_8;
}


话又说回来了,为什么我说“幸运”呢,确实是幸运,这种小技巧只是针对个人的,同时也设计到代码的可读性,如果可读性低点的code,除了写代码的本人,其他人在不了解的情况下,这种小技巧完全不适用,所以为什么程序员要注重编码风格,如此可见一斑啊!

当然了,如果没有找到有Parse字样的类,可以搜一下parse,比如在ubuntu下grep 一下parse,然后再查看代码。如此幸运的话,找到需要的代码块,有时候就能很好的提高自己的一点效率,要是没有找到,就只能去分析源代码了,可能花费的时间要稍微多些。

以上就是本人在解决Volley解析中文乱码时候的一些想法了,仅供参考,有错误请帮忙指针,共同学习、进步!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: