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 :

[Encoding]Je n'arrive pas à afficher les caractères grecs correctement


Sujet :

Langage Java

  1. #1
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut [Encoding]Je n'arrive pas à afficher les caractères grecs correctement
    Bonjour,

    J'ai quelques soucis pour afficher correctement côté Java les données textuelles grecques d'une colonne CLOB d'une base Oracle :

    Oracle DATABASE 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
    PL/SQL Release 10.2.0.3.0 - Production
    CORE 10.2.0.3.0 Production
    TNS FOR Solaris: Version 10.2.0.3.0 - Production
    NLSRTL Version 10.2.0.3.0 - Production
    Le CHARACTER_SET de la base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NLS_CHARACTERSET               AL32UTF8
    Le script de la table :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE MY_MARKUP_TABLE
    (
      QUERY_ID  NUMBER,
      DOCUMENT  CLOB
    )

    Le code pour récupérer et afficher le contenu :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
            try {
     
                conn = getConnection();
     
                Statement stmt = conn.createStatement();
     
                // Execute the function and get the return object from the call
                ResultSet rs = stmt.executeQuery("select DOCUMENT from MY_MARKUP_TABLE");
     
                rs.next();
     
                Clob var = rs.getClob("DOCUMENT");
     
                Reader in = var.getCharacterStream();
     
                StringBuffer buf = new StringBuffer();
     
                try {
                    for (int c = in.read(); c != -1; c = in.read()) {
                        buf.append((char) c);
                    }
     
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        in.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(buf.toString());
     
            } catch (SQLException e) {
                e.printStackTrace();
     
            } finally {
     
                closeConnection(conn);
            }

    Avec SQL Developper, les caractères sont correctement affichés (cf. pièce jointe).

    Et ma console m'affiche via le System.out.println(buf.toString()); :

    Code hml : 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
     
    <html><body><p/>
    <br /><font face="Times New Roman" size="3">EL<div align="center"></font>
    <p><font face="Times New Roman" size="3"><b>SANCO/3175/2007 Rev.1 (POOL/E3/2007/3175/3175R1-EN.doc)</b></font>
    <p><font face="Times New Roman" size="3">&nbsp;</font>
    <br style="page-break-before:always" />
    </div>
     
    <table width="631" border="1"><tr valign="top"><td width="120"><font face="Arial" size="3"><br /></font>
    </td>
    <td width="510"><font face="Arial" size="3">???????? ??? ?????????? ??????????</font>
    </td>
    </tr>
    </table>
    <font face="Times New Roman" size="3">B????????,</font>
    <p><font face="Times New Roman" size="3">C(2007)	&nbsp;??????<div align="center"></font>
    <p><font face="Times New Roman" size="3">??????</font>
    <p><font face="Times New Roman" size="3"><b>??????? ??? ?????????</b></font>
    <p><font face="Times New Roman" size="3"><b>???</b></font>
    <p><font face="Times New Roman" size="3"><b>??? ??? ??????????? ??? ??????? 2002/72/?? ??????? ?? ?? ???????? ????? ??? ??????????? ??? ???????????? ?? ?????? ?? ????? ?? ??????? </b></font>
    <p><font face="Times New Roman" size="3">(???????? ??? ?. ?. ?????????)</font>
    <p><font face="Times New Roman" size="5"><u><b>&nbsp;</b></u></font>
    ...
    ...

    J'imagine très bien qu'il y a un souci d'encoding, mais là je suis un peu perdu.

    La version de Java est 1.4.2_13.

    Merci d'avance pour votre aide.
    Images attachées Images attachées  

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Le Driver d'oracle gère-t-il bien le charset AL32UTF8 ? Existe-t-il une classe AL32UTF8 ? Ne faut-il pas un plugin ou autre ?

  3. #3
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Citation Envoyé par dingoth Voir le message
    Le Driver d'oracle gère-t-il bien le charset AL32UTF8 ? Existe-t-il une classe AL32UTF8 ? Ne faut-il pas un plugin ou autre ?
    Dans la librairie ojdbc14.jar que j'utilise j'ai bien trouvé la classe CharacterSetAL32UTF8.class donc j'imagine que oui...

    D'autres pistes ?

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


    Quand tu parles de la console, de quelle console s'agit-il ?
    Car si c'est le console MS-Dos de Windows cela doit être normal je ne pense pas qu'elle gère ces caractères...

    a++

  5. #5
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Quand tu parles de la console, de quelle console s'agit-il ?
    Car si c'est le console MS-Dos de Windows cela doit être normal je ne pense pas qu'elle gère ces caractères...

    a++
    Il sagit de la console Eclipse.

    J'ai bien essayé avec :

    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt"), "UTF-8"));

    Et j'obtiens dans le fichier :

    Code html : 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
    <html><body><p/>
    <br /><font face="Times New Roman" size="3">EL<div align="center"></font>
    <p><font face="Times New Roman" size="3"><b>SANCO/3175/2007 Rev.1 (POOL/E3/2007/3175/3175R1-EN.doc)</b></font>
    <p><font face="Times New Roman" size="3">&nbsp;</font>
    <br style="page-break-before:always" />
    </div>
     
    <table width="631" border="1"><tr valign="top"><td width="120"><font face="Arial" size="3"><br /></font>
    </td>
    <td width="510"><font face="Arial" size="3">• ™¤¡Ÿ — ¤©� •¥¡© ‘ªš©� šŸ™�Ÿ¤—¤©�</font>
    </td>
    </tr>
    </table>
    <font face="Times New Roman" size="3">BÁžÂ*»»µÂ,</font>
    <p><font face="Times New Roman" size="3">C(2007)	&nbsp;ĵ»¹ºÌ<div align="center"></font>
    <p><font face="Times New Roman" size="3">£ÇÂ*´¹¿</font>
    <p><font face="Times New Roman" size="3"><b>Ÿ”—“™‘£ ¤—£ • ™¤¡Ÿ —£</b></font>
    <p><font face="Times New Roman" size="3"><b>Ä·Â</b></font>
    <p><font face="Times New Roman" size="3"><b>³¹± Ä·½ ÄÁ¿À¿À¿¯·Ã· Ä·Â ¿´·³¯±Â 2002/72/•š ÃǵĹº¬ ¼µ ı À»±ÃĹº¬ Å»¹º¬ º±¹ ±½Ä¹ºµ¯¼µ½± À¿Å ÀÁ¿¿Á¯¶¿½Ä±¹ ½± Â*Á¸¿Å½ õ µÀ±Æ® ¼µ ÄÁÌƹ¼± </b></font>
    <p><font face="Times New Roman" size="3">(¥À̼½·¼± Ä¿Å º. œ. š¥ ¡™‘�Ÿ¥)</font>
    <p><font face="Times New Roman" size="5"><u><b>&nbsp;</b></u></font>
     
    ...
    ...

    ça me désespère quand je vois SQL Developper qui m'affiche parfaitement ces caractères...

    Des pistes ?

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Vu les séquences de caractères qui se répètent, je crois que ton programme de lecture de fichier texte supporte mal l'UTF-8 (je parie sur notepad )

    Et si tu utilises un JTextArea tout simple (juste pour le test, je rassure ) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String s = ... // mon code HTML
    JTextArea text = new JTextArea();
    text.setText(s);
    JFrame frame = new JFrame();
    frame.getContentFrame().add(text);
    frame.setSize(300,300);
    frame.setVisible(true);
    Là, si c'est pas correct, c'est qu'il y a vraiment un problème.

  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
    Pour la console d'eclipse il peut s'agir d'un mauvais encodage. Tu peux le vérifier dans le menu Run -> Open Run Dialog... puis l'onglet Common de la configuration de ton application.

    Mais de manière générale la console risque de te poser beaucoup de problème d'encodage. Une UI Swing faciliterait surement cela...

    Enfin il peut également s'agir d'un problème de police de caractères qui ne supporterait pas les caractères grecs...


    a++

  8. #8
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Citation Envoyé par dingoth Voir le message
    Vu les séquences de caractères qui se répètent, je crois que ton programme de lecture de fichier texte supporte mal l'UTF-8 (je parie sur notepad )
    Perdu c'était SCite...encoding UTF-8

    Citation Envoyé par dingoth Voir le message
    Et si tu utilises un JTextArea tout simple (juste pour le test, je rassure ) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String s = ... // mon code HTML
    JTextArea text = new JTextArea();
    text.setText(s);
    JFrame frame = new JFrame();
    frame.getContentFrame().add(text);
    frame.setSize(300,300);
    frame.setVisible(true);
    Là, si c'est pas correct, c'est qu'il y a vraiment un problème.
    good good , ça converge ( petite modif ds ton code avec getContentFrame ==> getContentPane ), j'ai dans la frame les caractères grecs biens affichés, un extrait (c'est de l'unicode dedans ?) en pièce jointe la copie d'écran :

    Code html : 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
     
    <html><body><p/>
    <br /><font face="Times New Roman" size="3">EL<div align="center"></font>
    <p><font face="Times New Roman" size="3"><b>SANCO/3175/2007 Rev.1 (POOL/E3/2007/3175/3175R1-EN.doc)</b></font>
    <p><font face="Times New Roman" size="3">&nbsp;</font>
    <br style="page-break-before:always" />
    </div>
     
    <table width="631" border="1"><tr valign="top"><td width="120"><font face="Arial" size="3"><br /></font>
    </td>
    <td width="510"><font face="Arial" size="3">ΕΠΙΤΡΟΠΗ ΤΩΝ ΕΥΡΩΠΑΪΚΩΝ ΚΟΙΝΟΤΗΤΩΝ</font>
    </td>
    </tr>
    </table>
    <font face="Times New Roman" size="3">Bρυξέλλες,</font>
    <p><font face="Times New Roman" size="3">C(2007)	&nbsp;τελικό<div align="center"></font>
    <p><font face="Times New Roman" size="3">Σχέδιο</font>
    <p><font face="Times New Roman" size="3"><b>ΟΔΗΓΙΑΣ ΤΗΣ ΕΠΙΤΡΟΠΗΣ</b></font>
    <p><font face="Times New Roman" size="3"><b>της</b></font>
    <p><font face="Times New Roman" size="3"><b>για την τροποποίηση της οδηγίας 2002/72/ΕΚ σχετικά με τα πλαστικά υλικά και αντικείμενα που προορίζονται να έρθουν σε επαφή με τρόφιμα </b></font>
    <p><font face="Times New Roman" size="3">(Υπόμνημα του κ. Μ. ΚΥΠΡΙΑΝΟΥ)</font>
    <p><font face="Times New Roman" size="5"><u><b>&nbsp;</b></u></font>
    ...
    ...

    Maintenant pour quoi c'est ok, via Swing ?

    Mon besoin au final est d'enregistrer cette String de caractères Grecs dans un fichier HTML, comment devrais je m'y prendre à ce moment là ? car pour le moment la fonction pourrie que j'ai trouvé sur ce projet c'est ça :

    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
        protected void saveToFile(HtmlDocument doc, File f) throws Exception {
     
            BufferedWriter os = new BufferedWriter(new FileWriter(f));
            os.write(doc.header);
            for (int pCounter = 0; pCounter < doc.paragraphs.length; pCounter++) {
                Paragraph p = doc.paragraphs[pCounter];
                String text = p.content.toString();
                StringBuffer content = new StringBuffer();
                String htmlEnd = "</html>";
                int htmlEndIdx = text.indexOf(htmlEnd);
                if (htmlEndIdx != -1) {
                    content.append(text.substring(0, htmlEndIdx));
                    content.append("\n");
     
                    content.append(htmlEnd + "\n");
                    content.append(text.substring(htmlEndIdx + htmlEnd.length()));
                } else {
                    content.append(text);
                }
                os.write(content.toString());
            }
            os.close();
        }

    Et ça donne un HTML comme ça :
    Code html : 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
     
    EL
     
    SANCO/3175/2007 Rev.1 (POOL/E3/2007/3175/3175R1-EN.doc)
     
     
     
    	???????? ??? ?????????? ??????????
    B????????,
     
    C(2007)  ??????
     
    ??????
     
    ??????? ??? ?????????
     
    ???
     
    ??? ??? ??????????? ??? ??????? 2002/72/?? ??????? ?? ?? ???????? ????? ??? ??????????? ??? ???????????? ?? ?????? ?? ????? ?? ???????
     
    (???????? ??? ?. ?. ?????????)

    Citation Envoyé par adiGuba Voir le message
    Pour la console d'eclipse il peut s'agir d'un mauvais encodage. Tu peux le vérifier dans le menu Run -> Open Run Dialog... puis l'onglet Common de la configuration de ton application.

    Mais de manière générale la console risque de te poser beaucoup de problème d'encodage. Une UI Swing faciliterait surement cela...

    Enfin il peut également s'agir d'un problème de police de caractères qui ne supporterait pas les caractères grecs...
    a++
    Malgré mes divers test en modifiant le "Console encoding" dans Eclipse je n'ai pas réussi à voir correctement les caractères...

    Merci d'avance de votre aide pour l'enregistrement en HTML.
    Images attachées Images attachées  

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Bon, on progresse

    Pour sauver le texte dans un fichier HTML, il y a plusieurs choses à faire :

    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
    protected void saveToFile(HtmlDocument doc, File f) throws Exception {
     
            BufferedWriter os = new BufferedWriter(new OutputStreamWriter(FileOutputStream(f), "UTF-8"));
            os.write(doc.header);
            for (int pCounter = 0; pCounter < doc.paragraphs.length; pCounter++) {
                Paragraph p = doc.paragraphs[pCounter];
                String text = p.content.toString();
                StringBuffer content = new StringBuffer();
                String htmlEnd = "</html>";
                int htmlEndIdx = text.indexOf(htmlEnd);
                if (htmlEndIdx != -1) {
                    content.append(text.substring(0, htmlEndIdx));
                    content.append("\n");
     
                    content.append(htmlEnd + "\n");
                    content.append(text.substring(htmlEndIdx + htmlEnd.length()));
                } else {
                    content.append(text);
                }
                os.write(content.toString());
            }
            os.close();
        }
    Là, on a un fichier HTML écrit en UTF-8. Faut maintenant forcer le navigateur à le lire comme ça. Pour ce faire, il suffit d'ajouter une balise dans le code HTML, à l'intérieur du tag <head></head>.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    Voilà pour la résolution. Le comment du pourquoi ça marche avec Swing et pas avec les autres programmes ?

    À mon avis, c'est simplement que tu n'exportais pas avec le charset UTF-8 ton fichier HTML (voir la portion de code modifiée), mais avec le charset standard de ton OS... qui n'est pas de l'UTF-8. Si la gestion interne des chaînes de caractères en java est traitée par l'utf-8, il n'en est pas de même lorsqu'il s'agit de rendre ces caractères (dans un fichier, et non dans swing, puisque Swing utilise le charset UTF-8 de Java).

    P.S. Désolé pour getContentFrame => getContentPane : j'ai écrit ça comme ça, sans tester

  10. #10
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Super, c'est tout bon maintenant !

    Merci chef !

    Et bon we

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

Discussions similaires

  1. N'arrive pas à afficher les comptes
    Par djolah13 dans le forum Langage
    Réponses: 16
    Dernier message: 30/06/2011, 10h39
  2. je n'arrive pas à afficher les valeurs de $_FILES[]
    Par totoAussi dans le forum Langage
    Réponses: 5
    Dernier message: 13/03/2009, 18h07
  3. Je n'arrive pas à afficher les numéro de ligne
    Par erehcab dans le forum Eclipse PHP
    Réponses: 1
    Dernier message: 01/10/2007, 11h59
  4. [TP] Je n'arrive pas à afficher les caractères [ { etc
    Par oliv314 dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 08/12/2006, 19h48

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