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

Format d'échange (XML, JSON...) Java Discussion :

Probleme UTF-8 java, fichier xml


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Par défaut Probleme UTF-8 java, fichier xml
    Bonjour,
    Notre application travail avec des fichiers xml, et recemment on a trouver que 20 d'entre eux ne s'affichait pas correctement dans IE ou Firefox a cause d'un mauvais format d'encodage, apparu a cause de l'apparition du symbole £ dans le fichier xml.

    Dans le header du fichier xml, on specifie clairement UTF-8, mais apres quelques recherches j'ai cru comprendre que cela ne signifie que le format ou le document doit etre encoder, on peut tres bien ecrire UTF-8 mais avoir un document encoder d'une autre facon.

    Donc je dois trouver dans notre code le moment ou le fichier xml s'encode de la mauvaise facon, je suis partit a la source, et il s'agit de code c++ comminuquant avec notre application via JNI (Arretez moi si je dis des beties ) , le code C++ va chercher le xml dans une base de donnees et l'envoi a notre application java.

    J'ai donc juste modifier le code C++ pour qu'il ecrive dans un fichier log le code qu'il nous envoi pour voir si le xml qu'on recoit est au depart au bon format, et il semblerait que oui, car il y a un charactere special avant le £ :


    E, 45
    C, 43
    Â, ffffffc2
    £, ffffffa3
    5, 35
    0, 30

    Ce code nous envoi la string grace a la methode NewStringUTF d' un objet de type JNIEnv.

    Neanmoins, dans java, lorsque l'on recuperer cette String,je fais directement un println sur cette String, et le caractere speciale n'est plus la !

    EC£50

    Meme en mode debug et en regardant le tableau de la string je ne le vois pas.


    Es-ce que je loupe quelque chose d'evident ? Je n'ai pas vraiment de grosses connaissances sur l'encodage de fichier, et je peux lire dans la doc de String qu'il utilise UTF-16 si je comprends bien ?
    > A String represents a string in the UTF-16 format in which supplementary characters are represented by surrogate pairs (see the section Unicode Character Representations in the Character class for more information).

    On a vraiment besoin d'ecrire le XML encode en UTF-8, savez vous comment s'y prendre ? Merci !

  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
    Citation Envoyé par fardon57 Voir le message
    Dans le header du fichier xml, on specifie clairement UTF-8, mais apres quelques recherches j'ai cru comprendre que cela ne signifie que le format ou le document doit etre encoder, on peut tres bien ecrire UTF-8 mais avoir un document encoder d'une autre facon.
    Je confirme qu'il ne faut pas le faire, mais que c'est évidemment possible. De la même manière, rien n'empêche de poser une étiquette "haricots" sur un bocal à cornichons, mais les enfants qui passent par là croiront pendant des années qu'un cornichon s'appelle un haricot.

    Je n'ai pas vraiment de grosses connaissances sur l'encodage de fichier, et je peux lire dans la doc de String qu'il utilise UTF-16 si je comprends bien ?
    > A String represents a string in the UTF-16 format in which supplementary characters are represented by surrogate pairs (see the section Unicode Character Representations in the Character class for more information).
    Oui, c'est exact, mais il faut bien comprendre que ce que Java utilise en interne pour stocker ses String ne te concerne pas.
    Il utilise un moyen qui lui permet de stocker tout Unicode, donc il peut stocker de l'Unicode. C'est tout ce qu'il y a à savoir, du moins dans ton cas.



    Bon, sinon : en ce qui me concerne je ne t'avais pas répondu car il y avait quelque chose que je trouvais incohérent dans tes résultats. Mais comme personne ne semble répondre, j'ai essayé de reproduire tes résultats et j'ai été bluffé : en fait il n'y a aucune incohérence, juste un fait rare.

    Mais bref. J'ai besoin de plus d'informations.

    En quoi  est-il un caractère spécial ?

    Quelle information votre fichier XML doit-il contenir, au juste ? Le texte de ce fichier XML, est-ce que ça doit être "EC£50" ou bien "EC£50" ?

    J'explique : quand on transforme la chaîne "EC£50" en octets, voici ce qu'on obtient :

    En UTF-8 :

    E: 0x45 ;
    C: 0x43 ;
    £: 0xc2 ; 0xa3
    5: 0x35 ;
    0: 0x30

    En latin-1 :

    E: 0x45 ;
    C: 0x43 ;
    £: 0xa3 ;
    5: 0x35 ;
    0: 0x30

    C'est super bizarre, mais en UTF-8, £ se code exactement comme en latin-1, avec juste un octet devant. Je n'avais jamais remarqué que ça pouvait arriver.

    Du coup, en utf-8, il n'y a pas de "charactère spécial Â" devant le £. £ se représente avec deux octets : 0xc2 ; 0xa3 et il se trouve qu'en latin-1, 0xc2 est Â, et 0xa3 est £.
    Ce "caractère spécial" n'est a priori pas à afficher, et il semble qu'il n'y ait aucun problème.

    Il faudrait que tu vérifies.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Je confirme qu'il ne faut pas le faire, mais que c'est évidemment possible. De la même manière, rien n'empêche de poser une étiquette "haricots" sur un bocal à cornichons, mais les enfants qui passent par là croiront pendant des années qu'un cornichon s'appelle un haricot.



    Oui, c'est exact, mais il faut bien comprendre que ce que Java utilise en interne pour stocker ses String ne te concerne pas.
    Il utilise un moyen qui lui permet de stocker tout Unicode, donc il peut stocker de l'Unicode. C'est tout ce qu'il y a à savoir, du moins dans ton cas.



    Bon, sinon : en ce qui me concerne je ne t'avais pas répondu car il y avait quelque chose que je trouvais incohérent dans tes résultats. Mais comme personne ne semble répondre, j'ai essayé de reproduire tes résultats et j'ai été bluffé : en fait il n'y a aucune incohérence, juste un fait rare.

    Mais bref. J'ai besoin de plus d'informations.

    En quoi  est-il un caractère spécial ?

    Quelle information votre fichier XML doit-il contenir, au juste ? Le texte de ce fichier XML, est-ce que ça doit être "EC£50" ou bien "EC£50" ?

    J'explique : quand on transforme la chaîne "EC£50" en octets, voici ce qu'on obtient :

    En UTF-8 :

    E: 0x45 ;
    C: 0x43 ;
    £: 0xc2 ; 0xa3
    5: 0x35 ;
    0: 0x30

    En latin-1 :

    E: 0x45 ;
    C: 0x43 ;
    £: 0xa3 ;
    5: 0x35 ;
    0: 0x30

    C'est super bizarre, mais en UTF-8, £ se code exactement comme en latin-1, avec juste un octet devant. Je n'avais jamais remarqué que ça pouvait arriver.

    Du coup, en utf-8, il n'y a pas de "charactère spécial Â" devant le £. £ se représente avec deux octets : 0xc2 ; 0xa3 et il se trouve qu'en latin-1, 0xc2 est Â, et 0xa3 est £.
    Ce "caractère spécial" n'est a priori pas à afficher, et il semble qu'il n'y ait aucun problème.

    Il faudrait que tu vérifies.
    Merci pour ton aide, c'est beaucoup mieux que de ne pas repondre !

    La chaine qu'on cherche a obtenir, c'est effectivement "EC£50" en UTF-8. Je parlais du caractere special Â, car justement c'est la facon de le coder en UTF-8 : 0xC2; 0xA3 ... Alors quand je fais un print du cote du code C++ juste avant d'envoyer le xml, je vois bien le texte en UTF-8, lorsque je fais en suite un println du coter java sur la String qui recoit le resultat, je ne vois que "£" et rien devant, donc sa devient incorrect pour de l'UTF-8 ...

    Je pense qu'il y a bien un probleme, car les browser refusent d'afficher notre fichier XML car illisible, et lorsque que je l'enregistre sur mon bureau et le save en UTF-8 a partir d'un software, il se lit correctement sous IE et firefox ...

    De plus, une fois sauvegarder en UTF-8, lorsque je compare les 2 fichiers XML avec un logiciel hexadecimal je vois bien le caractere special avant le £ pour le fichier qui fonctionne, et rien pour l'autre ... Je vais essayer de vous sortir une image

  4. #4
    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 fardon57 Voir le message
    La chaine qu'on cherche a obtenir, c'est effectivement "EC£50" en UTF-8. Je parlais du caractere special Â, car justement c'est la facon de le coder en UTF-8 : 0xC2; 0xA3 ... Alors quand je fais un print du cote du code C++ juste avant d'envoyer le xml, je vois bien le texte en UTF-8, lorsque je fais en suite un println du coter java sur la String qui recoit le resultat, je ne vois que "£" et rien devant, donc sa devient incorrect pour de l'UTF-8 ...
    Bah non, c'est correct. Tu stockes la chaîne "EC£50" dans un String. Donc à l'affichage, ça met "EC£50". Il n'y a aucun problème. String n'a rien à péter des encodages.

    Je pense qu'il y a bien un probleme, car les browser refusent d'afficher notre fichier XML car illisible, et lorsque que je l'enregistre sur mon bureau et le save en UTF-8 a partir d'un software, il se lit correctement sous IE et firefox ...
    Ça pourrait être un autre problème.

    En fait, c'est probablement un autre problème. Un soucis d'encodage empêche rarement la page de s'afficher, et ce cas précis ne l'empêcherait probablement pas du tout. Exception : si la page passe par une phase de validation avant transformation XSLT par exemple, et que la validation vérifie la présence du code exact.

    De plus, une fois sauvegarder en UTF-8, lorsque je compare les 2 fichiers XML avec un logiciel hexadecimal je vois bien le caractere special avant le £ pour le fichier qui fonctionne, et rien pour l'autre ... Je vais essayer de vous sortir une image
    Le soucis est peut-être au moment de l'encodage du fichier envoyé au navigateur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre actif
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Bah non, c'est correct. Tu stockes la chaîne "EC£50" dans un String. Donc à l'affichage, ça met "EC£50". Il n'y a aucun problème. String n'a rien à péter des encodages.



    Ça pourrait être un autre problème.

    En fait, c'est probablement un autre problème. Un soucis d'encodage empêche rarement la page de s'afficher, et ce cas précis ne l'empêcherait probablement pas du tout. Exception : si la page passe par une phase de validation avant transformation XSLT par exemple, et que la validation vérifie la présence du code exact.



    Le soucis est peut-être au moment de l'encodage du fichier envoyé au navigateur.
    Interessant. Oui en effet, j'y ai repenser apres coup, c'est un peu idiot de ma part de m'attendre a retrouver ce caractere dans la String ... Mais que voulez vous, c'est les erreurs de debutant .

    Comme tu l'as dit, c'est un autre probleme ! Je pense avoir trouver, lorsque la VM se lance, elle a un file.encoding par defaut, ce que je ne savais pas (Visiblement personne impliquer dans notre application non plus ... Et cette valeur est par defaut Cp1252 ! Donc j'ai juste modifier cette valeur par -Dfile.encoding=UTF-8 . Maintenant ca a l'air de fonctionner !

    Merci, je vous tiens au courant si cela marche lorsque notre application tourne reelement.

  6. #6
    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
    Une solution préférable serait de préciser l'encodage à utiliser à chaque fois qu'il y a besoin d'encoder/décoder un fichier texte.

    Des fois ce sera utf-8, des fois ce sera latin-1. On ne peut pas changer l'encodage par défaut à chaque fois, et puis le faire sans se poser de question risque de créer des bugs.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Citation Envoyé par fardon57 Voir le message
    car il y a un charactere special avant le £ :
    Ce n'est pas un caractère spécial.
    C'est simplement qu'en UTF8 certains caractères sont encodés sur 2 octets...


    Ton erreur sur le XML vient du fait que tu utilises un encodage incorrect à un moment donné qui va aboutir à une valeur incorrect.

    Pour plus d'info il nous faudrait avoir les portions de code qui contiennent les "communications" entre ton programme et l'extérieur. En clair :
    • Comment tu récupères ta chaine ?
    • Comment tu écris dans le fichier ?


    D'après tes commentaires, c'est ce dernier point qui semble poser problème (puisque la chaine semble correct lorsque tu l'affiches via un println...

    a++

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

Discussions similaires

  1. [DOM] probleme de fermeture de fichier xml apres modification
    Par bibi73 dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 08/04/2008, 16h13
  2. [SimpleXML] probleme pour parser un fichier XML
    Par gilles974 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 27/03/2008, 10h01
  3. [DOM] Encodage UTF-8 dans fichier XML et PHP
    Par norkius dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 03/01/2007, 15h44
  4. [XSLT] probleme de parcourt deux fichiers xml dans xsl
    Par coucouA dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 23/07/2006, 20h32

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