排球请求中的UTF-8编码

时间:2015-01-13 21:48:39

标签: android encoding utf-8 android-volley

在我的Android应用中,我使用Volley JsonArrayRequest加载json数据。数据是由我自己创建的,我用Sublime用UTF-8编码保存它们。当我收到Response并填写ListView时,文本显示不正确(变音符号)。这就是我的请求的样子:

JsonArrayRequest request = new JsonArrayRequest(targetUrl,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(final JSONArray response) {
                        try {
                            fillList(response);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
        requestQueue.add(request);

当我使用此方法加载完全相同的数据时,所有文本都会正确显示:

final StringBuilder builder = new StringBuilder();
        final HttpClient client = new DefaultHttpClient();
        final HttpGet httpGet = new HttpGet(request);
        try {
            final HttpResponse response = client.execute(httpGet);
            final StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                final HttpEntity entity = response.getEntity();
                final InputStream content = entity.getContent();
                final BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }
            } else {

            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

所以对我来说,似乎我的json文件的编码没有问题。如何在Volley中修复此编码问题?

10 个答案:

答案 0 :(得分:23)

如果你知道你要求的绝对所有文件都是UTF-8格式,听起来就是这样,那么你可能会考虑强制你的Volley请求返回UTF-8格式的字符串。您可以通过继承标准JSON请求来实现此目的。像这样:

public class Utf8JsonRequest extends JsonRequest<JSONObject> {
    ...
    @Override
    protected Response<JSONObject> parseNetworkResponse (NetworkResponse response) {
        try {
            String utf8String = new String(response.data, "UTF-8");
            return Response.success(new JSONObject(utf8String), HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            // log error
            return Response.error(new ParseError(e));
        } catch (JSONException e) {
            // log error
            return Response.error(new ParseError(e));
        }
    }
}

答案 1 :(得分:9)

我有同样的问题,我使用UTF-8字符集来解决它。

String str = "";
try {
     str = new String(strFromService.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {

 e.printStackTrace();
}

String decodedStr = Html.fromHtml(str).toString();

我希望这对你有用

答案 2 :(得分:7)

不要在onResponse块中使用try {} catch,这会在我的代码中产生一些问题,而不是像你这样实现。

@Override 
onResponse(String s) {

s= fixEncoding(s);
Toast.makeToast(this,s,Toast.LENGTH_LONG).show();

}

我想你会得到所需的结果

 public static String fixEncoding(String response) {
            try {
                byte[] u = response.toString().getBytes(
                        "ISO-8859-1");
                response = new String(u, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return null;
            }
            return response;
        }

答案 3 :(得分:5)

这对我来说是一种魅力,我只是从@Muhammad Naeem的答案创建了一个静态的方法,谢谢穆罕默德......

public static String fixEncodingUnicode(String response) {
    String str = "";
    try {
        str = new String(response.getBytes("ISO-8859-1"), "UTF-8");
    } catch (UnsupportedEncodingException e) {

        e.printStackTrace();
    }

    String decodedStr = Html.fromHtml(str).toString();
    return  decodedStr;
}

答案 4 :(得分:4)

在排球响应中添加以下代码行:

 public void onResponse(String response) 
    {

     if (response != null) 
      {
        response=new String(response.getBytes("ISO-8859-1"), "UTF-8");
      }
   }

答案 5 :(得分:2)

另一种方法:您可以通过这行代码对整个响应进行编码。

newStr = URLDecoder.decode(URLEncoder.encode(oldStr, "iso8859-1"),"UTF-8");

我已将整个响应字符串编码为UTF-8,因为我知道volley默认编码方法是iso8859-1

答案 6 :(得分:0)

在内容类型中指定服务器部分集utf-8,例如“text / html; charset = utf-8”

答案 7 :(得分:0)

两天前我遇到了同样的问题,我已经尝试过我的朋友们说的所有事情,这也是同样的问题,我尝试了很多东西...... 我的文件是用PHP编写的,并使用齐射来获取数据,因为json我按照这些步骤来解决问题..

  1. 在数据库中执行查询之前写下此查询

    mysqli_query($这 - &GT;连接 “set_NAMES_utf8”);

  2. 如果是php

    ,请在您的文件中使用此标题

    header('Content-Type:application / json; charset = utf-8');

  3. 当你根据php回应json时,有一个解决这个问题的方法 在json_encode($json,JSON_UNESCAPED_UNICODE)

    中使用这个特殊的charachter

    我希望它有所帮助

答案 8 :(得分:0)

我只在我的 public void onResponse(){} 方法中使用此代码行,效果很好。

          if (response != null){
                try {
                    response=new String(response.getBytes("ISO-8859-1"), "UTF-8");

                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }

答案 9 :(得分:0)

StringRequest request = new StringRequest(URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            if (response != null){
                dialog.dismiss();
                try {
                    response=new String(response.getBytes("ISO-8859-1"), "UTF-8");
                    JSONArray jsonArray = new JSONArray(response);
                    parseArray(jsonArray);

                } catch (JSONException | UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }

        }
    }