web-dev-qa-db-fra.com

Encodage UTF-8 dans Volley Requests

Dans mon application Android, je charge des données JSON avec un JsonArrayRequestVolley__. 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?

9
JensJensen

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));
        }
    }
}
23
Matthew Pape

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

9

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;
        }
6
erluxman

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;
}
5
Kurdish Programmer

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");
      }
   }
4
Osama Ibrahim

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

2
Din Islam Milon

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 ..

  1. avant d'exécuter la requête dans votre base de données, écrivez cette requête

    mysqli_query ($ this-> connection, "set_NAMES_utf8");

  2. utilisez cet en-tête dans votre fichier s'il s'agit de php

    entête ('Content-Type: application/json; charset = utf-8');

  3. 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é

0

Pour spécifier dans le composant serveur, définissez utf-8 dans le type de contenu, par exemple "text/html; charset = utf-8"