如何获得Android Volley StringRequest GET以UTF-8编码返回响应

时间:2018-01-04 14:35:56

标签: android utf-8 android-volley

如何让Android Volley StringRequest GET以UTF-8编码返回响应?它似乎只返回ISO-8859-1中的响应。

是否可以让它接受UTF-8字符串?

2 个答案:

答案 0 :(得分:0)

StringRequest调用HttpHeaderParser.parseCharset(response.headers)从响应头获取字符集,标题中的'Content-Type'不包含'charset',默认字符集返回为'ISO-8859-1'。

StringRequest.java

protected Response<String> parseNetworkResponse(NetworkResponse response) {
    String parsed;
    try {
        parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
    } catch (UnsupportedEncodingException var4) {
        parsed = new String(response.data);
    }

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

HttpHeaderParser.java

public static String parseCharset(Map<String, String> headers, String defaultCharset) {
    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 defaultCharset;
}

/**
 * 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) {
    return parseCharset(headers, HTTP.DEFAULT_CONTENT_CHARSET);
}

所以,您可以通过两种方式解析为'UTF-8':

  1. 告诉您的网络服务器在标题中添加'内容类型'并带有'charset = UTF-8'

  2. 创建StringRequest的子类并覆盖parseNetworkResponse方法

答案 1 :(得分:0)

您可以尝试将文本从ISO-8859-1转换为UTF-8,但这很慢!

<=2