Android-Volley解析中文乱码

用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 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 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解析中文乱码时候的一些想法了,仅供参考,有错误请帮忙指针,共同学习、进步!

你可能感兴趣的:(Android-网络)