なぜAndroid Volleyで戻ってきた中国語は文字化けしているのか、postmanは正常に表示されている.

2802 ワード

それはサーバがデータを返すヘッダにcharset=UTF-8が設定されていない場合、VolleyはデフォルトでISO-8859-1にデータを伝承し、以下はソースコードであるからです.
StringRequest.java
protected Response parseNetworkResponse(NetworkResponse response) {
    String parsed;
    try {
        parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        Log.e("-----JSON----", parsed);
        if(this.needCache && !parsed.equals(DataCache.getDataCache().queryCache(this.url))) {
            DataCache.getDataCache().saveToCache(this.url, parsed);
        }
    } catch (UnsupportedEncodingException var4) {
        parsed = new String(response.data);
    }

    return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}


HttpHeaderParser.java
public static String parseCharset(Map headers) {
    String contentType = (String)headers.get("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 && pair[0].equals("charset")) {
                return pair[1];
            }
        }
    }

    return "ISO-8859-1";
}