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

Langage Java Discussion :

Encodage UTF-8 enlève les accents d'un String


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut Encodage UTF-8 enlève les accents d'un String
    Bonjour à tous,

    J'essaye d'envoyer le texte d'un fichier JSON qui je reçois, mais la conversion en UTF-8 enlève l'accent de mes mots.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String pl = "Comptabilité";
    String enc = new java.lang.String(pl.getBytes(), "UTF8"); //J'ai aussi essayé "UTF-8"
    System.out.Println("pl : " + pl); 
    System.out.Println("après encodage : " + enc);
    Ce but de code renvoi l'output suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pl : Comptabilité
    après encodage : Comptabilit�
    J'ai essayé aussi en passant par un ISO, mais j'ai toujours le même resultat...

    Est-ce que quelqu'un a une idée de comment faire cette conversion ?

    Merci d'avance,
    Marc

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    L'encodage ne sert que pour faire de l'input et de l'output vers des byte (nottement des stream).
    Donc ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String enc = new java.lang.String(pl.getBytes(), "UTF8"); //J'ai aussi essayé "UTF-8"
    N'a ni queue ni tête. T'es occupé de dire à ta JVM "bon, voilà, j'ai une chaine de charactère, je veux que tu la transforme en byte[] en utilisant l'encodage par défaut de la plateforme. Ensuite je veux que tu suppose que j'ai en réalité utilisé utf-8 et que tu relise ces byte en partant de ce principe là". Au mieux ça ne change rien parce que l'encodage par défaut de ta plateforme est déjà utf-8. Dans tous les autres cas ça foutera le bordel.

    Par exemple, si l'encodage de ta plateforme est ISO-8859-1, le é va se transformer en un byte 0xE9, le décodage en utf-8 déclenchera une erreur car le bit numéro 7 est à 1 dans ce nombre, ce qui veux dire en utf-8 qu'il faut lire le byte suivant pour compléter. Mais il n'y en a pas. L'encodeur va donc remplacé ton 0xE9 par le charactère unicode 0xFFFD qui est le point d'interrogation dans un carré, appelé "caractère de remplacement".

    Bref, ton code là il sert à rien, utilise pl directement et supprime le reste des lignes

    Pour le reste, dis nous ce que tu cherche à faire.

    Encore uen fois, l'encodage ne concerne que l'input/output. Les String en java n'ont pas d'encodage spécifique. La seule chose qui a un encodage, c'est un byte[] et tout ce qui en découle. Les String, c'est formé de char[] pas de byte[] en java.

  3. #3
    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
    Autrement dit, il n'y a pas de conversion à faire. Une String est une String, elle n'a pas d'encodage.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ce n'est pas comme ça que fonctionne l'encodage : l'encodage concerne le tableau d'octet qui représente la chaîne. Quand tu écris pl.getBytes() tu obtiens un tableau d'octets, dans l'encodage par défaut, qui représente la String.

    Ensuite quand tu écris new String(pl.getBytes(), "UTF8") tu dis que tu créés une chaîne à partir d'un tableau d'octets dont tu dis que l'encodage est UTF-8. Or le tableau d'octets est dans l'encodage par défaut : si celui-ci n'est pas UTF-8, ça fait n'importe quoi (au mieux les caractères dont la valeur en octets est la même dans les 2 encodages pourraient être la même, et encore, vu que le nombre d'octets pour encoder peut varier, dès qu'il y a décalage, ça fait n'importe quoi).

    Pour obtenir un tableau d'octets encodé en UTF8 d'une chaine on fait string.getBytes("UTF8") (ou UTF-8, fonctionne aussi).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Bonjour à tous, merci de vos réponses.

    En effet j'ai coupé une partie de mon code. L'idée cet effectivement d'envoyer un stream qui doit être récupéré par un web service. La fonction est la suivante :
    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
    17
    function envoyerRequete(String url, String methode, String pl){
     
    	URL urlJava = new URL(url);
    	Connection connexion = urlJava.openConnection();
    	connexion.setRequestMethod(methode);
    	connexion.setRequestProperty("Content-Type","application/json ; charset=UTF-8");
    	connexion.setDoOutput(true);
     
    	DataOutputStream outputStream = new DataOutputStream(connexion.getOutputStream());
    	String enc = new String(pl.getBytes("UTF8"), "UTF8");
     
    	outputStream.writeBytes(enc); 
     
    	outputStream.flush();
    	outputStream.close();
     
    }
    Dans mon exemple j'ai pris pl="Comptabilité".
    Lors que je reçois ce stream dans mon web service, j'ai un interrogation ("?") à la place du "é".

    Je vous remercie encore une fois,
    Marc

  6. #6
    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
    DataOutputStream ???
    Utilise plutôt un Writer -_-°...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    try(OutputStream out = connexion.getOutputStream(); Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)) {
      writer.write(pl);
    }
    Et pas besoin de flush() car il est inutile avant un close(), ni de close() parce que le try() s'en occupe.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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


    DataOutputStream n'écrit pas d'UTF-8... Autant utiliser directement l'OutputStream.


    Sinon ne pas oublier à libérer proprement les flux...


    a++

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Merci de vos réponses adiGuba, thelvin.

    J'ai essayé avec le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function envoyerRequete(String url, String methode, String pl){
     
    	URL urlJava = new URL(url);
    	Connection connexion = urlJava.openConnection();
    	connexion.setRequestMethod(methode);
    	connexion.setRequestProperty("Content-Type","application/json ; charset=UTF-8");
    	connexion.setDoOutput(true);
     
    	OutputStreamWriter writer = new OutputStreamWriter(connexion.getOutputStream(), "UTF8");
            writer.write(pl);
     
    }
    Mais là j'ai un "null pointer exception" dans mon web service, en testant la valeur de pl j'ai null...

  9. #9
    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
    Citation Envoyé par adiGuba Voir le message
    Sinon ne pas oublier à libérer proprement les flux...

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Merci beaucoup adiGuba ,

    ça marche maintenant. Je crois qui j'avais pas bien interprété thelvin
    Et pas besoin de flush() car il est inutile avant un close(), ni de close() parce que le try() s'en occupe.

    Merci aussi à tous,
    Marc

  11. #11
    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 Marc_27 Voir le message
    ça marche maintenant. Je crois qui j'avais pas bien interprété thelvin
    Oui, comme par exemple ne pas mettre de try() quand je te dis que le try() va s'en occuper.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Comme j'ai dit plus haut,

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

Discussions similaires

  1. UTF-8 et les accents
    Par ceweb dans le forum Langage
    Réponses: 7
    Dernier message: 02/12/2012, 01h19
  2. les accent entre PHP et JQuery et encodage json
    Par nicko_73 dans le forum jQuery
    Réponses: 1
    Dernier message: 22/12/2009, 15h43
  3. HTML encode UTF-8 et les accents
    Par Spir dans le forum Langage
    Réponses: 7
    Dernier message: 28/12/2008, 21h03
  4. [HTML][Encodage] Problèmes avec les accents...
    Par eraim dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 26/05/2004, 10h11
  5. [WebForms] Encodage, UTF-8 et accents
    Par alexischmit dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 28/04/2004, 12h21

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