如何让Android Volley StringRequest GET请求返回UTF-8编码响应?
解决Volley StringRequest返回UTF-8编码字符串的方法
当然可以搞定这个问题!Volley默认的StringRequest确实会采用ISO-8859-1编码解析响应内容,不过我们只需要简单自定义一个请求类,就能强制让它用UTF-8来处理返回的字符串。
方法一:自定义UTF8StringRequest类(推荐)
直接继承StringRequest,重写parseNetworkResponse方法,在里面指定UTF-8编码即可,这样所有请求都能统一处理,不用重复写转码逻辑:
import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Response; import com.android.volley.toolbox.StringRequest; import java.io.UnsupportedEncodingException; public class UTF8StringRequest extends StringRequest { public UTF8StringRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) { super(method, url, listener, errorListener); } public UTF8StringRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener) { super(url, listener, errorListener); } @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { try { // 强制使用UTF-8编码解析响应字节数组 String utf8String = new String(response.data, "UTF-8"); return Response.success(utf8String, getCacheEntry()); } catch (UnsupportedEncodingException e) { // 编码异常时返回ParseError return Response.error(new ParseError(e)); } } }
之后你只需要用这个UTF8StringRequest替代原来的StringRequest发起请求,拿到的响应就是UTF-8编码的字符串了。
方法二:临时手动转码(不推荐)
如果你不想自定义类,也可以在收到默认响应后手动转码,但这种方式需要每次请求都写一遍,不够优雅:
StringRequest request = new StringRequest(Request.Method.GET, yourUrl, response -> { try { // 将ISO-8859-1编码的字符串转成UTF-8 String utf8Response = new String(response.getBytes("ISO-8859-1"), "UTF-8"); // 这里使用utf8Response进行后续业务处理 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }, error -> { // 处理请求错误逻辑 });
另外补充一点:如果服务器返回的响应头里已经正确设置了Content-Type: text/plain; charset=utf-8,理论上Volley会自动识别编码,但如果服务器没设置或者设置错误,就需要我们用上面的方法手动指定编码来解决乱码问题。
内容的提问来源于stack exchange,提问作者Barry
相关产品推荐
相关产品推荐

