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

Free Pascal Discussion :

Remplacer les caractères spéciaux d'un document HTML par les entités correspondantes [Free Pascal]


Sujet :

Free Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut Remplacer les caractères spéciaux d'un document HTML par les entités correspondantes
    Bonjour !

    A l'occasion d'une question posée dans le forum, j'ai voulu voir si j'arriverais à fabriquer un outil qui remplacerait les caractères spéciaux d'un document HTML par les "entités" correspondantes (et inversement).

    J'ai pensé qu'il fallait que je commence par me procurer une table. J'ai donc pris une copie de cette (jolie) page, et j'ai écrit un petit programme pour en extraire les données intéressantes. J'ai obtenu un fichier qui se présente ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	 	 	
    
 
 
     
    ! ! !
    Maintenant je pense à fabriquer une unité à partir de ce fichier, mais je bute sur un problème, qui est de produire les caractères correspondants à partir de leur code, pour les mettre dans un tableau avec les données que j'ai déjà. Mais ça, je ne sais pas comment le faire. A moins de me limiter aux caractères ASCII (qui peuvent être produits au moyen de la fonction Chr) ?

    Suis-je sur la bonne route ? Auriez-vous des conseils à me donner ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    Bon, après avoir fait quelques recherches sur le sujet, j'ai décidé de me limiter aux caractères ASCII.

    Voici la fonction CharToEntity. Qu'en pensez-vous ?

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    function CharToEntity(c: char): string;
    begin
      result := '';
      case c of
        '!': result := '!';
        '"': result := '"';
        '#': result := '#';
        '$': result := '$';
        '%': result := '%';
        '&': result := '&';
        '''': result := ''';
        '(': result := '(';
        ')': result := ')';
        '*': result := '*';
        '+': result := '+';
        ',': result := ',';
        '.': result := '.';
        '/': result := '/';
        ':': result := ':';
        ';': result := ';';
        '<': result := '&lt;';
        '=': result := '&equals;';
        '>': result := '&gt;';
        '?': result := '&quest;';
        '@': result := '&commat;';
        '[': result := '&lsqb;';
        '\': result := '&bsol;';
        ']': result := '&rsqb;';
        '^': result := '&Hat;';
        '_': result := '&lowbar;';
        '`': result := '&grave;';
        '{': result := '&lcub;';
        '|': result := '&verbar;';
        '}': result := '&rcub;';
        '*': result := '&nbsp;';
        '¡': result := '&iexcl;';
        '¢': result := '&cent;';
        '£': result := '&pound;';
        '¤': result := '&curren;';
        '¥': result := '&yen;';
        '¦': result := '&brvbar;';
        '§': result := '&sect;';
        '¨': result := '&Dot;';
        '©': result := '&copy;';
        'ª': result := '&ordf;';
        '«': result := '&laquo;';
        '¬': result := '&not;';
        '*': result := '*';
        '®': result := '&reg;';
        '¯': result := '&macr;';
        '°': result := '&deg;';
        '±': result := '&plusmn;';
        '²': result := '&sup2;';
        '³': result := '&sup3;';
        '´': result := '&acute;';
        'µ': result := '&micro;';
        '¶': result := '&para;';
        '·': result := '&middot;';
        '¸': result := '&cedil;';
        '¹': result := '&sup1;';
        'º': result := '&ordm;';
        '»': result := '&raquo;';
        '¼': result := '&frac14;';
        '½': result := '&frac12;';
        '¾': result := '&frac34;';
        '¿': result := '&iquest;';
        'À': result := '&Agrave;';
        'Á': result := '&Aacute;';
        'Â': result := '&Acirc;';
        'Ã': result := '&Atilde;';
        'Ä': result := '&Auml;';
        'Å': result := '&Aring;';
        'Æ': result := '&AElig;';
        'Ç': result := '&Ccedil;';
        'È': result := '&Egrave;';
        'É': result := '&Eacute;';
        'Ê': result := '&Ecirc;';
        'Ë': result := '&Euml;';
        'Ì': result := '&Igrave;';
        'Í': result := '&Iacute;';
        'Î': result := '&Icirc;';
        'Ï': result := '&Iuml;';
        'Ð': result := '&ETH;';
        'Ñ': result := '&Ntilde;';
        'Ò': result := '&Ograve;';
        'Ó': result := '&Oacute;';
        'Ô': result := '&Ocirc;';
        'Õ': result := '&Otilde;';
        'Ö': result := '&Ouml;';
        '×': result := '&times;';
        'Ø': result := '&Oslash;';
        'Ù': result := '&Ugrave;';
        'Ú': result := '&Uacute;';
        'Û': result := '&Ucirc;';
        'Ü': result := '&Uuml;';
        'Ý': result := '&Yacute;';
        'Þ': result := '&THORN;';
        'ß': result := '&szlig;';
        'à': result := '&agrave;';
        'á': result := '&aacute;';
        'â': result := '&acirc;';
        'ã': result := '&atilde;';
        'ä': result := '&auml;';
        'å': result := '&aring;';
        'æ': result := '&aelig;';
        'ç': result := '&ccedil;';
        'è': result := '&egrave;';
        'é': result := '&eacute;';
        'ê': result := '&ecirc;';
        'ë': result := '&euml;';
        'ì': result := '&igrave;';
        'í': result := '&iacute;';
        'î': result := '&icirc;';
        'ï': result := '&iuml;';
        'ð': result := '&eth;';
        'ñ': result := '&ntilde;';
        'ò': result := '&ograve;';
        'ó': result := '&oacute;';
        'ô': result := '&ocirc;';
        'õ': result := '&otilde;';
        'ö': result := '&ouml;';
        '÷': result := '&divide;';
        'ø': result := '&oslash;';
        'ù': result := '&ugrave;';
        'ú': result := '&uacute;';
        'û': result := '&ucirc;';
        'ü': result := '&uuml;';
        'ý': result := '&yacute;';
        'þ': result := '&thorn;';
        'ÿ': result := '&yuml;';
      end;
    end;
    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
    var
      s: string;
      i: integer;
      e: string;
     
    begin
      s := 'général';
      i := 1;
      while i <= Length(s) do
      begin
        e := CharToEntity(s[i]);
        if e <> '' then
        begin
          Insert(e, s, i);
          Delete(s, i + Length(e), 1);
          Inc(i, Length(e));
        end else
          Inc(i);
      end;
      WriteLn(s);
    end.
    P.-S. Je viens de m'apercevoir que le code ne s'affiche pas correctement : certaines entités sont remplacées par le caractère correspondant.

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    Maintenant, imaginons que je veuille traiter, au moyen de ma fonction, un document HTML entier. Quelle serait selon vous la méthode à suivre ?

    Suffirait-il par exemple d'ignorer les "<" et ">" et de traiter tout le reste ? Ou d'ignorer aussi les accolades, à cause du code CSS ?

    Comment aborderiez-vous ce problème ?

    P.-S. Après réflexion, il me semble qu'une stratégie acceptable pourrait être de traiter tout le texte, sauf les balises, et sauf le texte contenu entre les balises "style" (qui est du code CSS). Enfin, c'est du moins la conclusion à laquelle je suis arrivé en regardant une page HTML de mon site personnel, qui n'est sûrement pas représentative de tout ce qui peut exister.

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    J'ai bricolé quelque chose qui fonctionne, du moins sur la seule page que j'ai essayée. Je joins le programme, avec la page originale et le résultat. Si vous avez des suggestions, je les écouterai volontiers.

    Cependant, je me demande si ça a du sens de remplacer tous ces caractères (par exemple les points et les virgules). A quoi cela peut-il servir ? Si vous deviez utiliser un programme de ce genre, quels sont les caractères que vous jugeriez utile de remplacer ?
    Fichiers attachés Fichiers attachés

  5. #5
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 726
    Points
    59 726
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Le contenu des balises n'est pas converti ; or, certaines balises comme <a></a>, par exemple, admettent des propriétés contenant du texte à afficher (les propriétés title et alt, en l'occurence), qui doit également être converti.

    Tu pourrais également commencer l'exécution du programme par un test de la propriété charset de la balise <meta></meta> : si la valeur est autre chose que charset=iso-8859-1 alors la conversion ne peut se faire.

    Petit détail en passant : le symbole monétaire € doit être converti en &euro;, si je ne m'abuse ?

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    Merci Alcatîz, d'avoir regardé mon programme et de m'avoir donné ces indications.

    Citation Envoyé par Alcatîz Voir le message
    Le contenu des balises n'est pas converti ; or, certaines balises comme <a></a>, par exemple, admettent des propriétés contenant du texte à afficher (les propriétés title et alt, en l'occurence), qui doit également être converti.
    Bien vu ! Je crois pouvoir faire cette modification.

    Citation Envoyé par Alcatîz Voir le message
    Tu pourrais également commencer l'exécution du programme par un test de la propriété charset de la balise <meta></meta> : si la valeur est autre chose que charset=iso-8859-1 alors la conversion ne peut se faire.
    Je ne vois pas bien pourquoi il faut faire cela mais, quoiqu'il en soit, je prends bonne note.

    Citation Envoyé par Alcatîz Voir le message
    Petit détail en passant : le symbole monétaire € doit être converti en &euro;, si je ne m'abuse ?
    Là je retombe sur une difficulté dont j'ai parlé plus haut : c'est que je ne sais pas comment obtenir ce caractère, sachant que mon unité est fabriquée par un programme, à partir de données qui se présentent ainsi :

    [edit]
    Voir pièce jointe "texte1.txt".
    [/edit]

    (Ces données, je les ai extraites d'une page dont j'ai donné le lien au début.)

    Voici le programme dont je me suis servi pour fabriquer mon unité :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    program make1;
     
    var
      i, o: text;
      s: string;
      a, b, c, d, e: longint;
     
    begin
      Assign(i, '002.txt');
      Reset(i);
      Assign(o, '003.txt');
      Rewrite(o);
     
      while not Eof(i) do
      begin
        ReadLn(i, s);
     
        a := 1;
        while not ((s[a] = '&') and (s[a + 1] = '#') and (s[a + 2] <> 'x')) do Inc(a);
     
        b := 0;
        while s[a + b + 2] in ['0'..'9'] do Inc(b);
     
        Val(Copy(s, a + 2, b), c, d);
     
        if (d = 0) and (c >= 33) and (c <= 255) then
        begin
          e := Pos(' ', s);
          WriteLn(
            o,
            '''',
            Chr(c), 
            ''': result := ''',
            Copy(s, 1, e - 1),
            ''';'
          );
        end;
     
      end;
     
      Close(i);
      Close(o);
    end.
    Dans le fichier d'entrée j'ai des lignes comme celle-ci :

    [edit]
    Voir pièce jointe "texte2.txt".
    [/edit]

    Et le programme me fabrique à la place la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'è': result := '&egrave;';
    Le problème c'est que pour produire dans mon fichier de sortie le caractère è, j'utilise la fonction Chr : c'est pourquoi je me suis limité aux caractères dont le code est inférieur ou égal à 255. Le symbole , par exemple, je ne sais pas comment le produire (mis à part le rajouter à la main).

    J'ai trouvé une façon de l'afficher dans une fenêtre (avec le code 128, pourquoi 128 ?),

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    program wchar;
     
    { FPC 2.6.4 }
     
    uses windows;
     
    var
      ws: widestring;
     
    begin
      ws := widechar(128);
      messagebox(0, @ws[1], '', MB_OK);
    end.
    mais dans un fichier ça n'a pas fonctionné.

    Voilà, pardon pour ce trop long message. Je crois que je me suis lancé là-dedans sans avoir toutes les connaissances requises. Si vous avez la patience de m'éclairer un peu, je suis à l'écoute. Autrement je me contenterai de rajouter à la main le symbole en question.
    Fichiers attachés Fichiers attachés

  7. #7
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 726
    Points
    59 726
    Billets dans le blog
    2
    Par défaut
    En fait, l'apparition du symbole € est postérieure à la norme ISO-8859-1, qui fixe le jeu de caractères ouest-européen de base.
    Pour avoir une idée du flou qui peut régner à propos de l'euro : https://www.cs.tut.fi/~jkorpela/html/euro.html ou http://romy.tetue.net/comment-dit-on-euro-en-html

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    Merci pour les liens !

    Je n'ai pas ajouté le symbole mais je me suis donné de la peine.

    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
        if (s[n] = '<') and (Copy(s, n + 1, 3) <> '!--') and (Copy(s, n + 1, 5) <> 'style') then
          repeat
            if s[n] = '"' then
            begin
              if b then
                b := false
              else
                if FindPropertyName(s, n, 'alt')
                or FindPropertyName(s, n, 'title') { Liste à compléter. }
                then
                  b := true;
            end
            else
              if b then
                CharReplace(s, n);
     
            Inc(n);
          until (s[n - 1] = '>');
    D'après l'unique essai que j'ai fait, ça fonctionne. (Merci de me signaler d'éventuelles erreurs.) Il reste à compléter la liste des propriétés à traiter.
    Fichiers attachés Fichiers attachés

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    J'allais oublier le test de la propriété charset.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      CloseFile(i);
     
      Write('Test propri'#130't'#130' CHARSET : ');
      WriteLn(Pos('charset=ISO-8859-1', s) > 0);
     
      n := 1;

  10. #10
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 562
    Points : 3 956
    Points
    3 956
    Par défaut
    Salut

    Petite remarque : est-ce que tu supposes que le fichier html source ne contient aucune d'entité au départ, dans le cas contraire, il faut être prudent avec les caractères & et ;. Si une entité existe, alors une transformation trop basique amènera à un résultat invalide: ...&amp;... ->...&amp;amp&semi;...

    @+

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Petite remarque : est-ce que tu supposes que le fichier html source ne contient aucune d'entité au départ, dans le cas contraire, il faut être prudent avec les caractères & et ;.
    Bonjour ! Merci pour ta remarque, petite mais importante.

    Je vais y penser. A première vue, je ne vois pas de solution à la fois satisfaisante et simple à réaliser.

    Une autre supposition que j'ai faite et sur laquelle j'ai un doute, c'est que le nom d'une propriété, le signe = et le premier guillemet sont collés : or je me demande si le langage HTML ne permet pas les espaces autour du signe =. (Maintenant que j'y pense, je m'aperçois que ce problème des espaces se pose un peu partout.)

    Il y a d'autres choses encore que j'ai supposées, par exemple que toutes les balises sont fermées. Je crois que pour bien faire, il faudrait commencer par une série de tests préliminaires et, en fonction du résultat, interrompre ou poursuivre l'exécution du programme.

  12. #12
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 726
    Points
    59 726
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Une autre supposition que j'ai faite et sur laquelle j'ai un doute, c'est que le nom d'une propriété, le signe = et le premier guillemet sont collés : or je me demande si le langage HTML ne permet pas les espaces autour du signe =. (Maintenant que j'y pense, je m'aperçois que ce problème des espaces se pose un peu partout.)

    Il y a d'autres choses encore que j'ai supposées, par exemple que toutes les balises sont fermées.
    On rencontre les pires écarts par rapport à la norme html ; les navigateurs sont d'ailleurs conçus pour être très permissifs et pour essayer, par exemple, de deviner la fermeture de certaines balises non fermées dans le code ou carrément supposer la présence de balises totalement absentes. Il suffit de scruter le code source de certains sites pour voir leur codage cochonné.

  13. #13
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Alcatîz Voir le message
    On rencontre les pires écarts par rapport à la norme html ; les navigateurs sont d'ailleurs conçus pour être très permissifs et pour essayer, par exemple, de deviner la fermeture de certaines balises non fermées dans le code ou carrément supposer la présence de balises totalement absentes.
    Ce sont effectivement des choses à prendre en compte.

    Voici une nouvelle version du programme. On utilise désormais un fichier proprietes.cfg, contenant la liste des propriétés à traiter. De cette façon on peut compléter la liste sans avoir à modifier le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                if FindString(PropertyName(s, n), p) then { Cherche le nom de la propriété dans une collection de chaînes. }
                  b := true;
    J'ai aussi ajouté une fonction de détection des entités éventuellement présentes dans le fichier source. Honnêtement, je trouve que ma façon de faire sent un peu le bricolage : si vous avez d'autres idées, merci d'en faire part.

    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
    22
    23
    24
    function FindEntity(s: string): boolean;
    var
      i, j, k, l: integer;
    begin
      result := false;
      i := 0;
      repeat
        i := Pos('&', s);
        if i > 0 then
        begin
          Delete(s, 1, i);
          j := Pos(';', s);
          if j > 0 then
          begin
            l := 0;
            for k := 1 to j - 1 do
              if s[k] in ['a'..'z'] + ['A'..'Z'] then
                Inc(l);
            if l = j - 1 then
              result := true;        
          end;
        end;
      until (i = 0) or result;
    end;
    Si cette discussion permettait au moins de faire le tour des problèmes à résoudre, ce serait déjà quelque chose.

  14. #14
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 562
    Points : 3 956
    Points
    3 956
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour ! Merci pour ta remarque, petite mais importante.


    Je vais y penser. A première vue, je ne vois pas de solution à la fois satisfaisante et simple à réaliser.
    Tu parses la chaîne; si tu trouves un '&', tu extrais la chaîne qui va jusqu'au prochain ';' uniquement composée de lettres 'a'..'z' (vérifier la norme), si elle existe, tu recherches la chaîne dans un dictionnaire prévu à cet effet.

    over

    e-ric

  15. #15
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Tu parses la chaîne; si tu trouves un '&', tu extrais la chaîne qui va jusqu'au prochain ';' uniquement composée de lettres 'a'..'z' (vérifier la norme), si elle existe, tu recherches la chaîne dans un dictionnaire prévu à cet effet.
    Fait ! J'ai même inclus la recherche d'entités numériques (hexadécimal et décimal). Je mets à jour la pièce jointe du message précédent.

    J'ai fait aussi la première version d'un décodeur (mais cette fois, seules les entités littérales sont traitées).

    Attention, ce code ne s'affiche pas correctement !

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    procedure ReplaceEntities(var s: string);
    begin
      s := StringReplace(s, '&excl;', '!', [rfReplaceAll]);
      s := StringReplace(s, '&quot;', '"', [rfReplaceAll]);
      s := StringReplace(s, '&num;', '#', [rfReplaceAll]);
      s := StringReplace(s, '&dollar;', '$', [rfReplaceAll]);
      s := StringReplace(s, '&percnt;', '%', [rfReplaceAll]);
      s := StringReplace(s, '&amp;', '&', [rfReplaceAll]);
      s := StringReplace(s, '&apos;', '''', [rfReplaceAll]);
      s := StringReplace(s, '&lpar;', '(', [rfReplaceAll]);
      s := StringReplace(s, '&rpar;', ')', [rfReplaceAll]);
      s := StringReplace(s, '&ast;', '*', [rfReplaceAll]);
      s := StringReplace(s, '&plus;', '+', [rfReplaceAll]);
      s := StringReplace(s, '&comma;', ',', [rfReplaceAll]);
      s := StringReplace(s, '&period;', '.', [rfReplaceAll]);
      s := StringReplace(s, '&sol;', '/', [rfReplaceAll]);
      s := StringReplace(s, '&colon;', ':', [rfReplaceAll]);
      s := StringReplace(s, '&semi;', ';', [rfReplaceAll]);
      s := StringReplace(s, '&lt;', '<', [rfReplaceAll]);
      s := StringReplace(s, '&equals;', '=', [rfReplaceAll]);
      s := StringReplace(s, '&gt;', '>', [rfReplaceAll]);
      s := StringReplace(s, '&quest;', '?', [rfReplaceAll]);
      s := StringReplace(s, '&commat;', '@', [rfReplaceAll]);
      s := StringReplace(s, '&lsqb;', '[', [rfReplaceAll]);
      s := StringReplace(s, '&bsol;', '\', [rfReplaceAll]);
      s := StringReplace(s, '&rsqb;', ']', [rfReplaceAll]);
      s := StringReplace(s, '&Hat;', '^', [rfReplaceAll]);
      s := StringReplace(s, '&lowbar;', '_', [rfReplaceAll]);
      s := StringReplace(s, '&grave;', '`', [rfReplaceAll]);
      s := StringReplace(s, '&lcub;', '{', [rfReplaceAll]);
      s := StringReplace(s, '&verbar;', '|', [rfReplaceAll]);
      s := StringReplace(s, '&rcub;', '}', [rfReplaceAll]);
      s := StringReplace(s, '&nbsp;', '*', [rfReplaceAll]);
      s := StringReplace(s, '&iexcl;', '¡', [rfReplaceAll]);
      s := StringReplace(s, '&cent;', '¢', [rfReplaceAll]);
      s := StringReplace(s, '&pound;', '£', [rfReplaceAll]);
      s := StringReplace(s, '&curren;', '¤', [rfReplaceAll]);
      s := StringReplace(s, '&yen;', '¥', [rfReplaceAll]);
      s := StringReplace(s, '&brvbar;', '¦', [rfReplaceAll]);
      s := StringReplace(s, '&sect;', '§', [rfReplaceAll]);
      s := StringReplace(s, '&Dot;', '¨', [rfReplaceAll]);
      s := StringReplace(s, '&copy;', '©', [rfReplaceAll]);
      s := StringReplace(s, '&ordf;', 'ª', [rfReplaceAll]);
      s := StringReplace(s, '&laquo;', '«', [rfReplaceAll]);
      s := StringReplace(s, '&not;', '¬', [rfReplaceAll]);
      s := StringReplace(s, '*', '*', [rfReplaceAll]);
      s := StringReplace(s, '&reg;', '®', [rfReplaceAll]);
      s := StringReplace(s, '&macr;', '¯', [rfReplaceAll]);
      s := StringReplace(s, '&deg;', '°', [rfReplaceAll]);
      s := StringReplace(s, '&plusmn;', '±', [rfReplaceAll]);
      s := StringReplace(s, '&sup2;', '²', [rfReplaceAll]);
      s := StringReplace(s, '&sup3;', '³', [rfReplaceAll]);
      s := StringReplace(s, '&acute;', '´', [rfReplaceAll]);
      s := StringReplace(s, '&micro;', 'µ', [rfReplaceAll]);
      s := StringReplace(s, '&para;', '¶', [rfReplaceAll]);
      s := StringReplace(s, '&middot;', '·', [rfReplaceAll]);
      s := StringReplace(s, '&cedil;', '¸', [rfReplaceAll]);
      s := StringReplace(s, '&sup1;', '¹', [rfReplaceAll]);
      s := StringReplace(s, '&ordm;', 'º', [rfReplaceAll]);
      s := StringReplace(s, '&raquo;', '»', [rfReplaceAll]);
      s := StringReplace(s, '&frac14;', '¼', [rfReplaceAll]);
      s := StringReplace(s, '&frac12;', '½', [rfReplaceAll]);
      s := StringReplace(s, '&frac34;', '¾', [rfReplaceAll]);
      s := StringReplace(s, '&iquest;', '¿', [rfReplaceAll]);
      s := StringReplace(s, '&Agrave;', 'À', [rfReplaceAll]);
      s := StringReplace(s, '&Aacute;', 'Á', [rfReplaceAll]);
      s := StringReplace(s, '&Acirc;', 'Â', [rfReplaceAll]);
      s := StringReplace(s, '&Atilde;', 'Ã', [rfReplaceAll]);
      s := StringReplace(s, '&Auml;', 'Ä', [rfReplaceAll]);
      s := StringReplace(s, '&Aring;', 'Å', [rfReplaceAll]);
      s := StringReplace(s, '&AElig;', 'Æ', [rfReplaceAll]);
      s := StringReplace(s, '&Ccedil;', 'Ç', [rfReplaceAll]);
      s := StringReplace(s, '&Egrave;', 'È', [rfReplaceAll]);
      s := StringReplace(s, '&Eacute;', 'É', [rfReplaceAll]);
      s := StringReplace(s, '&Ecirc;', 'Ê', [rfReplaceAll]);
      s := StringReplace(s, '&Euml;', 'Ë', [rfReplaceAll]);
      s := StringReplace(s, '&Igrave;', 'Ì', [rfReplaceAll]);
      s := StringReplace(s, '&Iacute;', 'Í', [rfReplaceAll]);
      s := StringReplace(s, '&Icirc;', 'Î', [rfReplaceAll]);
      s := StringReplace(s, '&Iuml;', 'Ï', [rfReplaceAll]);
      s := StringReplace(s, '&ETH;', 'Ð', [rfReplaceAll]);
      s := StringReplace(s, '&Ntilde;', 'Ñ', [rfReplaceAll]);
      s := StringReplace(s, '&Ograve;', 'Ò', [rfReplaceAll]);
      s := StringReplace(s, '&Oacute;', 'Ó', [rfReplaceAll]);
      s := StringReplace(s, '&Ocirc;', 'Ô', [rfReplaceAll]);
      s := StringReplace(s, '&Otilde;', 'Õ', [rfReplaceAll]);
      s := StringReplace(s, '&Ouml;', 'Ö', [rfReplaceAll]);
      s := StringReplace(s, '&times;', '×', [rfReplaceAll]);
      s := StringReplace(s, '&Oslash;', 'Ø', [rfReplaceAll]);
      s := StringReplace(s, '&Ugrave;', 'Ù', [rfReplaceAll]);
      s := StringReplace(s, '&Uacute;', 'Ú', [rfReplaceAll]);
      s := StringReplace(s, '&Ucirc;', 'Û', [rfReplaceAll]);
      s := StringReplace(s, '&Uuml;', 'Ü', [rfReplaceAll]);
      s := StringReplace(s, '&Yacute;', 'Ý', [rfReplaceAll]);
      s := StringReplace(s, '&THORN;', 'Þ', [rfReplaceAll]);
      s := StringReplace(s, '&szlig;', 'ß', [rfReplaceAll]);
      s := StringReplace(s, '&agrave;', 'à', [rfReplaceAll]);
      s := StringReplace(s, '&aacute;', 'á', [rfReplaceAll]);
      s := StringReplace(s, '&acirc;', 'â', [rfReplaceAll]);
      s := StringReplace(s, '&atilde;', 'ã', [rfReplaceAll]);
      s := StringReplace(s, '&auml;', 'ä', [rfReplaceAll]);
      s := StringReplace(s, '&aring;', 'å', [rfReplaceAll]);
      s := StringReplace(s, '&aelig;', 'æ', [rfReplaceAll]);
      s := StringReplace(s, '&ccedil;', 'ç', [rfReplaceAll]);
      s := StringReplace(s, '&egrave;', 'è', [rfReplaceAll]);
      s := StringReplace(s, '&eacute;', 'é', [rfReplaceAll]);
      s := StringReplace(s, '&ecirc;', 'ê', [rfReplaceAll]);
      s := StringReplace(s, '&euml;', 'ë', [rfReplaceAll]);
      s := StringReplace(s, '&igrave;', 'ì', [rfReplaceAll]);
      s := StringReplace(s, '&iacute;', 'í', [rfReplaceAll]);
      s := StringReplace(s, '&icirc;', 'î', [rfReplaceAll]);
      s := StringReplace(s, '&iuml;', 'ï', [rfReplaceAll]);
      s := StringReplace(s, '&eth;', 'ð', [rfReplaceAll]);
      s := StringReplace(s, '&ntilde;', 'ñ', [rfReplaceAll]);
      s := StringReplace(s, '&ograve;', 'ò', [rfReplaceAll]);
      s := StringReplace(s, '&oacute;', 'ó', [rfReplaceAll]);
      s := StringReplace(s, '&ocirc;', 'ô', [rfReplaceAll]);
      s := StringReplace(s, '&otilde;', 'õ', [rfReplaceAll]);
      s := StringReplace(s, '&ouml;', 'ö', [rfReplaceAll]);
      s := StringReplace(s, '&divide;', '÷', [rfReplaceAll]);
      s := StringReplace(s, '&oslash;', 'ø', [rfReplaceAll]);
      s := StringReplace(s, '&ugrave;', 'ù', [rfReplaceAll]);
      s := StringReplace(s, '&uacute;', 'ú', [rfReplaceAll]);
      s := StringReplace(s, '&ucirc;', 'û', [rfReplaceAll]);
      s := StringReplace(s, '&uuml;', 'ü', [rfReplaceAll]);
      s := StringReplace(s, '&yacute;', 'ý', [rfReplaceAll]);
      s := StringReplace(s, '&thorn;', 'þ', [rfReplaceAll]);
      s := StringReplace(s, '&yuml;', 'ÿ', [rfReplaceAll]);
    end;

  16. #16
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    Je me suis demandé ce qui me restait à faire pour que mon programme puisse être vraiment utile à quelqu'un (à moi-même par exemple). Je lui ai fait une petite interface graphique et un mode d'emploi.

    Cependant il y a un problème qui n'est pas résolu : c'est le traitement des caractères manquants. Alcatîz a signalé le cas du symbole . Je viens de penser aussi au caractère œ qui est assez courant et que mon programme ne traite pas pour le moment. Le problème est de savoir comment produire ces caractères dans un fichier-texte (pour fabriquer mon code source) et ensuite comment faire pour que le programme les reconnaisse ?

  17. #17
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    Je crois avoir trouvé une solution, plus simple que ce que j'imaginais.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    program Project1;
     
    {$IFDEF VPASCAL}
    {$PMTYPE VIO}
    {$ELSE}
    {$APPTYPE CONSOLE}
    {$ENDIF}
     
    { Delphi XE2, Free Pascal 2.6.4, Virtual Pascal 2.1. }
     
    var
      t: text;
      o: string;
      i: string;
      n, e: longint;
     
    begin
      o := 'cœur';
     
      Assign(t, '001.txt');
     
      Rewrite(t);
      WriteLn(t, o);
     
      Reset(t);
      ReadLn(t, i);
     
      Close(t);
     
      WriteLn(o = i); // TRUE
     
      // &oelig; &#x00153; œ
     
      WriteLn(o[2] = 'œ'); // TRUE
     
    {$IFDEF VPASCAL}
      WriteLn(o[2] = #339); // Error 76: Constant out of range
    {$ELSE}
      WriteLn(o[2] = #339); // TRUE
    {$ENDIF}
     
      Val('$153', n, e);
      WriteLn((e = 0) and (n = 339)); // TRUE
     
      ReadLn;
    end.
    Donc, maintenant je vois une façon de fabriquer mon code.

  18. #18
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    Donc, pour fabriquer le code source d'une fonction CharToEntity plus complète, j'ai fait cette modification sur le programme dont je m'étais servi.

    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
        if (d = 0) and (c >= 33) {and (c <= 255)} then
        begin
          e := Pos(' ', s);
          WriteLn(
            o,
            '''',
     
            //Chr(c), 
            widechar(c),
     
            ''': result := ''',
            Copy(s, 1, e - 1),
            ''';'
          );
        end;
    J'ai un tas de caractères qui sont remplacés par des points d'interrogation, mais au beau milieu, je ne sais pas pourquoi, il y a des caractères qui sont bien sortis (voir la première pièce jointe).

    Je pense que je vais me contenter d'éliminer les lignes qui ont des points d'interrogations, et garder celles qui restent.

    P.-S. J'ajoute en deuxième pièce jointe le fichier final. A partir de la ligne 127, ce sont les lignes qui n'étaient pas dans la version précédente. C'est très empirique tout ça, mais pourquoi pas ?
    Fichiers attachés Fichiers attachés

  19. #19
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    J'ai fait un test grandeur nature : j'ai traité toutes les pages de mon site personnel (encodage et décodage). Je n'ai pas remarqué d'erreur, donc je peux dire que l'outil est relativement opérationnel.

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

Discussions similaires

  1. [Encodage] les caractère spéciaux ne s'affiche pas dans les balise H
    Par Nad84jia dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 23/11/2013, 15h37
  2. Réponses: 1
    Dernier message: 19/11/2012, 19h18
  3. convertir les caractères spéciaux en html
    Par jultoys dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/07/2007, 18h49
  4. Réponses: 5
    Dernier message: 26/11/2006, 17h32

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