Android 截击请求中的UTF-8编码
在我的Android应用程序中,我通过截击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>() {
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格式的数据,我按照以下步骤解决了这个问题
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
,但都没有成功。我仍然得到“??”作为响应。当我转到Chromejson
中的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();
}
}
}
}