排球请求中的UTF-8编码

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

 JsonArrayRequest request = new JsonArrayRequest(targetUrl, new Response.Listener() { @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格式的字符串。 您可以通过inheritance标准JSON请求来实现此目的。 像这样的东西:

 public class Utf8JsonRequest extends JsonRequest { ... @Override protected Response 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(); 

我希望这对你有用

不要在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; } 

这对我来说是一种魅力,我只是从@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; } 

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

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

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

在排球的响应中添加这行代码:

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

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

我在两天前遇到了同样的问题,我已经尝试了我的朋友刚刚说的所有事情,这是同样的问题,我尝试了很多东西..我的文件是用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)

    我希望它有所帮助