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

Entrée/Sortie Java Discussion :

Problème d'encodage UTF8 fichier texte


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Problème d'encodage UTF8 fichier texte
    J'ai un fichier texte enregistré sous l'encodage UTF-8 , de façon que les caractères accentutés apparaissent correctement comme c'est indiqué dans la capture ci-dessous


    En entrée , j'ai un mot présenté dans une liste (chaque case contient 3 caractères). La fonction suivante permet de chercher les élements de ma liste dans mon fichier (qui contient 3 caractères par ligne) , les stockent dans une map et entre temps les affichent avec leurs nombres d'apparition.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      public static Map<String, Integer> ChercherChaineFichier(String fichier, ArrayList<String> listeMots) throws IOException {
     
            Map<String, Integer> frequences = new LinkedHashMap<String, Integer>();
            int freq = 0;
            for (String s : listeMots) {
                freq = trouveMotFile(fichier, s);
                frequences.put(s, freq);
            }
     
            for (Map.Entry<String, Integer> e : frequences.entrySet()) {
                System.out.println(e.getKey() + " = " + e.getValue());
            }
            return frequences;
        }


    Je travail sous Netbeans, Pour un mot saisie (président) au niveau de l'affichage (la ficgure ci-dessous) et malgré que la chaine existe dans mon fichier, le nombre d'appation des caractère accentués s'affiche =0. et les carractères accentués n'apparaissent plus (un petit carreau remplace chaque caractère accentué).



    Aidez moi s'il vous plaît à resoudre ce problème
    Merci

  2. #2
    Modérateur

    Salut,

    Le problème se situe probablement au niveau de la lecture du fichier. On peut voir ton code de lecture du fichier justement ?
    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.

  3. #3
    Membre du Club
    Oui Bien sûr ,

    Fonction AccésAuFichier permet d'accéder au fichier
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      static BufferedReader AccésAuFichier(String path) {
     
            try {
                BufferedReader inFile = new BufferedReader(new FileReader(path));
                return inFile;
            } catch (Exception e) {
                System.out.println("Vérifiez le chemin de votre fichier");
                return null;
            }
        }


    Au niveau main

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Map<String, Integer> grammeFreqDT = ChercherChaineFichier("MonChemin/fich.txt", l);



  4. #4
    Modérateur

    Un FileReader lit toujours dans l'encodage par défaut du système.
    Fais plutôt :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    BufferedReader inFile = Files.newBufferedReader(Paths.get(path), StandardCharsets.UTF_8)
    .
    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 du Club
    Merci , mais encore je rencontre le même problème


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     static BufferedReader AccésAuFichier(String path) {
     
            try {
                BufferedReader inFile = Files.newBufferedReader(Paths.get(path), StandardCharsets.UTF_8);
                return inFile;
            } catch (Exception e) {
                System.out.println("Vérifiez le chemin de votre fichier");
                return null;
            }
        }

  6. #6
    Modérateur

    Montre-moi toute la procédure de lecture (comment tu récupères le contenu du fichier).
    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.

  7. #7
    Expert éminent sénior
    Aussi, vu qu'avant même la recherche ta liste de mot semble foireuse, pourrais-tu nous montrer comment tu construit cette liste de mot que tu passe à ta méthode de recherche?
    David Delbecq Java developer chez HMS Industrial Networks AB. &#12288;&#12288;&#12288;LinkedIn | Google+

  8. #8
    Membre du Club
    Ma liste est conntruite de cette façon :
    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
    static public void gnerationNGrams(ArrayList<String> liste, String str, int n) {
            if (str.length() <= n) { // (==n)
                liste.add(str);
                return;
            } else {
                int counter = 0;
                String gram = "";
     
                while (counter < n) {
                    gram += str.charAt(counter);
                    counter++;
                }
                liste.add(gram);
                gnerationNGrams(liste, str.substring(1), n);
            }
        }

    Pour la lecture du fichier,: au debut j'ai un fichier qui contient un mot sur chaque ligne (_mot_[DT] ou _mot[NDT]_). voila:



    A partir de ce fichier, je génére deux autre: DT:



    et NDT:



    D'ou je rencontre le problème mentionné avec l'affichage des donnée de ces deux fichier .j'espère que la procédure est bien expliquée , sinon je met la méthode qui fait ce traitement

    Merci

  9. #9
    Modérateur

    Ce qui nous intéresse en résumé c'est comment tu construis tes chaînes, celle de la liste, et celle que tu lis depuis le fichier. Tout le reste, (comme ajouter des chaînes dans une liste), n'a aucun intérêt en ce qui concerne l'encodage des chaînes. Ce qu'on voudrait surtout savoir si tu ne ferais pas des "conversions" de String par l'intérmédiaire de tableau de bytes. Ça c'est pour le problème de comptage.
    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.

  10. ###raw>post.musername###
    Membre du Club
    Non je n'ai pas fait des convertions. voila le traitement réalisé
    Personnement , je pense qu'il y a dans Netbeans au niveau du console , quelques réglages à faire (pour l'encodage) pour que les cacarctères accentués soient correctement affichés ... vous n'y pensez pas?
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     static void collectStats(BufferedReader file, int nombre) {
            String line = "";
            try {
                line = file.readLine();
                ArrayList<String> nGramsDT = new ArrayList<String>();
                ArrayList<String> nGramsNDT = new ArrayList<String>();
     
                while (line != null) {
                    String[] ss = line.split("\\[");
                    String line1 = ss[0].toLowerCase();
                    String line2 = ss[1];  // DT] ou NDT]
                    String firstChar = line2.substring(0, 1);
                    if (firstChar.equals("N")) {
                        gnerationNGrams(nGramsNDT, line1, nombre);
     
                    } else {
                        gnerationNGrams(nGramsDT, line1, nombre);
     
                    }
                    line = file.readLine();
                }
                //NDT
                System.out.println("Le nombre de " + nombre + "-gramme de la liste Non Dialecte Tunisien (NDT) = " + nGramsNDT.size());
                PrintWriter fichNDT = new PrintWriter(new FileWriter("chemin/NDT.txt"));
                ExtractionNGram2 EN = new ExtractionNGram2();
                fichNDT.print(EN.occurence(nGramsNDT));
                fichNDT.close();
                System.out.println("fichier NDT.txt est créé avec succès!");
                //DT
                System.out.println("Le nombre de " + nombre + "-gramme de la liste Dialecte Tunisien (DT) = " + nGramsDT.size());
                BufferedWriter fichDT = new BufferedWriter(new FileWriter(new File("chemin/DT.txt")));
                fichDT.write(EN.occurence(nGramsDT));
                fichDT.close();
                System.out.println("fichier DT.txt est créé avec succès !");
            } catch (Exception e) {
                System.out.println("erreur");
            }
        }





    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      private List<Integer> listOcc = new ArrayList<>();
     
        public String occurence(ArrayList<String> list) {
            StringWriter writer = new StringWriter();
            PrintWriter out = new PrintWriter(writer);
            Set<String> unique = new HashSet<String>(list);
            for (String key : unique) {
                out.println(key + ":" + Collections.frequency(list, key));
                listOcc.add(Collections.frequency(list, key));
     
            }
            return writer.toString();
        }
      0  0

  11. #11
    Modérateur

    La console NetBeans utilise en effet par défaut une police limitée : il y a un menu contextuel sur la console qui te permettra de choisir une police différente (par exemple Arial MS Unicode).

    Au passage, tes fichiers étant produits pas FileWriter, il ne seront pas UTF-8 (sauf si c'est l'encodage par défaut, parce que, de même que FileReader, FileWriter utile l'encoding par défaut).
    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.

  12. #12
    Membre du Club
    J'ai pensé à l'encodage au niveau de proporiétés du projet , il est bien fixé à UTF-8


    lors de la création de mes fichiers , l'encodage est par défaut UTF-8

  13. #13
    Expert éminent sénior
    est-ce que des caractère accentués comme "é", "ê", "ù" fonctionnent? Si je suis bien ton code, tu lit ton fichier de mot, tu coupe chaque ligne en un groupe de trois lettres puis ton compte le nombre d'occurence de ces trois lettres dans le fichier et c'est là que ça foire?

    Il est aussi possible que l'encodage de la console ne permette pas d'afficher ces caractères. La console utilise l'encodage par défaut de la plateforme. Que te sort System.getProperty("file.encoding") ? Là on coince sur un problème de l'OS. La console est limitée.
    David Delbecq Java developer chez HMS Industrial Networks AB. &#12288;&#12288;&#12288;LinkedIn | Google+

  14. #14
    Modérateur

    Citation Envoyé par cheyma Voir le message
    J'ai pensé à l'encodage au niveau de proporiétés du projet , il est bien fixé à UTF-8


    lors de la création de mes fichiers , l'encodage est par défaut UTF-8
    Je ne me sers pas de NetBeans, donc je ne connais pas bien, mais là, je pense qu'il s'agit de l'encoding des fichiers sources, donc rien à voir avec ce qu'il se passe à l'exécution, ou dans la console de NetBeans.
    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.

  15. #15
    Membre du Club
    Bonsoir,

    - Aucun caractère accentué n'est affiché correctement
    - System.out.println(System.getProperty("file.encoding")); m'a affiché UTF-8

  16. #16
    Expert éminent sénior
    Et System.out.println("\u00e9"); affiche é ou un carré?
    David Delbecq Java developer chez HMS Industrial Networks AB. &#12288;&#12288;&#12288;LinkedIn | Google+

  17. #17
    Membre du Club
    Bonjour,

    System.out.println("\u00e9"); affiche ------> é
    System.out.println("èèèééééààààçççç"); affiche ------> èèèééééààààçççç

  18. #18
    Expert éminent sénior
    Ok, pour bien comprendre, par contre, les é que tu lit depuis ton fichier sont incorrects?
    David Delbecq Java developer chez HMS Industrial Networks AB. &#12288;&#12288;&#12288;LinkedIn | Google+

  19. #19
    Membre du Club
    Bonsoir,

    Au niveau du fichier sont correctement écrits , l'encodage du fichier généré est UTF-8
    Mais avec le code mentionné ci-dessus au final , l'affichage resulte des petits carreaux au lieu de céractères accentués
    J'ai pas pu même derterminer le problème ou exactement

    Merci

  20. #20
    Expert éminent sénior
    ok, donc les é è etc marchent, mais les caractères accentués plus poussés comme i i avec un éclair au dessus ne marchent pas. Regarde du coté de la fonte utilisée par ta console netbeans, toutes les polices ne supportent pas tout le range unicode. Il faudra peut être utiliser un autre police voir même en chercher une.
    David Delbecq Java developer chez HMS Industrial Networks AB. &#12288;&#12288;&#12288;LinkedIn | Google+