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. #41
    Membre du Club
    Bonsoir,

    Le problème c'est que je peux pas trouver une solution autrement ...
    Pour un identificateur de language , je demande toujours à l'utilisateur de taper: le texte à identifier
    quelque soit au niveau console , ou bien à travers un champ input pour les jsf ...

    Pourriez-vous me proposer une autre solution si c'est possible ?

    Merci

  2. #42
    Expert éminent sénior
    Pour la console on a déjà résolu le problème. Pour JSF, il faut reprendre à à tout la chaine d'input output puisque rien ne correspond à ce que tu as décrit jusqu'à présent. Donc va falloit que tu nous renseigne sur toutes tes étapes. Comment le formulaire est généré, quel est son template, où apparaît l'erreur,...
    David Delbecq Java developer chez HMS Industrial Networks AB.    LinkedIn | Google+

  3. #43
    Membre du Club
    Bonsoir
    Juste pour votre information que j'utilise primeFaces, les mêmes fonctions sont utilisées , le même principe qu'avec la console ... Un fichier xhtml, contient un champs inputText , qui acccept une chaine de caratère (mot à identifié) et réelement au niveau class bean c'est la fonction :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    static String lireChaine() {
            Scanner sc = new Scanner(System.console().readLine());
            System.out.println("Saisissez votre mot: ");
            String mot = sc.nextLine();
            System.out.println("Le mot à identifier sera limité par deux espaces: " + "_" + mot + "_");
            return "_" + mot + "_";
     
        }

  4. #44
    Expert éminent sénior
    donne nous ton formulaire jsf, ton bean jsf, ton faces-config si tu en as un, ton web.xml. Une transcription de la requête http qui pose problème serait pas mal non plus (afficahge du formulaire et soumission du formulaire).
    David Delbecq Java developer chez HMS Industrial Networks AB.    LinkedIn | Google+

  5. #45
    Membre du Club
    calsse web.xml:
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />si="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
        <context-param>
            <param-name>javax.faces.PROJECT_STAGE</param-name>
            <param-value>Development</param-value>
        </context-param>
        <context-param>  
            <param-name>primefaces.THEME</param-name>  
            <param-value>sunny</param-value>  
        </context-param>
        <servlet>
            <servlet-name>Faces Servlet</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>/faces/*</url-pattern>
        </servlet-mapping>
        <session-config>
            <session-timeout>
                30
            </session-timeout>
        </session-config>
        <welcome-file-list>
            <welcome-file>faces/index.xhtml</welcome-file>
        </welcome-file-list>
    </web-app>


    pour le xhtml je colle l'interrassant :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    <?xml version='1.0' encoding='UTF-8' ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://xmlns.jcp.org/jsf/html"
          xmlns:p="http://primefaces.org/ui"
          xmlns:f="http://xmlns.jcp.org/jsf/core">
        <h:head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            <h:outputStylesheet name="css/default.css"/>
            <h:outputStylesheet name="css/cssLayout.css"/>
            <!-- Title here -->
            <title> Plateforme Identification Automatique du Dialectal Tunisien </title>
            <!-- Description, Keywords and Author -->
            <meta name="description" content=""/>
            <meta name="keywords" content=""/>
            <meta name="author" content=""/>
     
            <!-- Google web fonts -->
     
     
            <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
     
     
            <!-- Styles -->
            <!-- Bootstrap CSS -->
            <h:outputStylesheet library="css" name="bootstrap.min_rtl.css"  />
     
     
            <!-- Font awesome CSS -->
            <h:outputStylesheet library="css" name="font-awesome.min_rtl.css"  />
     
            <!-- Custom CSS -->
            <h:outputStylesheet library="css" name="style_rtl.css"  />
     
     
     
            <!-- Favicon -->
     
            <style type="text/css">
     
                .ui-selectonemenu .ui-selectonemenu-label {
     
                    width: 100% !important;
     
                }
                .ui-selectonemenu-panel .ui-selectonemenu-list-item {
                    border: 0px none;
                    margin: 1px 0;
                    padding: 3px 20px;
                    text-align: left;
                    white-space: nowrap;
                }
            </style>
        </h:head>
     
        <h:body dir="ltr"   >
            <h:form id="rechercheForm" dir="ltr"  enctype="multipart/form-data">
    ......
    <p:commandButton disabled="#{not classBean.afficheSaisie}" value="OK" icon="ui-icon-check" action="#{classBean.identificationMot()}" update="rechercheForm" style="width: 80px"> </p:commandButton>
                                                   &nbsp;&nbsp; <p:commandButton disabled="#{not classBean.afficheSaisie}" value="Rafraichir" icon="ui-icon-arrowrefresh-1-w" action="#{classBean.reset()}" update="rechercheForm" > </p:commandButton>
     
                                                    <br></br><br></br><br></br>
                                                    <center><h5><b><h:graphicImage  width="20" height="20" library="images" name="iconeVert.png" rendered="#{classBean.estAffiche}"/>
                                                                &nbsp;<p:outputLabel style="color: #00a65a"  rendered="#{classBean.estAffiche}"  value="#{classBean.verifierDialecte()}"></p:outputLabel></b></h5></center>
     
     
     
                                                    <br></br><br></br>
                                                    <i><table><tr><td style="width: 40%" >
                                                                    <p:outputLabel rendered="#{classBean.estAffiche}" value="Le mot à identifier sera limité par deux espaces"></p:outputLabel>
                                                                </td>
                                                                <td style="width: 5%">
                                                                    <h:graphicImage rendered="#{classBean.estAffiche}" width="20" height="20" library="img" name="ff.png"/>
     
                                                                </td>
                                                                <td>
                                                                    <p:outputLabel rendered="#{classBean.estAffiche}" value="_#{classBean.motIdentifier}_"></p:outputLabel>   
                                                                </td>
                                                            </tr>
                                                            <tr><td><br></br> </td><td> </td><td> </td></tr>
                                                            <tr> <td>
                                                                    <p:outputLabel rendered="#{classBean.estAffiche}" value="l'extraction de #{classBean.n}-grames est"></p:outputLabel>
                                                                </td> 
                                                                <td style="width: 5%">
                                                                    <h:graphicImage rendered="#{classBean.estAffiche}" width="20" height="20" library="img" name="ff.png"/>
     
                                                                </td>
                                                                <td>
                                                                    <p:outputLabel rendered="#{classBean.estAffiche}" value="#{classBean.l}"></p:outputLabel>
                                                                </td> </tr>
                                                            <tr><td><br></br> </td><td> </td><td> </td></tr>
                                                            <tr>
                                                                <td>
                                                                    <p:outputLabel rendered="#{classBean.estAffiche}" value="la fréquence de chaque gramme dans DT"></p:outputLabel>
                                                                </td>
                                                                <td style="width: 5%">
                                                                    <h:graphicImage rendered="#{classBean.estAffiche}" width="20" height="20" library="img" name="ff.png"/>
     
                                                                </td>
                                                                <td>
                                                                    <p:outputLabel rendered="#{classBean.estAffiche}" value="#{classBean.grammeFreqDT}"></p:outputLabel>
                                                                </td>
     
                                                            </tr><tr><td><br></br> </td><td> </td><td> </td></tr>
                                                            <tr>
                                                                <td><p:outputLabel rendered="#{classBean.estAffiche}"  value="la fréquence de chaque gramme dans NDT"></p:outputLabel>
                                                                </td>
                                                                <td style="width: 5%">
                                                                    <h:graphicImage rendered="#{classBean.estAffiche}" width="20" height="20" library="img" name="ff.png"/>
     
                                                                </td>
                                                                <td><p:outputLabel rendered="#{classBean.estAffiche}"  value="#{classBean.grammeFreqNDT}"></p:outputLabel>
                                                                </td>
                                                            </tr><tr><td><br></br> </td><td> </td><td> </td></tr>
                                                            <tr>  <td>
                                                                    <p:outputLabel rendered="#{classBean.estAffiche}"  value="la somme des fréqeunce DT"></p:outputLabel>
                                                                </td>
                                                                <td style="width: 5%">
                                                                    <h:graphicImage rendered="#{classBean.estAffiche}" width="20" height="20" library="img" name="ff.png"/>
     
                                                                </td>
                                                                <td>
                                                                    <p:outputLabel rendered="#{classBean.estAffiche}"  value="#{classBean.sommeDT}"></p:outputLabel>
                                                                </td>
     
                                                            </tr><tr><td><br></br> </td><td> </td><td> </td></tr>
                                                            <tr><td>
                                                                    <p:outputLabel rendered="#{classBean.estAffiche}"  value="la somme des fréqeunce NDT"></p:outputLabel>
                                                                </td>
                                                                <td style="width: 5%">
                                                                    <h:graphicImage rendered="#{classBean.estAffiche}" width="20" height="20" library="img" name="ff.png"/>
     
                                                                </td>
                                                                <td>
                                                                    <p:outputLabel rendered="#{classBean.estAffiche}"  value="#{classBean.sommeNDT}"></p:outputLabel>
                                                                </td> </tr><tr><td><br></br> </td><td> </td><td> </td></tr>
     
                                                            <tr><td><p:outputLabel rendered="#{classBean.estAffiche}"  value="la proba des fréqeunce DT"></p:outputLabel>
                                                                </td>
                                                                <td style="width: 5%">
                                                                    <h:graphicImage rendered="#{classBean.estAffiche}" width="20" height="20" library="img" name="ff.png"/>
     
                                                                </td>
                                                                <td>
                                                                    <p:outputLabel rendered="#{classBean.estAffiche}"  value="#{classBean.probaDT}"></p:outputLabel>
                                                                </td> </tr><tr><td><br></br> </td><td> </td><td> </td></tr>
                                                            <tr>
                                                                <td>  <p:outputLabel rendered="#{classBean.estAffiche}"  value="la proba des fréqeunce NDT"></p:outputLabel>
                                                                </td>
                                                                <td style="width: 5%">
                                                                    <h:graphicImage rendered="#{classBean.estAffiche}" width="20" height="20" library="img" name="ff.png"/>
     
                                                                </td>
                                                                <td>
                                                                    <p:outputLabel rendered="#{classBean.estAffiche}"  value="#{classBean.probaNDT}"></p:outputLabel>
                                                                </td>
                                                            </tr><tr><td><br></br> </td><td> </td><td> </td></tr>
     
                                                        </table></i>
     
    ....


    Au niveau bean (les mêmes fonction utiilisées dans l'appli java):
    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
     public void identificationMot() throws IOException {
     
            String motModifié = "_" + motIdentifier + "_";
            gnerationNGrams(l, motModifié, n); //  génération d'une liste de sous chaine du mot saisie par l'utilisateur
            ExtractionNGram2 EN = new ExtractionNGram2();
            grammeFreqDT = EN.ChercherChaineFichier("monChemin/DT.txt", l); // Map<String, Integer> contient les sous chaine et leurs fréquence d'appartion dans le fichier
            grammeFreqNDT = EN.ChercherChaineFichier("monChemin/NDT.txt", l);    // même chose avec autre fichier
            sommeDT = sommeFrequences(AccésAuFichier("monCheminDT.txt"));      //additionner la somme de tous les fréquences du fichier 1
            sommeNDT = sommeFrequences(AccésAuFichier("monChemin/NDT.txt"));  // même chose 
            probaDT = EN.probabilité(grammeFreqDT, sommeDT);    // somme des proba des sous chaine du mot selon fichier 1
            grammeProbDT = EN.probabilitéMap(grammeFreqDT, sommeDT);   // stocke dans un Map<String, Double> chaque sous chaîne avec la proba selon fichier 1
            probaNDT = EN.probabilité(grammeFreqNDT, sommeNDT);    // somme des proba des sous chaine du mot selon fichier 2
            grammeProbNDT = EN.probabilitéMap(grammeFreqNDT, sommeNDT);   // stocke dans un Map<String, Double> chaque sous chaîne avec la proba selon fich 2
             estAffiche = true;
            if ((!grammeProbDT.isEmpty()) && (!grammeProbNDT.isEmpty())) { // affichage de l'histogramme
                createBarModel(grammeProbDT, grammeProbNDT);
            }
        }



    Comme réponse à la requette , le resultat souhaité est que pour chaque portion de texte (et même qu'elle contient des caractères accentuée) la probabilité d'existance dans mon fichier sera mis dans le map affiché. ()
    Je voudrais donc éliminer les zeros affichés




    Merci de m'aider s'il vous plaît

  6. #46
    Expert éminent sénior
    ok donc pas de problème d'encodage à priori. Donc pas le problème qu'en console puisque en console les séries de 3 caractères étaient mauvaise. Tu peux poster un code qu'on peut lancer et qui reproduise ton problème, parce que là sans avoir tout le code je pense que ça va devenir difficile à démêler.
    David Delbecq Java developer chez HMS Industrial Networks AB. &#12288;&#12288;&#12288;LinkedIn | Google+

  7. #47
    Membre du Club
    je doute que le problème vient du SE , j'essayes prochainement d'exécuter l'application sur une autre machine
    Sinon voulez vous que je dépose tout le projet ? J'ai essayé de mettre le necéssaire car j'ai plus qu'une tâche dans l'application aussi j'ai des fichiers que je les y accéde de ma machine.

  8. #48
    Membre du Club
    Bonjour,

    Même sur une autre machine la commande
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    System.out.println(System.console());

    m'a affiché null


  9. #49
    Membre du Club
    Citation Envoyé par FaridDelaMorlette Voir le message
    T'as mis 6mins 40 pour faire ça O_o ??
    Ya que moi que ça choque ????
    Concernant le temps d'exécution , merci pour votre remarque
    Mais j'ai constaté que ce n'est pas le temps réél d'exécution du programme plutôt il inclut aussi le temps d'attente jusqu'à que l'utilisateur saisisse un mot au clavier
    le temps réél de l'exécution (quand l'utilisateur tappe le mot directement à la demande )ne dépasse pas:



    Merci

  10. #50
    Expert éminent sénior
    Citation Envoyé par tchize_ Voir le message
    Tu peux poster un code qu'on peut lancer et qui reproduise ton problème, parce que là sans avoir tout le code je pense que ça va devenir difficile à démêler.
    David Delbecq Java developer chez HMS Industrial Networks AB. &#12288;&#12288;&#12288;LinkedIn | Google+

  11. #51
    Membre du Club
    Bonjour
    Voila :


    sinon pour le fichier texte , il dépasse la taille autorisée



    Merci pour votre aide

  12. #52
    Membre du Club
    bonsoir,

    Voila mon corpus compressé.
    Merci de m'aider à résoudre le problème de l'encodage

  13. ###raw>post.musername###
    Expert éminent sénior
    Je viens d'exécuter ton code et de regarder les problèmes.Tu as de gros problèmes d'optimisation comme déjà mentionnés que je te laisse réparer (ouvrir 3 fois un fichier plutot qu'une par exemple). Tu as des problème de consistence (parfois un utile l'api files, parfois les BufferedReader/Writer, parfois les printWriter.

    Enfin pour le problème d'accents, je me réfère à ces deux messages qui n'ont pas été pris en compte dans ton code:

    Citation Envoyé par tchize_ Voir le message
    à chaque fois tu dois systématiquement utiliser UTF-8 dans tes reader / writer à l'ouverture.

    ce qui n'est pas fait quand tu crée tes fichiers DT/NDT, du coup il ne sont pas en utf8. Par contre tu essaie de les relire en utf-8 d'où le 0 match lors du equals avec la valeur au clavier.

    Citation Envoyé par tchize_ Voir le message
    essaie ça, l'encodage devrait etre ok entre java et netbeans sur la lecture clavier:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    static String lireChaine() {
            return System.console().readLine();
     
        }
    Une fois ce que tu utlise bien console et non Scanner(System.in), tu as bien une lecture correct des accents au clavier. Alors que sans ça sous windows, t'obtiens de la purée en sortie du Scanner.


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        static String lireChaine() {
            System.out.println("Saisissez votre mot: ");
    		String mot = System.console().readLine();
            System.out.println("Le mot à identifier sera limité par deux espaces: " + "_" + mot + "_");
            return "_" + mot + "_";
     
        }

    Et une fois que tu écrit correctement en utf=8 et non pas en encodage par défaut tes fichiers DT/NDT, tu as des matchs corrects.
    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
    39
    40
    41
        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); // avec substring
                    if (firstChar.equals("N")) {
                        gnerationNGrams(nGramsNDT, line1, nombre);
    
                    } else {
                        gnerationNGrams(nGramsDT, line1, nombre);
    
                    }
                    line = file.readLine();
                }
                System.out.println("Le nombre de " + nombre + "-gramme de la liste Non Dialecte Tunisien (NDT) = " + nGramsNDT.size());
                PrintWriter fichNDT = new PrintWriter(Files.newBufferedWriter(Paths.get("Mes corpus/NDT.txt"), StandardCharsets.UTF_8));
                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 = Files.newBufferedWriter(Paths.get("Mes corpus/DT.txt"), StandardCharsets.UTF_8);
                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");
            }
    
        }


    C:\Users\tchize\Downloads>"c:\Program Files\Java\jdk1.8.0_11\bin"\java corpus.ExtractionNGram2
    Saisissez le nombre de gramme : Unigramme (n=1) | Bigramme (n=2) | Trigramme (n=3) n ==>
    3
    Le nombre de 3-gramme de la liste Non Dialecte Tunisien (NDT) = 193657
    fichier NDT.txt est créé avec succès!
    Le nombre de 3-gramme de la liste Dialecte Tunisien (DT) = 225696
    fichier DT.txt est créé avec succès !
    Saisissez votre mot:
    évé
    Le mot à identifier sera limité par deux espaces: _évé_
    l'extraction de 3-grames: [_év, évé, vé_]
    les fréquences de chaque 3-gram dans DT
    trouver _év dans Mes corpus/DT.txt
    trouver évé dans Mes corpus/DT.txt
    trouver vé_ dans Mes corpus/DT.txt
    _év = 0
    évé = 0
    vé_ = 0
    les fréquences de chaque 3-gram dans NDT
    trouver _év dans Mes corpus/NDT.txt
    trouvé _év fréquence=7
    trouver évé dans Mes corpus/NDT.txt
    trouvé évé fréquence=6
    trouver vé_ dans Mes corpus/NDT.txt
    trouvé vé_ fréquence=12
    _év = 7
    évé = 6
    vé_ = 12
    la somme des fréqeunce DT ==225696
    la somme des fréqeunce NDT ==193657
    ******************** DT ********************
    _év = 0.0
    évé = 0.0
    vé_ = 0.0
    **** la somme des proba DT = 0.0 ********
    _év = 3.614638252167492E-5
    évé = 3.0982613590007074E-5
    vé_ = 6.196522718001415E-5
    **** la somme des proba NDT = 1.2909422329169615E-4 ********
    le mot _évé_ est un NDT
    Cp1252
    java.io.Console@74a14482
    et en bonus, je te transforme ton code affreux en N² qui génère ta liste de fréquence après 1 minute de travail intensif en un machin qui te la sort instantanément en temps N. Parce que appeler en boucle Collection.frequency c'est un peu n'importe nawak sur une liste de 200.000 entrées.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        public String occurence(ArrayList<String> list) {
            StringBuilder sb = new StringBuilder();
            Map<String, Long> counted = list.stream()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
            for (Map.Entry<String,Long> e : counted.entrySet()) {
                long frequency = e.getValue();
                sb.append(e.getKey()).append(":").append(e.getValue()).append("\n");
                listOcc.add((int)frequency);
            }
            return sb.toString();
        }
      0  0