IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Encoder en UTF8


Sujet :

Android

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2012
    Messages : 145
    Points : 88
    Points
    88
    Par défaut Encoder en UTF8
    bonjour,
    j'ai un problème pour encode en utf-8 une variable String.
    J'ai trouvé un code mais sa plante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nom = new String(((String) nom).getBytes("ISO-8859-1" ), "UTF-8" );
    je souhaiter encodé pour l'envoyer par json.

    je suis bloqué, ce code fonctionne avec les apostrophes mais pas avec les caractères possédant un accent.

    Merci pour votre aide

    bonne soirée

    Cédric

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Une String n'a pas d'encodage, et on ne peut donc pas "encoder une variable String en utf-8".
    Les encodages interviennent lors des conversions String -> byte[] et vice-versa.

    Tu dois donc considérer le problème autrement. La conversion doit être faite ailleurs, si tant est qu'il y ait besoin d'en faire une.
    Le plus simple est de chercher, qu'est-ce qu'elle devient, cette String ? À quoi est-ce que tu la confies pour t'en servir ? C'est à ce truc-là qu'il faut dire que l'encodage doit être utf-8... S'il ne le sait pas déjà. N'importe quelle bibliothèque JSON s'occupe de l'utf-8 toute seule sans qu'on lui demande.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2012
    Messages : 145
    Points : 88
    Points
    88
    Par défaut
    merci pour votre explication, en visualisant le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     JSONObject detail1 = new JSONObject();
    	        	   detail1.put("TokenContact", TokenContact);
    	        	   detail1.put("TokenSociete", TokenSociete);
    	        	   detail1.put("nom", nom);
    	        	   jsonArray_contact.put(detail1);
     
    	        	   json_valeurs.put("Contact", jsonArray_contact);
    ...
    httppost.setHeader("json",json_valeurs.toString());
    				        httppost.getParams().setParameter("jsonpost",json_valeurs);
     
    				        // Execute requete HTTP Post 
    				        HttpResponse response =httpclient.execute(httppost);
    						HttpEntity entity = response.getEntity();
    						is = entity.getContent();
    Je me suis aperçu lors de la réception du côté serveur, les valeurs ne sont pas en UTF-8 mais en ISO. Donc il n'y a pas de transformation en UTF-8.
    Lorsque vous m'indiqué que n'importe quelle bibliothèque JSON s'occupe de l'utf-8 toute seule sans qu'on lui demande, cela veut il dire qu'il faut que j'installe une bibliothèque complémentaire ? Ou bien il me manque une indication dans script?

    Bonne journée
    Cédric

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par drick35 Voir le message
    Je me suis aperçu lors de la réception du côté serveur, les valeurs ne sont pas en UTF-8 mais en ISO. Donc il n'y a pas de transformation en UTF-8.
    En même temps l'encodage n'est précisé nulle part.
    Donc il y a de forte chance que ce soit l'encodage par défaut de la machine qui soit utilisé...



    Tu utilises HttpClient d'Apache ?
    Je ne connais pas trop mais je pense qu'il faut utiliser HttpProtocolParams.setContentCharset() et/ou HttpProtocolParams.setHttpElementCharset() pour le définir...


    a++

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    +1 adiGuba


    Citation Envoyé par drick35 Voir le message
    Lorsque vous m'indiqué que n'importe quelle bibliothèque JSON s'occupe de l'utf-8 toute seule sans qu'on lui demande, cela veut il dire qu'il faut que j'installe une bibliothèque complémentaire ?
    Je voulais dire que d'habitude les bibliothèques JSON s'occupent aussi d'envoyer/recevoir les données, et qu'elles le font en utf-8 sans qu'on leur demande.

    Ce n'est pas le cas de celle que tu utilises : tu fais toString() pour avoir une String, que tu t'occupes d'envoyer ensuite. Ce n'est pas spécialement mal, mais comme je l'ai dit, une String n'a pas d'encodage, et donc cette bibliothèque-ci ne peut pas s'occuper de l'encodage.
    Tu vas bel et bien devoir t'y coller, de la manière suggérée par adiGuba.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2012
    Messages : 145
    Points : 88
    Points
    88
    Par défaut
    merci pour votre aide, effectivement il y avait des paramétrages qui manquaient, connaissez vous un livre traitant la partie communication entre Android et serveur, car je lutte et perd pas mal de temps à parcourir les divers forum?

  7. #7
    Membre régulier
    Femme Profil pro
    Développeur Java
    Inscrit en
    Août 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2013
    Messages : 61
    Points : 105
    Points
    105
    Par défaut
    En matière de lecture j'ai trouvé celle là pas eu le temps de la lire plus avant mais de ce que j'en ai vu tu trouveras ton bonheur (bout de code explications simples, tout ça tout ça ).


    Bon courage

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Tu peux remplacer "Android" par "client" et tu trouveras certainement ton bonheur.
    La gestion d'une communication client-serveur ne diffère pas que ce soit sur Android, Ubuntu, MacOS ou autre...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Salut,

    De mémoire c'est cette fonction qui gère le bordel

    http://developer.android.com/referen...ormEntity.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public UrlEncodedFormEntity (List<? extends NameValuePair> parameters, String encoding)
    Par contre la grosse blague est qu'il y a une différence entre UTF-8 et HTTP.UTF-8 en fait il me semble que ce n'est pas la même norme ISO derrière donc faut bien faire attention.

    Donc en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF-8);
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Le JSON n'est pas envoyé comme html-form-entity, et donc cette classe ne peut rien y faire.

    ... Mais en revoyant le code, je vois que le JSON est envoyé sous forme de header HTTP. Ce qui est déjà une aberration en soi, trop de caractères de JSON ayant un sens particulier en MIME.
    J'ai bien peur que la seule manière correcte d'envoyer ça en utf-8 soit sous forme B-encodée, qui ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    json: =?UTF-8?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=
    Conversion String -> byte[] avec byte[] jsonBytes = json.getBytes("UTF-8"), encodage en Base64 avec String base64 = Base64.encode(jsonBytes, Base64.NO_WRAP), mettre =?UTF-8?B? devant et ?= derrière.

    Et normalement c'est valide HTTP et contient le JSON en utf-8. Reste à espérer que le serveur derrière sache comment décoder ça.
    Mais il aurait été plus simple de l'envoyer sous forme de corps du message HTTP -_-°.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Oui moi aussi je vois pas pourquoi ne pas l'envoyer en tant que "body" HTTP (et juste déclarer la requête comme étant en UTF-8).
    Par défaut HTTP utilise ISO-8859-1 (je sais c'est bête mais c'est comme ça).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Par défaut HTTP utilise ISO-8859-1 (je sais c'est bête mais c'est comme ça).
    Sauf erreur de ma part, HTTP utilise ASCII dans l'enveloppe, non pas par défaut mais obligatoirement. Et le body, si rien n'est indiqué par Content-Type: <...>; charset=<...>, laisse les applications décider le choix qu'elles feront par défaut.
    Pour mettre du non-ASCII dans l'URL, HTTP dicte le %-encodage en charset utf-8 par défaut (sans mécanisme pour sortir du défaut, ce qui donc ne peut se faire qu'à l'initiative délibérée des applications, avec leurs propres méthodes d'auto-détection.)
    Pour mettre du non-ASCII dans un header, aucune méthode n'est proposée sans préciser explicitement le charset utilisé.

    Pas la moindre évocation de ISO-8859-1, donc. C'est juste les implémentations historiques qui veulent ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je parlais bien du body.... le header est purement ASCII (ou quoted-printable encoding).

    Et pour ce qui est du body, c'est bien ISO-8859-1 par défaut comme le précise la RFC de HTTP/1.1:

    http://www.w3.org/Protocols/rfc2616/....html#sec3.7.1

    The "charset" parameter is used with some media types to define the character set (section 3.4) of the data. When no explicit charset parameter is provided by the sender, media subtypes of the "text" type are defined to have a default charset value of "ISO-8859-1" when received via HTTP. Data in character sets other than "ISO-8859-1" or its subsets MUST be labeled with an appropriate charset value. See section 3.4.1 for compatibility problems.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  14. #14
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Oui moi aussi je vois pas pourquoi ne pas l'envoyer en tant que "body" HTTP (et juste déclarer la requête comme étant en UTF-8).
    +1

    Le JSON n'est pas envoyé comme html-form-entity, et donc cette classe ne peut rien y faire.
    Pourtant cela serait la meilleure solution.


    ... Mais en revoyant le code, je vois que le JSON est envoyé sous forme de header HTTP. Ce qui est déjà une aberration en soi, trop de caractères de JSON ayant un sens particulier en MIME.
    J'ai bien peur que la seule manière correcte d'envoyer ça en utf-8 soit sous forme B-encodée, qui ressemble à ça :
    Cela serait vraiment la méthode la plus sale pour envoyer un json.
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  15. #15
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Et pour ce qui est du body, c'est bien ISO-8859-1 par défaut comme le précise la RFC de HTTP/1.1:

    http://www.w3.org/Protocols/rfc2616/....html#sec3.7.1
    I stand corrected. Merci pour l'info.

    Citation Envoyé par Feanorin Voir le message
    Le JSON n'est pas envoyé comme html-form-entity, et donc cette classe ne peut rien y faire.
    Pourtant cela serait la meilleure solution.
    Je me doute bien que c'est ce que tu voulais dire, mais la meilleure solution serait une entity JSON, pas une html-form-entity.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Tu parles de cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     //url with the post data
        HttpPost httpost = new HttpPost(path);
     
        //convert parameters into JSON object
        JSONObject holder = getJsonObjectFromMap(params);
     
        //passes the results to a string builder/entity
        StringEntity se = new StringEntity(holder.toString(), HTTP.UTF-8);
     
        //sets the post request as the resulting string
        httpost.setEntity(se);
    https://developer.android.com/refere...ingEntity.html
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  17. #17
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Voilà.

    (Pour info c'est HTTP.UTF_8 et non pas HTTP.UTF-8. Pour info, c'est une constante String de valeur "UTF-8", donc c'est exactement la même chose que juste mettre "UTF-8")
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [IIS 7.5] Log : comment les encoder en UTF8, à la place de ANSI ?
    Par nicopulse dans le forum IIS
    Réponses: 6
    Dernier message: 15/03/2011, 19h31
  2. encoder en UTF8 le contenu d'un texbox
    Par Le gris dans le forum Windows Forms
    Réponses: 12
    Dernier message: 16/07/2009, 18h45
  3. Créer un fichier texte encodé en UTF8
    Par jmnicolas dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 26/08/2008, 11h23
  4. Lire des caractères encodés en UTF8
    Par ratapapa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/04/2008, 17h38
  5. Encoding ISO-8859-15 et UTF8
    Par calfater dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/06/2006, 21h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo