在我的Android应用中,我使用Volley JsonArrayRequest
加载json数据。数据是由我自己创建的,我用Sublime用UTF-8编码保存它们。当我收到Response
并填写ListView
时,文本显示不正确(变音符号)。这就是我的请求的样子:
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);
当我使用此方法加载完全相同的数据时,所有文本都会正确显示:
final StringBuilder builder = new StringBuilder();
final HttpClient client = new DefaultHttpClient();
final HttpGet httpGet = new HttpGet(request);
try {
final HttpResponse response = client.execute(httpGet);
final StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
final HttpEntity entity = response.getEntity();
final InputStream content = entity.getContent();
final BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} else {
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
所以对我来说,似乎我的json文件的编码没有问题。如何在Volley中修复此编码问题?
答案 0 :(得分:23)
如果你知道你要求的绝对所有文件都是UTF-8格式,听起来就是这样,那么你可能会考虑强制你的Volley请求返回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));
}
}
}
答案 1 :(得分:9)
我有同样的问题,我使用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();
我希望这对你有用
答案 2 :(得分:7)
不要在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;
}
答案 3 :(得分:5)
这对我来说是一种魅力,我只是从@Muhammad Naeem的答案创建了一个静态的方法,谢谢穆罕默德......
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;
}
答案 4 :(得分:4)
在排球响应中添加以下代码行:
public void onResponse(String response)
{
if (response != null)
{
response=new String(response.getBytes("ISO-8859-1"), "UTF-8");
}
}
答案 5 :(得分:2)
另一种方法:您可以通过这行代码对整个响应进行编码。
newStr = URLDecoder.decode(URLEncoder.encode(oldStr, "iso8859-1"),"UTF-8");
我已将整个响应字符串编码为UTF-8,因为我知道volley默认编码方法是iso8859-1
答案 6 :(得分:0)
在内容类型中指定服务器部分集utf-8,例如“text / html; charset = utf-8”
答案 7 :(得分:0)
两天前我遇到了同样的问题,我已经尝试过我的朋友们说的所有事情,这也是同样的问题,我尝试了很多东西...... 我的文件是用PHP编写的,并使用齐射来获取数据,因为json我按照这些步骤来解决问题..
在数据库中执行查询之前写下此查询
mysqli_query($这 - &GT;连接 “set_NAMES_utf8”);
如果是php
,请在您的文件中使用此标题header('Content-Type:application / json; charset = utf-8');
当你根据php回应json时,有一个解决这个问题的方法
在json_encode($json,JSON_UNESCAPED_UNICODE)
我希望它有所帮助
答案 8 :(得分:0)
我只在我的 public void onResponse(){} 方法中使用此代码行,效果很好。
if (response != null){
try {
response=new String(response.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
答案 9 :(得分:0)
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();
}
}
}
}