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 Delphi Discussion :

XML et UTF-8


Sujet :

Langage Delphi

  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 711
    Points : 5 333
    Points
    5 333
    Par défaut XML et UTF-8
    Bonjour,

    Je cherche à encoder un document XML en UTF-8.
    J'ai passé la propriété Encoding de mon TXMLDocument à '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
    XMLDoc := TXMLDocument.Create(nil);
    with XMLDoc do
    begin
        Active := False;
        FileName := '';
        Active := True;
        Version := '1.0';
        Encoding := 'UTF-8';
     
        Bla bla
     
        SaveToFile('C:/Test.xml');
    end;
    Cependant lorsque je l'ouvre avec Notepad++, l'encodage est en ANSI.

    Le but de la manoeuvre est de passer une chaine XML a un WebService.
    Au départ j'avais essayé de le passer via un stream grace au code suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Stream := TStringStream.Create('');
    XMLDoc.SaveToStream(Stream);
    Et ensuite je passais la chaine contenu dans Stream.DataString au WebService. Mais ça ne fonctionnais pas.

    La solution qui semble fonctionner même si elle ne me plait pas est d'enregistrer le fichier XML puis d'envoyer son contenu au webservice. ça passe très bien si le fichier est encodé en UTF-8. Ce qui m'oblige à ouvrir le fichier XML avec Notepad++, de passer l'encode à UTF-8 et d'enregistrer avant de pouvoir envoyer son contenu au webservice.

    Donc je cherche à obtenir le bon encode sans passer par cette étape manuelle.
    J'ai lu qu'il suffisait de définir la propriété Encoding correctement pour que ça marche mais apparement ce n'est pas le cas. Je me retrouve avec un fichier XML avec cet en-tête : <?xml version="1.0" encoding="UTF-8"?> mais il est encodé en ANSI.

    Quelqu'un a t'il une solution ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Tu peux accéder à la propriété XML.Text pour avoir une chaine !
    Pour l'encodage, je te confirme, il est capricieux !
    Je me demande, si j'encodais pas mes chaines avec UTF8Encode ? Non ça c'est quand je modifiais le fichier manuellement sans XMLDoc !

    Je sais que j'ai souvent triché en forçant du latin-1 ou window-1252 et d'avoir modifié à l'arrache le contenu de mes XML et SOAP (pour ajouter les balises manquantes que ne connais pas D7)

    Dans les Delphi récents, tu as un type XML remotable pour les WebService via THTTPRIO et les interfaces remotables

    Pense à mettre un owner à ton TXMLDocument, tu auras sinon une belle erreur à la libération ou sinon tu appeles explicitement ClearDocumentRef avec le Free
    D'ailleurs le TXMLDocument avec Owner est plus stable dans sa gestion des références de ses interfaces qu'avec nil !

    Je me rappelle avoir envoyer du XML à un WebService, je suis passé par un TClientDataSet, je devais juste envoyer une ligne, je récupérais la seule ROW du XML, l'encodage était nickel !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Appelle la méthode suivante sur ton IXMLDOMDocument avant de l'enregistrer :
    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
    {*
      Crée le header XML pour un document XML s'il n'est pas déjà présent
      @param Document   Document pour lequel créer le header
    *}
    procedure CreateXMLHeaderIfNotExists(const Document: IXMLDOMDocument);
    const
      XMLHeaderTarget = 'xml';
      XMLHeaderData = 'version="1.0" encoding="UTF-8"';
    begin
      if not Supports(Document.childNodes[0], IXMLDOMProcessingInstruction) then
      begin
        Document.insertBefore(
          Document.createProcessingInstruction(XMLHeaderTarget, XMLHeaderData),
          Document.childNodes[0]);
      end;
    end;
    Ca va assurer l'enregistrement en UTF-8.

    Tu peux aussi trouver une série de fonctions pratiques pour travailler avec des IXMLDOMDocument dans mon unité ScXML.pas.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 711
    Points : 5 333
    Points
    5 333
    Par défaut
    Le problème est interne en fait. L'entreprise pour laquelle je travaille a redéfini le SOAP. J'ai contourné le problème en créé une appli qui ne contient pas les paquet SOAP de mon entreprise et je la lance via creatprocess

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

Discussions similaires

  1. ecrire un fichier xml encodage UTF-8
    Par totoche dans le forum Langage
    Réponses: 4
    Dernier message: 09/10/2009, 17h07
  2. [BOM] Supprimer le BOM d'un xml en UTF-8
    Par kij dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 22/11/2007, 11h46
  3. instruction pour xml Encoder utf-8
    Par totoche dans le forum ASP
    Réponses: 7
    Dernier message: 14/02/2007, 11h03
  4. Cobol , XML et UTF-8
    Par unknownuser dans le forum Cobol
    Réponses: 3
    Dernier message: 26/11/2006, 21h29
  5. [File][UTF-16]comment creer un fichier xml en utf-16?
    Par Invité dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/01/2006, 15h40

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