Dans mon application Android, je charge des données JSON avec un JsonArrayRequest
Volley__. Les données ont été créées par moi-même et je les ai enregistrées avec Sublime avec encodage UTF-8. Lorsque j'obtiens la Response
et que je remplis ma ListView
, les textes ne sont pas affichés correctement (trémas). Voici à quoi ressemble ma demande:
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);
Lorsque je charge exactement les mêmes données avec cette méthode, tous les textes sont affichés correctement:
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();
}
Donc, il me semble qu’il n’ya aucun problème avec l’encodage de mon fichier json. Comment puis-je résoudre ce problème d'encodage dans Volley?
Si vous savez qu'absolument tous les fichiers demandés seront au format UTF-8, ce qui semble être le cas, vous pouvez alors forcer votre demande Volley à renvoyer des chaînes au format UTF-8. Vous pouvez y parvenir en sous-classant la demande JSON standard. Quelque chose comme ça:
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));
}
}
}
J'ai le même problème comme celui-ci et je le résous avec le jeu de caractères 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();
J'espère que cela fonctionnera pour vous
ne pas utiliser try {} catch dans le bloc onResponse, cela pose un problème dans mon code, plutôt que de le mettre en œuvre de la manière suivante.
@Override
onResponse(String s) {
s= fixEncoding(s);
Toast.makeToast(this,s,Toast.LENGTH_LONG).show();
}
et je pense que vous obtiendrez le résultat souhaité
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;
}
Ceci est travaillé comme un charme pour moi, je viens de créer une méthode statique à partir de la réponse de @Muhammad Naeem, Merci 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;
}
Ajoutez cette ligne de code dans la réponse de volley:
public void onResponse(String response)
{
if (response != null)
{
response=new String(response.getBytes("ISO-8859-1"), "UTF-8");
}
}
une autre approche: vous pouvez encoder toute votre réponse avec cette ligne de code.
newStr = URLDecoder.decode(URLEncoder.encode(oldStr, "iso8859-1"),"UTF-8");
J'ai encodé toute la chaîne de réponse en UTF-8 car je sais que la méthode d'encodage par défaut de volley est iso8859-1
J’ai eu le même problème il ya deux jours et j’ai essayé tout ce que mes amis venaient de dire et c’est le même problème et j’ai essayé des choses tellement méchantes .. mon fichier est écrit en php et utilise volley pour obtenir les données en json i suivi ces étapes pour résoudre le problème ..
avant d'exécuter la requête dans votre base de données, écrivez cette requête
mysqli_query ($ this-> connection, "set_NAMES_utf8");
utilisez cet en-tête dans votre fichier s'il s'agit de php
entête ('Content-Type: application/json; charset = utf-8');
pendant que vous faites écho le json selon php il y a une solution pour ce problème utilisez ce caractère spécial dans json_encode($json,JSON_UNESCAPED_UNICODE)
j'espère que ça a aidé
Pour spécifier dans le composant serveur, définissez utf-8 dans le type de contenu, par exemple "text/html; charset = utf-8"