使用Volley(UTF-8)对非拉丁字母的回复

时间:2016-11-05 15:19:49

标签: android encoding utf-8 android-volley

我正在使用Volley从网站下载文本文件。

这是示例文本文件的内容:

  

NEONWönn30€KostümgrößterSpaß   TESTTESTTESTTEST★★★★TESTTEST ::: TEST

我把它放在记事本中并在SaveFileDialog中选择“编码UTF-8”。 在服务器管理器的Filezilla中,我在上传文件之前选择了“强制UTF-8”。

当我使用Volley下载时,响应将如下所示:

  

NEONWönn30â¬KostümgröÃterSpaà   TESTTESTTESTTESTââââTESTTEST::: TEST

这是我的方法:

    public static void getRequest(String url) {
    RequestQueue queue = Volley.newRequestQueue(activity);

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    //response is gibberish :/
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("VolleyError", error.toString());

        }
    });
     stringRequest.setShouldCache(false);
    // Add the request to the RequestQueue.
    queue.add(stringRequest);
}

有没有办法通过强制Volley使用UTF-8编码来解决这个问题?

2 个答案:

答案 0 :(得分:1)

我不得不覆盖这种方法:

@Override
protected Response<String> parseNetworkResponse(
        NetworkResponse response) {

    String strUTF8 = null;
    try {
        strUTF8 = new String(response.data, "UTF-8");

    } catch (UnsupportedEncodingException e) {

        e.printStackTrace();
    }
    return Response.success(strUTF8,
            HttpHeaderParser.parseCacheHeaders(response));
}

答案 1 :(得分:0)

我正在使用一台服务器(我无法控制),该服务器发送回UTF-8响应,而未在content-type标头中设置字符集。在这种情况下,Volley当前默认为ISO-8859-1。

我只是想更改默认字符集,而不必强制每个对UTF-8的响应。我最终只是使用parseNetworkResponse()来拦截Volley的响应处理,并检查响应头中是否缺少字符集。如果丢失,我强迫它看起来像服务器说“ charset = UTF-8”,然后继续进行正常处理。

@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {

    // Volley's default charset is "ISO-8859-1". If no charset is specified, we want to default to UTF-8. 
    String charset = HttpHeaderParser.parseCharset(response.headers, null);

    if (null == charset) {
        String contentType = response.headers.get("Content-Type");
        contentType = (null != contentType) ? (contentType + ";charset=UTF-8") : "charset=UTF-8";
        response.headers.put("Content-Type", contentType);
    }

    return super.parseNetworkResponse(response);
}