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 :

Windows et Mac ne s'entendent pas sur l'UTF-8 ! En tout cas cela m'en a tout l'air


Sujet :

Langage Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Par défaut Windows et Mac ne s'entendent pas sur l'UTF-8 ! En tout cas cela m'en a tout l'air
    Bonjour,
    Je souhaite lire une page web encoder en utf-8 et récolter sur cette dernière les informations souhaitées. Sur windows, c’est sur cet os que j’ai développé, cela fonctionne parfaitement par contre j’ai testé sur mac et là notamment les é sont sucrés, pas sympa du tout !

    J’effectue l’opération de lecture de la page web de la manière suivante :

    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
     
     
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);		       
     
    InputStreamReader iSRpageWeb = new InputStreamReader(conn.getInputStream(), "UTF-8");
     
    javax.swing.JOptionPane.showMessageDialog(null,"getContentEncoding : " + conn.getContentEncoding());
     
    //lecture de la réponse
    reader = new BufferedReader(iSRpageWeb);
     
    String ligne = "";
     
    while ((ligne = reader.readLine()) != null) {
           pageRetourneParMorphalou.append(ligne); 
           javax.swing.JOptionPane.showMessageDialog(null,"ligne : " +  ligne);
    }
    ensuite je cherche l’information souhaitée (mot) dans pageRetourne.
    Et si les mots n’ont pas de caractères spéciaux ils se trouvent bien dans pageRetourne et peux les extraire. Par contre s’il en a avec par exemple prénom (je sais que la page web contient ce mot) il n’existe pas dans pageRetourne, mais je trouve prnom !

    Ce que j’ai fait :
    1)Dans le head du code de la page Web il est écrit :charset=utf-8
    2)Dans Windows Internet Explorer, le codage indiqué est Unicode (UTF-8)
    3)Par contre, conn.getContentEncoding() est égale à null
    4)En affichant la ligne, j’ai été surpris que pour prénom on trouve prnom et que le é ne soit pas remplacé par un caractère bizarre comme attendu s’il y a un mauvais codage !

    Je dois l’avouer suis dans le noir car j’ai pas idée de quoi cela peut venir alors s’il pouvait y avoir des lumières, merci !

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


    Les lignes sont bien affiché dans les JOptionPane ????
    C'est quoi pageRetourneParMorphalou ????


    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Par défaut
    pageRetourneParMorphalou c'est un StringBuffer.

    Les lignes sont bien affiché dans les JOptionPane ????
    Non, je les ai mis pour voir ce qu'il y a dans pageRetourneParMorphalou.

  4. #4
    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 bien un problème à la lecture, ce qui signifie que le flux ne doti pas être en UTF-8...

    Pour vérifier le charset indiqué par le serveur web, il faut utiliser getContentType() et non pas getContentEncoding(). Ce dernier indique une éventuelle méthode de compression (gzip par exemple) et non pas l'encodage des caractères.


    Sinon si tu pouvais indiquer l'URL ce serait plus pratique...


    a++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Par défaut
    le getContentType() donne text/html; charset=utf-8 .....

    Merci de m'aider

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Par défaut
    Je ne sais plus si je me mords la queue mais j'ai essayé de réecrire la page Web reçu dans un fichier codé en UTF-8. Afin de voir si le codage est bien de l'UTF-8.

    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
     
    OutputStreamWriter out;
    InputStreamReader iSRpageWeb;
     
    URL url = new URL(adresse);
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);
     
    iSRpageWeb = new InputStreamReader(conn.getInputStream(), "UTF-8");
     
    FileOutputStream fos = new FileOutputStream("PageWeb.txt");
    out = new OutputStreamWriter(fos, "UTF8");
     
    int c;
    while ((c = iSRpageWeb.read()) != -1) out.write(c);
     
    iSRpageWeb.close();
    out.close();
    Je regarde sur notepad++, c'est bien un encodage UTF-8 et il y a les accents !!!!

    Il est à noter que j'ai fait cela sur PC et pas sur MAC (même remarque que pour le getContentType() donne text/html; charset=utf-8 ).
    Mais cela ne devrait pas changer, ou bien ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Par défaut
    en faite, j'ai l'impression de m'écrire parmi ...
    Aujourd'hui, je suis allé sur un mac et le getContentType() donne également text/html; charset=utf-8.
    Et le fichier PageWeb.txt (voir ci-dessous dans le code) lu sur notepad++ (windows) les accents ne sont pas présents contrairement à si je tourne l'appli sur windows les accents dans le fichier sont bien là !!!

    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
     
    URL url = new URL(adresse);
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);
     
    iSRpageWeb = new InputStreamReader(conn.getInputStream(), "UTF-8");
     
    FileOutputStream fos = new FileOutputStream("PageWeb.txt");
    out = new OutputStreamWriter(fos, "UTF8");
     
    int c;
    while ((c = iSRpageWeb.read()) != -1) out.write(c);
     
    iSRpageWeb.close();
    out.close();
    Donc, sur mac et sur windows le codage UTF-8 n'est pas le même !!
    C'est la catastrophe assuré !
    Je rigole mais jaune car il est vrai je ne comprends plus rien !

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 593
    Par défaut
    J'ai pas de Mac sous la main pour vérifier, mais ça donne plutôt l'impression qu'il y a un bug dans la JVM Mac, peut-être dans le codage ou le décodage de l'UTF-8, mais lequel alors ça !

    Toujours est-il qu'on t'a demandé l'URL vers ce fichier pour tester nous-même, et on attend toujours.
    Par exemple, il est possible que le codage UTF-8 de ton fichier soit invalide, et que la version de ta JVM sous Windows soit ancienne et ne rejette pas ces invalidités (ce qui est considéré comme un bug qui a été résolu depuis,) alors que la JVM sous Mac le ferait (et dans ce cas ce serait un bug de ne pas mettre un ? à la place du caractère invalide), par exemple. À noter que Notepad++, et de nombreux outils de ce genre, ne rejettent pas ces invalidités.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    le mieux serait que,
    sur la machine qui fonctionne et sur la machine qui déconne, tu met ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    URL url = new URL(adresse);
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);      		      
    FileOutputStream fos = new FileOutputStream("PageWeb.txt");
     IOUtils.copy(conn.getInputStream(),fos);
    Tu trouvera IOUtils sur commons-io de apache, ca copie un stream dans l'autre.

    Une fois ça fait, tu poste les deux fichier sur le forum en attachement, et on verra déjà si la source est correcte.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Par défaut
    Merci de m'avoir indiqué une manière de prendre la page web sans la decode et encode par la suite. Je m'en vais aller chercher les fichiers mais le mac est enfermé (il semble que l'on peut pas les laisser en liberté !) jusqu'à lundi ....
    Bonne fin de semaine

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Par défaut
    les voilà (les fichiers) !
    je les ai enlevés mais les remettrais au cas où cela est nécessiare.

  12. #12
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 968
    Par défaut
    a. le problème n'est que sur les É qui sont C2 8E dans votre fichier "Mac" au lieu de C3 89 comme attendu, les é sont corrects dans les 2 fichiers.

    Après avoir mis vos pages sur un serveur :

    b. le fichier généré sur Mac à partir du fichier HTML correct est aussi correct : le mystère s'épaissit donc un peu plus : plus de précision sur les versions OS et JVM sont donc nécessaires, car à ce stade-ci le problème n'est pas reproductible.

  13. #13
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    si vous mettez le fichier correct (windows) sur un petit serveur apache, et que vous accédez à ce fichier depuis le mac, il est à nouveau corrompu? Si, depuis le mac, vous faites un "wget" en console sur l'url ou se trouve le fichier, il est correct celui là?


    Edit:

    En fait, ce ne sont pas les É qui sont cassés sur la version mac. Ce sont à peu près toutes les variantes de é qui semblent venir de la query soumisse. C'est donc, a priori pour moi, pas un problème de décodage de la réponse, mais un problème d'encodage de la query. Un peu comme si le serveur attendait une query dans un encodage particulier et que, sous le mac, vous utilisiez un autre. Regardez où ça rate:
    version windows
    <title>PRÉNOM : Morphologie de PRÉNOM</title>
    <td colspan="2"><input type="text" size="48" id="query" value="prénom" title="Saisir une forme" /></td>
    <td class="small_menu_font">catégorie : <select id="category"><option value="">toutes</option>
    version mac
    <title>PRŽNOM : Morphologie de PRŽNOM</title>
    <td colspan="2"><input type="text" size="48" id="query" value="prŽnom" title="Saisir une forme" /></td>
    <td class="small_menu_font">catégorie : <select id="category"><option value="">toutes</option>
    on a C28E en mac, alors qu'on a C3A9 (É) sous windows
    pareil pour la majuscule: C28E contre C389 (é)
    Par contre, le texte "catégorie" qui ne proviens pas de la query est, lui, correct.

    Pour moi, c'est donc clairement la query ("prénom") envoyée vers le serveur qui est mal encodée lors de votre envoi. Pourriez vous poster le code qui fait l'envoi?

  14. #14
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 968
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    si vous mettez le fichier correct (windows) sur un petit serveur apache, et que vous accédez à ce fichier depuis le mac, il est à nouveau corrompu? Si, depuis le mac, vous faites un "wget" en console sur l'url ou se trouve le fichier, il est correct celui là?


    Edit:

    En fait, ce ne sont pas les É qui sont cassés sur la version mac. Ce sont à peu près toutes les variantes de é qui semblent venir de la query soumisse. C'est donc, a priori pour moi, pas un problème de décodage de la réponse, mais un problème d'encodage de la query. Un peu comme si le serveur attendait une query dans un encodage particulier et que, sous le mac, vous utilisiez un autre. Regardez où ça rate:
    version windows

    version mac

    on a C28E en mac, alors qu'on a C3A9 (É) sous windows
    pareil pour la majuscule: C28E contre C389 (é)
    Par contre, le texte "catégorie" qui ne proviens pas de la query est, lui, correct.

    Pour moi, c'est donc clairement la query ("prénom") envoyée vers le serveur qui est mal encodée lors de votre envoi. Pourriez vous poster le code qui fait l'envoi?
    on s'approche : en fait le seul é minuscule corrompu qui ne vienne pas a priori de la réponse est celui de la <form id="reqform"> :
    <input type="text" size="48" id="query" value="prŽnom" title="Saisir une forme" />

    les autres é sont corrects : "catégorie : ", "avenue de la Libération", etc…

    comment est-ce que la page Web est générée ?
    si par exemple vous utilisez des templates, il suffirait d'une erreur d'encodage dans un des fichiers templates pour provoquer des problèmes… et ici on soupçonnerait celui qui contient le <form id="reqform">.
    d'autre part on voit un Javascript sendRequest() : on n'a pas la source donc on ne peut en juger… une erreur dans le code ou éventuellement dans l'encodage du fichier pourrait aussi avoir des conséquences.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Par défaut
    Merci !
    Mais je fais super simple, donc peu-être faux ... :

    String motARechercher = vient d'un JTextArea ;
    ...
    String adresse = nomdusite + "/" + motARechercher
    ...
    URL url = new URL(adresse);
    URLConnection conn = url.openConnection;
    conn.setDoOutput(true);


    ...
    Encore merci de passer du temps et à plus je l'espère.

  16. #16
    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
    Le problème vient de ton URL qui est mal-formé. Une URL ne doit pas contenir de caractères spéciaux comme les accents ou autres...

    Tout ce qui vient d'une saisie utilisateur doit être encodé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String adresse = nomdusite + "/" + URLEncoder.encode(motARechercher, "utf8");
    a++

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Par défaut
    Il me semble que j'ai l'air con ....
    Je vous redis demain si c'est pas ok car j'aurai alors essayé sur un mac.
    Mais il est très vraisemblable que je peux déjà vous souhaiter de joyeuses fêtes et vous REMERCIER très sincérement de votre aide car sans vous, serais encore à (h)urler contre les macs !

  18. #18
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par vert Voir le message
    sans vous, serais encore à (h)urler contre les macs !
    faut pas hurler contre les macs, il y en a du coté de la gare qui un joli assortiment en stock

Discussions similaires

  1. window.close(); fonctionne en local mais pas sur le serveur
    Par mickey2705 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/06/2014, 08h32
  2. [XL-MAC 2011] Accents sur mac ne se lisent pas sur windows
    Par xavion dans le forum Excel
    Réponses: 2
    Dernier message: 01/03/2013, 10h30
  3. Le son ne s'entend pas sur un autre ordinateur
    Par Claude_Azoulai dans le forum Powerpoint
    Réponses: 11
    Dernier message: 16/03/2009, 18h40
  4. [Mac] Lien ne fonctionnant pas mais ok sous Windows
    Par bractar dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 26/01/2006, 18h38
  5. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08

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