Android 截击请求中的UTF-8编码

Android 截击请求中的UTF-8编码,android,encoding,utf-8,android-volley,Android,Encoding,Utf 8,Android Volley,在我的Android应用程序中,我通过截击JsonArrayRequest加载json数据。这些数据是我自己创建的,我用UTF-8编码的Supreme保存它们。当我得到响应并填写列表视图时,文本显示不正确(umlauts)。我的请求是这样的: JsonArrayRequest request = new JsonArrayRequest(targetUrl, new Response.Listener<JSONArray>() {

在我的Android应用程序中,我通过截击
JsonArrayRequest
加载json数据。这些数据是我自己创建的,我用UTF-8编码的Supreme保存它们。当我得到
响应
并填写
列表视图
时,文本显示不正确(umlauts)。我的请求是这样的:

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

所以对我来说,我的json文件的编码似乎没有问题。如何在截击中解决这个编码问题?

如果你知道你所请求的所有文件都将是UTF-8格式,这听起来像你所做的,那么你可以考虑强迫你的截击请求返回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));
        }
    }
}
公共类Utf8JsonRequest扩展了JsonRequest{
...
@凌驾
受保护的响应parseNetworkResponse(NetworkResponse响应){
试一试{
字符串utf8String=新字符串(response.data,“UTF-8”);
返回Response.success(新的JSONObject(utf8String),HttpHeaderParser.parseCacheHeaders(Response));
}捕获(不支持的编码异常e){
//日志错误
返回Response.error(新的ParseError(e));
}捕获(JSONException e){
//日志错误
返回Response.error(新的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;
}

要在服务器部件集中以“text/html;charset=utf-8”等内容类型指定utf-8,另一种方法是:您可以通过这行代码对整个响应进行编码

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

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

两天前我遇到了同样的问题,我尝试了我朋友刚才说的每一件事,都是同样的问题,我尝试了很多卑鄙的事情。。 我的文件是用php编写的,使用凌空截取json格式的数据,我按照以下步骤解决了这个问题

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

    mysqli_查询($this->connection,“set_NAMES\u utf8”)

  • 如果文件是php,请在文件中使用此标题

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

  • 当您根据php回显json时,这个问题有一个解决方案 在
    json\u编码($json,json\u UNESCAPED\u UNICODE)

    我希望有帮助


  • 在截击响应中添加这行代码:

     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()){
    @凌驾
    公共void onResponse(字符串响应){
    if(响应!=null){
    dialog.dismise();
    试一试{
    响应=新字符串(response.getBytes(“ISO-8859-1”),“UTF-8”);
    JSONArray JSONArray=新JSONArray(响应);
    parseArray(jsonArray);
    }捕获(JSONException |不支持编码异常e){
    e、 printStackTrace();
    }
    }
    }
    }
    
    值得一提的是,我使用了UTF-8编码的JSON文件,它工作正常。您是否设置了“内容类型”当你提供文件时,标题?Volley应该读取它,并适当地构建它的响应。不,我没有设置这个标题。我不知道我必须这样做。你有一个例子给我吗?你是在服务器上提供JSON文件吗?无论你在哪里处理这些文件的请求,你都想指定一个返回标题,比如“内容类型text/json字符集=utf-8”。我刚刚通过FTP将JSON文件上传到我的私人网站上。我现在看到您使用的是
    JsonArrayRequest
    。您可以将其子类化。我手头没有语法,但它会非常类似。谢谢,我会尝试一下!它很有效。在我的StringRequest中重写parseNetworkResponse也解决了我遇到的问题我加载了一些XML提要。谢谢@xaevinxHey@JensJensen,这是如何解决您的问题的?我尝试扩展了
    JsonArrayRequest
    JsonRequest
    ,但都没有成功。我仍然得到“??”作为响应。当我转到Chrome
    json
    中的
    php
    服务时,它会正确显示,但是在调试时,当读取接收到的json时,它似乎是???,所以它应该是
    Volley
    的错误。奇怪的是,我们必须像在JsonRequest类中那样重写
    Volley
    的编码,它使用的是UTF8-
    protected static final String PROTOCOL\u CHARSET=“utf-8”
    为什么HttpHeaderParser.parseCharset(response.headers)工作不正常?
              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();
                    }
                }
    
            }
        }