Volley 请求中的 UTF-8 编码

UTF-8 encoding in Volley Requests

在我的 Android 应用程序中,我正在使用 Volley JsonArrayRequest 加载 json 数据。数据是我自己创建的,我用 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 请求强制为 return 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));
        }
    }
}

我遇到了同样的问题,我使用 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 的回答创建了一个静态方法,谢谢 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;
}

要在服务器部分中指定内容类型设置为 utf-8,例如 "text/html;charset=utf-8"

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

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

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

两天前我遇到了同样的问题,我已经尝试了我朋友们刚才说的每件事,但都是同样的问题,我尝试了很多卑鄙的事情.. 我的文件是用 php 编写的,并使用 volley 获取数据 json 我按照这些步骤解决了问题..

  1. 在你的数据库中执行查询之前写这个查询

    mysqli_query($this->connection,"set_NAMES_utf8");

  2. 在你的文件中使用这个 header 如果它是 php

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

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

    中使用这个特殊字符

    希望对您有所帮助

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

 public void onResponse(String response) 
    {

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

我只是在我的 public void onResponse(){} 方法中使用了这个代码行,它工作得很好。

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

                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
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();
                }
            }

        }
    }