gpt4 book ai didi

android - 为什么 volley 的响应字符串使用的编码与响应 header 中的编码不同?

转载 作者:IT王子 更新时间:2023-10-28 23:34:12 27 4
gpt4 key购买 nike

当使用 OkHttp 堆栈执行 volley 请求(StringRequestJsonObjectRequest)时,响应字符串的编码设置为 ISO-8995-1,即默认编码。响应有一个标题:content-type=text/html; charset=utf-8,应该检测到。为什么不呢?

最佳答案

这两种请求类型都调用 HttpHeaderParser.parseCharset,它能够从 header 中确定字符集。但是,它要求 header 是 Content-Type,而不是 content-type:它区分大小写。 (如果使用默认的 HurlStack,我不确定行为,这可能是与 OkHttp 堆栈的实现细节差异。)

解决方案1:复制原始请求类型,但手动覆盖字符集

解决方案2:复制原始请求类型,但强制预期的 header 存在

import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.JsonRequest;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.UnsupportedEncodingException;

public class JsonUTF8Request extends JsonRequest<JSONObject> {
public JsonUTF8Request(int method, String url, JSONObject jsonRequest,
Listener<JSONObject> listener, ErrorListener errorListener) {
super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
errorListener);
}

@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
// solution 1:
String jsonString = new String(response.data, "UTF-8");
// solution 2:
response.headers.put(HTTP.CONTENT_TYPE,
response.headers.get("content-type"));
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
//
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));
}
}
}

关于android - 为什么 volley 的响应字符串使用的编码与响应 header 中的编码不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19267616/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com