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 :

Encodage/Decodage UTF-8 de données XML


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 9
    Par défaut Encodage/Decodage UTF-8 de données XML
    Bonjour à tous,

    Mon application reçoit des données XML signées (XMLDSig) et comportant des caractères accentués, de plusieurs sources différentes et son comportement lors de la vérification de la signature varie selon ces sources (bien entendu, s'il n'y a aucun caractère accentué, tout va bien ). Je m'explique :

    Premier cas : les données XML sont fournies par une application externe C++ , m'assurant (mais je n'ai pas vu le code) que la chaine de caractères est encodée UTF-8, cette dernière étant construite à la volée. Si je veux que la vérification de signature fonctionne (calcul du digest, etc.), la chaine de caractères en entrée du Verifier doit être obtenue à partir de l'originale via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xml_utf8 = new String(xml.getBytes(), "UTF-8");
    Second cas : les données XML sont fournies par un client JAVA lisant un fichier XML depuis le disque (OS : Windows XP) grâce à (merci commons-io) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textMsg = FileUtils.readFileToString(unFichier, "UTF-8");
    Si je veux que la verification soit OK, alors je dois construire ma chaine comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xml_utf8 = new String(xml.getBytes("UTF-8"), "UTF-8");
    ou
    xml_iso-8859-15 = new String(xml.getBytes(), "ISO-8859-15");
    Mon fichier XML en entrée semble être encodé UTF-8 :
    - Notepad++ l'indique dans son menu 'Format' ;
    - UltraEdit indique en hexa que mes caractères accentués sont ceux attendus en UTF-8 hex, soit C3A9 pour é par exemple. De plus, il m'indique que le Byte Order Mark (BOM) au commencement du fichier est celui attendu : EF BB BF (cf. http://www.w3.org/TR/2004/REC-xml-20...ng-no-ext-info)

    Il y a surement une étape que je fais mal et qui introduit un peu d'ISO mais je ne vois pas comment la découvrir
    Quelqu'un peut-il m'aider ?

    D'avance merci
    Ticker

  2. #2
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Tiens, pourquoi n'utilises-tu pas un parsing XML à base de DOM ou SAX ? Il suffit de préciser d'entrée de jeu l'encoding du fichier s'il n'est pas détecté automatiquement ou bien si tu veux le forcer. Evite de manipuler un XML sous la forme d'une String.
    Ensuite, ben il n'y a plus rien à faire. Si le fichier est mal encodé, tu auras une exception relative à l'encoding lors du parsing.

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

    Ceci est une aberration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xml_utf8 = new String(xml.getBytes(), "UTF-8");
    En Java une String est TOUJOURS encodé en UTF-16 en interne, et les conversions ne doivent avoir lieu que lors des entrée/sorties (dans un fichier par exemple)

    Et comme getBytes() utilises l'encodage par défaut, il est probable que tu transformes une String en un encodage différents d'UTF-8 pour l'interpréter ensuite en UTF-8


    Bref : il faut spécifier l'encodage uniquement lors de la lecture/écriture...

    a++

  4. #4
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 9
    Par défaut
    Citation Envoyé par djsnipe Voir le message
    Tiens, pourquoi n'utilises-tu pas un parsing XML à base de DOM ou SAX ?
    Tout simplement pour des questions de vitesse et d'encombrement mémoire : je reçois une chaine de caractères que je vais transformer en objets JAVA via Castor après avoir déchiffré (XMLEnc) et vérifié (XMLDSig). L'étape DOM me semble de trop, mais si c'est le seul moyen de contrôler l'encodage...

    Citation Envoyé par adiGuba Voir le message
    En Java une String est TOUJOURS encodé en UTF-16 en interne, et les conversions ne doivent avoir lieu que lors des entrée/sorties (dans un fichier par exemple).

    Et comme getBytes() utilises l'encodage par défaut, il est probable que tu transformes une String en un encodage différents d'UTF-8 pour l'interpréter ensuite en UTF-8
    J'entends bien, mais il s'agit d'une chaine de caractères UTF-8 envoyée via WebServices depuis une application C++. L'aberration dont tu parles est le seul moyen pour que cette chaine qui n'a pas été modifiée par une source extérieure, donne le même Digest que celui calculé par l'appli C++
    Par contre, effectivement, avec un client JAVA lisant un fichier sur le disque, pas besoin de quoi que ce soit pour une vérification OK, je peux verifier directement la chaine fournie...

    J'aimerais bien savoir comment faire fonctionner les deux en même temps

    Ticker

  5. #5
    Membre Expert
    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
    Par défaut
    Comment accèdes-tu aux données transmises par le C++ ?

  6. #6
    Membre Expert
    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
    Par défaut
    Citation Envoyé par dingoth Voir le message
    Comment accèdes-tu aux données transmises par le C++ ?
    Désolé d'insister, mais je crois que le coeur du problème réside là. Pourrais-tu répondre ?

  7. #7
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 9
    Par défaut
    Désolé dingoth !

    En fait, l'appli C++ m'envoie une chaine de caractères théoriquement UTF-8 via WebServices sur mon appli JAVA. Il semblerait que le framework utilisé pour la génération des classes soit gSOAP...

  8. #8
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Citation Envoyé par TickerOpcvm Voir le message
    Tout simplement pour des questions de vitesse et d'encombrement mémoire : je reçois une chaine de caractères que je vais transformer en objets JAVA via Castor après avoir déchiffré (XMLEnc) et vérifié (XMLDSig). L'étape DOM me semble de trop, mais si c'est le seul moyen de contrôler l'encodage...
    Ouf, tu utilises Castor, donc SAX qui je me souviens bien. Mais ce qui me semble étonnant c'est de passer par l'étape String. Le WebService renvoi un XML, pas directement une String, soit attaché au flux de transport, soit dans un fichier attaché. C'est directement ce flux qu'il faut utiliser et éviter si possible de tout convertir en String puis en objets Java, ce qui est de mon point de vue inutile. Mais je ne connais pas XMLEnc et XMLDSig ni leur intégration à un processus unique de parsing XML -> Java.

  9. #9
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 9
    Par défaut
    Citation Envoyé par djsnipe Voir le message
    Ouf, tu utilises Castor, donc SAX qui je me souviens bien. Mais ce qui me semble étonnant c'est de passer par l'étape String. Le WebService renvoi un XML, pas directement une String, soit attaché au flux de transport, soit dans un fichier attaché. C'est directement ce flux qu'il faut utiliser et éviter si possible de tout convertir en String puis en objets Java, ce qui est de mon point de vue inutile. Mais je ne connais pas XMLEnc et XMLDSig ni leur intégration à un processus unique de parsing XML -> Java.
    En fait, j'ai de fortes contraintes de performances et j'ai fait au plus simple/rapide : manipuler des String pour les étapes de signature/chiffrement me fait gagner du temps. Surtout que j'ai reecrit ces dernieres pour gagner en vitesse. Par conséquent, le service exposé prend String en paramètre et non pas Document. Ce probleme de caractères accentués va peut-etre me contraindre a modifier cela, mais je dois faire des benchs avant tout.

    D'autre part, ce qui m'intéresse, ce sont les données transportées et pas la structure du XML en lui-même. Je dois pouvoir accepter une multitude de schémas différents transportant les mêmes données pour les diriger vers le même traitement. En cela, Castor et son mapping facilitent les choses Je suis donc content avec mes String (sans jeu de mot)...

Discussions similaires

  1. [Mysql] Donnée XML >vers> BDD
    Par largiss dans le forum XQUERY/SGBD
    Réponses: 14
    Dernier message: 28/02/2017, 17h51
  2. [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
  3. Où est l'Expert Liaison de données XML [BCB6]
    Par Colloc dans le forum C++Builder
    Réponses: 3
    Dernier message: 21/02/2005, 14h33
  4. [xml]manipuler des données xml sous Oracle9i
    Par crazy dans le forum SQL
    Réponses: 7
    Dernier message: 28/02/2004, 11h40
  5. problème xsl : inclure une donnée xml dans une balise html
    Par djodjo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/01/2003, 09h24

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