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

Delphi Discussion :

Problème d'encodage d'un fichier xml


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 138
    Billets dans le blog
    5
    Par défaut Problème d'encodage d'un fichier xml
    Bonjour à tous

    Je suis en train de développer un utilitaire qui manipule des fichiers xml en utilisant un TXMLDocument et j'ai un soucis d'encodage.
    Dans mon fichier xml en entête j'ai ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <?xml version="1.0" encoding="UTF-8"?>
    Malheureusement je ne peux pas utiliser la fonction LoadFromFile() car il y a dans ce fichier des syntaxes XML qui sont rejeté par TXMLDocument du coup je suis obligé de faire comme ceci pour lire mon fichier

    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
     
    procedure TcotcotFrm.fic2XML(nomfic: string; var docx: TXMLDocument);
    var
      d: integer;
      ligne: String;
      fic: Text;
    begin
      docx.Active := false;
      docx.Xml.Clear;
      AssignFile(fic, nomfic);
      reset(fic);
      while not(eof(fic)) do
      begin
        readln(fic, ligne);    
        d := pos('<!DOCTYPE', ligne);//ligne posant problème
        if (d = 0) and (ligne <> '') then
          docx.Xml.Add(ligne);
      end;
      closefile(fic);
      docx.Active := true;
    end;
    Et malgré le fait que l'encodage soit précisé, j'ai des bizarreries dès que j'ai des accents et même des fois sur des caractères qui ne devrait pas poser de problème comme le caractère espace qui devient "Â " au lieu de " "

    J'ai aussi essayé de faire ça pour la lecture
    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
     
    procedure TcotcotFrm.fic2XML(nomfic: string; var docx: TXMLDocument);
    var
      i,d: integer;
      lignes: TStringList;
     
    begin
      docx.Active := false;
      docx.Xml.Clear;
      lignes:=TStringList.Create;
      lignes.LoadFromFile(nomfic,TEncoding.UTF8);
      for i:=0 to lignes.Count-1 do
      begin
     
        d := pos('<!DOCTYPE', lignes[i]);
        if (d = 0) and (lignes[i]<> '') then
          docx.Xml.Add(lignes[i]);
      end;
     
      docx.Active := true;
    end;
    mais là j'ai l'exception suivante: EConvertError Declared encoding does not match byte order mark même si j'utilise LoadFromFile sans préciser l'encodage.
    En fait ça ne fonctionne que si je supprime encoding="UTF-8" de l'entête xml. Mais si je fait ça j'ai mes bizarreries

    Du coup je me demandais s'il y avait un moyen de vérifier que mon fichier est bien en utf8 et si non comment corriger les problèmes

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    Le XML en fichier, il y a souvent une confusion
    Certains font en réalité un double encodage, c'est à dire que le fichier est en UTF8 avec BOM, le binaire est en UTF8 et par dessus, le contenu du XML est lui-même encodé en UTF8
    Alors que l'encodage XML suffit et que le fichier lui doit être en ANSI sans BOM
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    Ce n'est pas normal, DOCTYPE est géré par le DOM Microsoft, comme cet exemple.

    Ajoute ceci avant TXMLDocument.LoadFromFile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Doc.DOMVendor := GetDOMVendor(sAdom4XmlVendor);
    A lire : Utilisation du modèle DOM
    Cela permettra si cela vient du DOM Microsoft ou pas en utilisant une autre lib (cependant, je ne sais plus si c'est disponible par défaut ou si il faut installer OpenXML)
    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

  4. #4
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 138
    Billets dans le blog
    5
    Par défaut
    J'ai testé et il a pas aimé il m'a sorti une Hierarchy error
    J'ai testé avec OmniXML et il semble que ça fonctionne bien mieux. Je n'ai pas d'erreur avec le loadfromfile et l'encodage semble bon.
    Il faut que je vérifie si c'est toujours bon sous Mac

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    Attention les éditeurs de texte détecte l'UTF8 dans le XML donc pense que c'est un fichier UTF8
    Ce qui compte c'est si c'est indiqué UTF8 avec BOM !
    Bloc-notes par exemple indique UTF8 avec Nomenclature
    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

  6. #6
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 138
    Billets dans le blog
    5
    Par défaut
    A priori c'est sans BOM

  7. #7
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    je ne savais pas qu'on pouvait mettre un DOCTYPE dans un document XML...mais j'ai vu un exemple qui utilise un fichier DTD externe, est-ce que ton DOCTYPE fait référence à une fichier externe inexistant ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Problème d'encodage d'un fichier XML
    Par Faible37 dans le forum Shell et commandes POSIX
    Réponses: 24
    Dernier message: 19/07/2012, 17h55
  2. [XML] Problème d'encodage avec un fichier XML
    Par anto2b dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 04/12/2011, 13h58
  3. Réponses: 2
    Dernier message: 02/06/2010, 11h09
  4. Réponses: 2
    Dernier message: 01/06/2004, 12h47

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