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 :

Caractères internationaux: problème


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 5
    Par défaut Caractères internationaux: problème
    Bonjour,

    je développe un petit programme perso pour m'aider à tagger mes fichiers audio à partir d'infos récupérées sur une base de données mySQL.

    Pour l'instant, j'essaie de remplir la base de données à partir des fichiers audios (gérés par la bibliothèque "jaudiotagger"), mais je rencontre des problèmes avec des caractères internationaux, qui sont parfois contenus dans le nom de compositeurs ou solistes (ex: "Vidović", "Lutosławski", "Dvořák")

    Dans cet exemple, les caractères ć ł et ř sont remplacés quelque part par des points d'interrogation "?"

    Selon moi, ce n'est pas au niveau de la bibliothèque jaudiotagger que ça foire. Car le problème apparaît même si c'est moi qui écrit manuellement les caractères tels quels dans mon code.

    Je ne pense pas non plus que le problème soit au niveau de ma database mySQL. D'abord parce que j'ai tout mis en Character Set UTF-8, et puis j'ai testé aussi en faisant des entrées manuelles avec les caractères spéciaux, et ils s'affichent correctement.

    Donc quand, dans mon code, je lui donne un caractère un peu spécial, il se transforme en point d'interrogation. Et c'est d'ailleurs visible sur la console java (quand je fais un system.out.println de ma chaîne).

    J'ai essayé de contourner en lui forcant l'UTF-8 avec la méthode getBytes()
    ex:
    new String("Dvořák".getBytes("UTF-8"))
    mais ça change rien...


    Bref, là je suis bloqué, mes recherches sur le net ne m'ont pas aidé, j'espère donc trouver une solution via ce forum...


    Merci d'avance!

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Problèmes de charsets. C'est galère de définir où est le problème quand on connaît pas. Et c'est nécessaire de savoir où est le problème, pour le résoudre.

    Citation Envoyé par tguiot Voir le message
    Donc quand, dans mon code, je lui donne un caractère un peu spécial, il se transforme en point d'interrogation. Et c'est d'ailleurs visible sur la console java (quand je fais un system.out.println de ma chaîne).
    La console n'est pas un bon test. En fait, c'est difficile de faire un bon test.
    En voilà un :

    Citation Envoyé par (Je n'utilise pas la balise CODE, pour des raisons techniques avec les accents.)
    Writer writer = new OutputStreamWriter(new FileOutputStream("c:/java-utf8-test.txt"), "utf-8");
    writer.write('\ufeff');
    writer.write("Dvořák");
    writer.close();
    Puis tu ouvres avec un éditeur de texte genre notepad ou notepad++.

    - Si ça ne s'affiche pas bien, alors déjà, les accents que tu mets dans ton code Java ne passent pas.
    Donc il faut régler ça. C'est que tu écris ton code Java dans un charset, mais tu le compiles dans un autre charset. Cela n'arriverait pas avec un EDI. Utilise un EDI.

    - Si ça s'affiche bien, alors déjà, on a pas le problème au-dessus. Le problème est ailleurs. Fais le même test, mais avec les données extraites des fichiers sons. On va voir s'ils passent bien.

    Citation Envoyé par tguiot Voir le message
    J'ai essayé de contourner en lui forcant l'UTF-8 avec la méthode getBytes()
    ex:
    new String("Dvořák".getBytes("UTF-8"))
    mais ça change rien...
    Tant qu'on ne sait pas où est le problème, on ne sait pas ce que fait cette chose.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Attention car cette ligne de code est incorrect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new String("Dvořák".getBytes("UTF-8"))
    Si ton programme est correctement compilé, cela signifie que tu prend une String que tu encodes en utf8 dans tableau de bytes, que tu utilises pour créer une nouvelle String utilisant l'encodage par défaut du système (qui n'est pas forcément utf8).

    Sous Windows il y a de forte chance que tu décodes du cp1250 à partir de données encodées en utf8. Bref tu obtiens n'importe quoi


    Le gros problème avec ces histoire de charset, c'est que la moindre erreur se répercute et n'est pas récupérable. Il faut donc être vigilant à toutes les étapes où tu manipules les données...


    Essayes de faire une appli à minima mais bien détaillé et poste là ici...


    a++

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 5
    Par défaut
    Thelvin,

    j'ai rajouté tes petites lignes pour tester:

    - tout s'affiche correctement en mettant les caractères manuellement
    - et tout s'affiche correctement aussi en récupérant depuis les fichiers audio...

    (et au fait, j'utilise Eclipse comme IDE, et j'ai mis dans les propriétés de mon projet que l'encodage est UTF-8, et aussi mes fichiers sont sauvés avec encodage UTF-8)


    Toujours bloqué, donc...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 5
    Par défaut
    adiGuba, voici un petit code résumé de mon appli:

    Code java : 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
    18
    19
    20
    21
    22
    23
     
    import org.jaudiotagger.audio.AudioFile;
    import org.jaudiotagger.audio.AudioFileIO;
    import org.jaudiotagger.tag.flac.FlacTag;
    import org.jaudiotagger.tag.vorbiscomment.VorbisCommentTag;
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
     
    void main(String[] args) {
    String path = "Y:\\Music\\Classique\\Contemporain\\(1913-1994) Lutosławski, Witold\\Musique concertante\\file.flac";
    AudioFile f = AudioFileIO.read(path);
    FlacTag tag = (FlacTag)f.getTag();
    VorbisCommentTag vorbisTag = tag.getVorbisCommentTag();
    String artist = vorbisTag.getFirst(FieldKey.ARTIST);
     
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection(url,"root", "");
    PreparedStatement artistsStmt = con.prepareStatement("insert into artists (nom_complet) values (?);");
    artistsStmt.setString(1, artist);
    artistsStmt.executeUpdate();
    }

    rien de bien compliqué...

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Donc tu as deux étapes à vérifier. Déjà il faut voir si la lecture se fait correctement.

    Pour cela le mieux est d'utiliser Swing qui gère proprement l'encodage, car la console pourrait avoir du mal à interpréter certains caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String artist = vorbisTag.getFirst(FieldKey.ARTIST);
     
    JOptionPane.showMessageDialog(null, artist);
    Si c'est mal encodé à ce niveau là, il va falloir te plonger dans la doc de cette librairie "jaudiotagger" pour savoir comment spécifier l'encodage.




    Sinon après ton INSERT dans la base, fait un SELECT pour récupérer la valeur et l'afficher de la même manière.



    Remarques :
    • Si je ne me trompe pas, avec MySQL il faut préciser l'encodage de la connexion via l'URL JDBC.
    • Il manque tous les try/finally (ou les try-with-ressource si tu es sous Java 7). J'espère que c'est juste pour le test et que le code final ne sera pas comme cela...



    a++

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Donc tu as deux étapes à vérifier. Déjà il faut voir si la lecture se fait correctement.

    Pour cela le mieux est d'utiliser Swing qui gère proprement l'encodage, car la console pourrait avoir du mal à interpréter certains caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String artist = vorbisTag.getFirst(FieldKey.ARTIST);
     
    JOptionPane.showMessageDialog(null, artist);
    Si c'est mal encodé à ce niveau là, il va falloir te plonger dans la doc de cette librairie "jaudiotagger" pour savoir comment spécifier l'encodage.
    Ça sert à la même chose que mon test qui consiste à écrire dans un fichier texte utf-8 et pas dans la console.
    Il semble assez sûr de lui en disant qu'il a fait les tests et que le problème n'est pas là.

    Ce qui ne nous laisse donc qu'un problème avec la communication avec la BDD MySQL... Et là, je n'y connais rien.
    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. Caractères "spéciaux" - problème d'import csv
    Par subarud dans le forum SAS Base
    Réponses: 0
    Dernier message: 15/06/2009, 12h02
  2. xml+caractère & pose problème à php
    Par polyvan dans le forum Langage
    Réponses: 9
    Dernier message: 01/04/2009, 15h16
  3. [HTML 4.0] Caractères chinois : problème enligne-hors ligne
    Par polochtwo dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 20/03/2009, 02h36
  4. Réponses: 4
    Dernier message: 31/03/2008, 17h33
  5. caractère \ pose problème
    Par questionneuse dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/07/2006, 16h25

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