1、原因:
如果在服务器的返回数据的header中没有指定字符集那么就会默认使用 ISO-8859-1 字符集。
ISO-8859-1的别名叫做Latin1。这个字符集支持部分是用于欧洲的语言,不支持中文~
很不能理解为什么将这个字符集作为默认的字符集。Volley这个框架可是要用在网络通信的环境中的。
2、解决办法:
- 在服务器的返回的数据的header的中contentType加上charset=UTF-8的声明。
- 当你无法修改服务器程序的时候,可以定义一个新的子类。覆盖parseNetworkResponse这个方法,直接使用UTF-8对服务器的返回数据进行转码。
3、解决实例:
(1)新建 NormalPostRequest 继承 Request类,代码如下
public class NormalPostRequest extends Request<JSONObject>{
private Map<String, String> mMap;
private Listener<JSONObject> mListener;
public NormalPostRequest(String url, Map<String, String> map, Listener<JSONObject> listener,ErrorListener errorListener) {
super(Request.Method.POST, url, errorListener);
mListener = listener;
mMap = map;
}
//mMap是已经按照前面的方式,设置了参数的实例
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return mMap;
}
//此处因为response返回值需要json数据,和JsonObjectRequest类一样即可
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,/*HttpHeaderParser.parseCharset(response.headers)*/"utf-8");
return Response.success(new JSONObject(jsonString),HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
mListener.onResponse(response);
}
}
(2)在Activity中的使用
private void volley_JsonObjectRequestPost2() {
String url = "http://api.24ht.net/app/signin";
Map<String, String> map = new HashMap<String, String>();
map.put("user", "jt1024");
map.put("psw", "111111");
JSONObject object = new JSONObject(map);
NormalPostRequest request = new NormalPostRequest(url, map, new Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
tv_resp1.setText(response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
tv_resp1.setText(error.toString());
}
});
request.setTag("volley_JsonObjectRequestPost2");
MyApplication.getInstance().addToRequestQueue(request);
}
参考: