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

Java Discussion :

Java et encoding


Sujet :

Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Java et encoding
    Bonjour à tous,
    je viens vous demander de l'aide sur un thème déjà apporter mainte fois.
    J'utilise Hibernate couplé à MySQL. La base est en utf8, ainsi que les tables.

    J'ai précisé dans l'url de connection à la base dans le fichier de configuration d'Hibernate : autoReconnect=true&useUnicode=true&characterEncoding=UTF-8

    Ensuite j'ai fait moulte tests afin d'insérer une chaîne "en dur" dans la base : "ééé ààà èè ç", d'abord sans rien faire, ensuite en tentant de convertir avec :
    new String("ééé ààà èè ç".getBytes("ISO-8859-1"), "UTF-8"). Je pensais avoir compris comment l'encodage en général fonctionne, mais j'avoue que là je n'y arrive vraiment pas ... J'obtient en base "��� ��� �� �", ou encore ""??? ??? ?? ?"

    Pensez-vous pouvoir m'aider ? Merci d'avance

  2. #2
    Membre confirmé
    Avatar de provirus
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2009
    Messages : 248
    Points : 580
    Points
    580
    Par défaut
    Bonjour,

    le plus simple, c'est en prenant les données à insérer dans le bon format en partant. Par exemple, si c'est sur une page web, le mieux c'est que cette page soit en UTF-8 pour que le navigateur donne le bon type.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Merci de votre réponse. Les données proviennent d'une api, utilisant la classe URL. La chaîne manipulée est donc je suppose dans l'encodage de la page cible. Mais si je connais l'encodage de la chaîne et que je souhaite la convertir en utf-8, existe-t-il un moyen simple ?

  4. #4
    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 608
    Points
    21 608
    Par défaut
    En Java, une String n'a pas d'encodage. C'est une séquence de chars et c'est tout.

    Par contre, quand on veut passer de String à octets binaires et vice-versa, là un encodage intervient, et il s'agit, en effet, d'utiliser le bon. Apparemment ta connexion MySQL est bien configurée et il n'y a sans doute pas de soucis de ce côté.
    Le mieux pour vérifier, c'est de déclarer cette chaîne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String s = "Été sur une île";
    et l'insérer d'une part dans la base de données, d'autre part dans un fichier texte en UTF-8.
    - dans le fichier texte : on vérifie que la classe Java qui contient la chaîne a été compilée dans le bon encodage.
    - dans la base de données : on vérifie que, si ça c'est bien passé avec le fichier texte, ça se passe bien aussi dans la base.

    => Si le test du fichier texte échoue. Le fichier .java n'a pas été enregistré dans le bon encodage (ou bien il n'a pas été compilé avec le bon encodage.) Changer d'encodage, d'un côté ou de l'autre, et recommencer jusqu'à ce que ça marche.
    => Si le test du fichier marche, mais pas l'insertion en BDD, alors la connexion à la BDD n'est pas bien configurée finalement. Je ne connais pas Mysql et ça dépasse mes compétences, mais c'est là qu'il faut chercher.
    => Si les deux passent, mais que ça ne marche pas quand la chaîne vient d'ailleurs, c'est qu'il y a un problème au moment de la conversion "ailleurs vers String." Un charset est forcément utilisé, si aucun n'est précisé, il y en a un choisi par défaut, et c'est pas forcément le bon. Voir de ce côté.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Avatar de provirus
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2009
    Messages : 248
    Points : 580
    Points
    580
    Par défaut
    Pour la partie sur le URL, tu obtiens un inputstream avec le contenu de la page. Tu peux utiliser un InputStreamReader et dans son constructeur, tu peux choisir le charset qui est utilisé sur la page. Ça pourrait peut-être t'aider ensuite à le convertir, mais je n'en sais pas plus de ce côté.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    J'ai fait les tests avec l'écriture des fichiers.
    J'obtiens bien mes accents, et le fichier est bien encodé en utf8.
    Par contre j'ai toujours le problème avec mes accents en base.

    Je rappelle le contexte. Je développe avec Eclipse, et j'ai bien précisé l'encodage des fichiers en utf8, sous windows. Le programme est exécuté dans un environnement Unix. J'ai précisé le paramètre de la jvm lors du lancement avec -Dfile.encoding=UTF8. C'est Hibernate qui gère la base, j'ai placé dans l'url de connexion "autoReconnect=true&useUnicode=true&characterEncoding=UTF-8".
    J'enlève le problème de la récupération de la chaîne sur un site avec un certain encodage, en insérant une chaîne en dur, mais le problème persiste...

    Je ne sais pas d'où peut provenir le problème. L'encodage serait aussi présent lors de la compilation ? Les fichiers binaires générés serait interprétés différemment sous windows et Unix ? J'ai un moyen d'action de ce côté là ? En précisant à Eclipse de compiler en utf8 ?

  7. #7
    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 608
    Points
    21 608
    Par défaut
    Citation Envoyé par godjirax Voir le message
    L'encodage serait aussi présent lors de la compilation ?
    Non. Une String n'a pas d'encodage. Cela est assuré dans le bytecode lui-même.

    Citation Envoyé par godjirax Voir le message
    Les fichiers binaires générés serait interprétés différemment sous windows et Unix ?
    Non. Certaines choses dépendent de l'environnement (donc possiblement, de l'OS,) et c'est notamment le cas du charset par défaut, à utiliser pour les conversions String <=> octets quand aucun charset n'est précisé.
    Mais les binaires ne sont pas interprétés différemment, c'est juste que le programme demande à la JVM, "hé, c'est quoi le charset par défaut, ici ?" en cas de besoin.

    Citation Envoyé par godjirax Voir le message
    J'ai un moyen d'action de ce côté là ?
    Rien d'autre que le -Dfile.encoding pour forcer le charset par défaut... Mais ça ne résout que ce qui utilise le charset par défaut officiel.

    Citation Envoyé par godjirax Voir le message
    En précisant à Eclipse de compiler en utf8 ?
    Si Eclipse ne compilait pas avec le bon charset, le test d'écriture dans un fichier ne marcherait sans doute pas. Comment fais-tu ce test ? C'est quelques lignes, montre-les.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    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 godjirax Voir le message
    ensuite en tentant de convertir avec :
    new String("ééé ààà èè ç".getBytes("ISO-8859-1"), "UTF-8"). Je pensais avoir compris comment l'encodage en général fonctionne, mais j'avoue que là je n'y arrive vraiment pas ...
    Heu... Le code que tu montres là est complètement incorrect et ne peut que te générer une chaine incorrect !


    Il suffit d'un seul encodage incorrect pour tout pourrir



    Essayes d'écrire un code "à minima" qui insère une chaine dans la BD et montre nous ton code...


    a++

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Bonsoir,

    voici les lignes de code qui me permette d'ajouter simplement un tuple dans ma table :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Statement stat = conn.createStatement();
    String chaine = "héhé";
    String query = "insert into matable values ( '"+chaine+"', 'haha')";
    System.out.println("Résultat : " +stat.executeUpdate(query));
    String chaine1 =  new String(chaine.getBytes(), "UTF8");
    query = "insert into matable values ('"+chaine1+"', 'haha')";
    System.out.println("Résultat : " +stat.executeUpdate(query));
    stat.close();
    conn.close();

    Et j'obtiens, malheuresement toujours : h�h�, haha dans ma base
    Même en précisant l'encoding dans l'url de connexion à la base, en exécutant mon programme avec l'argument d'encoding à la jvm ... Rien n'y fait.

    Je viens de faire d'autres tests, j'ai changer l'encodage de la table, et malgré les tentatives de utf8_unicode_ci, utf8_general_ci, latin1_swedish_ci, j'ai toujours le même résultat.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    J'ai réussi à afficher les accents côté web (phpmyadmin + site)
    j'ai du pour cela préciser "autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=ISO-8859-1" dans mon fichier hibernate, puis encoder la chaîne avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String(new String(stringToEncode.getBytes(), "ISO-8859-1").getBytes("UTF-8"))
    et d'exécuter mon jar avec le paramètre -Dfile.encoding=iso-8859-1.
    A croire que ma base est en iso alors que phpmyadmin m'affiche utf8_general_ci.

  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 608
    Points
    21 608
    Par défaut
    J'ai aucune idée de ce qui t'a amené à faire ça, mais :

    - Si vraiment tu as mis le paramètre -Dfile.encoding=ISO-8859-1 et qu'il n'est pas écrasé par une autre config quelque, part, alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new String(stringToEncode.getBytes(), "ISO-8859-1")
    Signifie en substance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new String(stringToEncode.getBytes("ISO-8859-1"), "ISO-8859-1")
    Ce qui crée une copie absolument identique de stringToEncode.

    Donc la ligne complète est équivalente à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String(stringToEncode.getBytes("UTF-8"))
    Qui est elle-même, à la même condition, équivalente à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String(stringToEncode.getBytes("UTF-8"), "ISO-8859-1")
    Cela aura pour effet de transformer par exemple "héhé" en "héhé".

    Je ne comprends pas qu'il y ait besoin de faire cela et à mon avis il y a erreur de conf' quelque part, faire simplement characterEncoding=UTF-8 et ficher la paix à -Dfile.encoding aurait dû suffire. Tu dis que tu as essayé, que tu as fait tous les tests (sans le prouver malgré ma demande) montrant que tu ne t'es pas trompé dans l'encodage du fichier .java lui-même.
    Je dois donc te croire sur parole et penser que ce bricolage est nécessaire en attendant de savoir quoi d'autre peut se configurer avec MySQL.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    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
    Comme je l'ai déjà dit ce code c'est du grand n'importe quoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String chaine1 =  new String(chaine.getBytes(), "UTF8");
    Vires cette ligne et ca marchera déjà mieux.


    a++

  13. #13
    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 608
    Points
    21 608
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Comme je l'ai déjà dit ce code c'est du grand n'importe quoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String chaine1 =  new String(chaine.getBytes(), "UTF8");
    Vires cette ligne et ca marchera déjà mieux.
    Une telle ligne, utilisée avant de faire la requête SQL, est en effet exactement l'erreur qui peut obliger ensuite à utiliser la ligne à rallonge présentée dernièrement.

    Virer ces deux lignes qui font des choses stupides, devrait tout réparer. En admettant que celle dont on parle ici n'ait pas été enlevée bien qu'il ait déjà été conseillé de le faire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Java ResultSet encoding
    Par CliffeCSTL dans le forum Général Java
    Réponses: 4
    Dernier message: 01/07/2015, 16h24
  2. JAVA < XML encoding="ISO-8859-1" et sous noeud
    Par albert12345 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 16/08/2011, 01h53
  3. [AJAX] Java : comment encoder les chaines en latin1 ?
    Par Foub dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/04/2007, 10h48
  4. [Java Beans XMLEncoder] Impossible d'encoder un objet...
    Par petitpepito dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 27/02/2006, 16h19
  5. Probleme d'encode XML et java
    Par ujoodha dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 25/10/2005, 09h24

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