排在请求中的UTF-8编码

在我的Android应用程序中,我使用Volley JsonArrayRequest加载JSON数据。 数据是由我自己创build的,我用UTF-8编码将它们保存为Sublime。 当我得到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中的这个编码问题?

如果你知道所有你要求的文件都是UTF-8格式的话,那么你可能会考虑强制你的Volley请求返回UTF-8格式的string。 你可以通过inheritance标准的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)); } } } 

我有这样的问题,我解决它使用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(); 

我希望这会对你有用

不要使用try {}捕获onResponse块,这是给我的代码中的一些问题,而不是你可以像这样实现。

 @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; } 

这对我来说是一种魅力,我刚从@Muhammad Naeem的回答中创build了一个静态方法,,谢谢Muhammed ..

 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; } 

另一种方法:你可以用这行代码来编码你的整个响应。

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

我已经将整个响应string编码为UTF-8,因为我知道排除的默认编码方法是iso8859-1

要在内容types如“text / html; charset = utf-8”中指定在服务器部分设置utf-8,

前两天我有同样的问题,我已经尝试了我的朋友刚才所说的每一件事情,这是同样的问题,我试图如此meany东西..我的文件是用PHP编写的,并使用凌空获得数据为JSON我按照这些步骤来解决这个问题。

  1. 在数据库中执行查询之前,请编写此查询

    mysqli_query($这 – >连接, “set_NAMES_utf8”);

  2. 在你的文件中使用这个头,如果它的PHP

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

  3. 而根据PHP呼应json时,有一个解决这个问题在json_encode($json,JSON_UNESCAPED_UNICODE)使用这个特殊的json_encode($json,JSON_UNESCAPED_UNICODE)

    我希望它帮助