mardi 26 octobre 2010

Convertir des entités XHTML en Unicode avec PHP

Après quelques recherches, je n'ai pas réussi à trouver de script satisfaisant pour convertir les entités déclaré dans la DTD XHTML Transitional en entités Unicode.

C'est très étrange : dans chaque script, chacun y vas de sa petite liste d'entités, et même si je n'ai aucune idée d'où ces listes peuvent bien sortir, elles sont systématiquement incomplètes !

Pourtant, ce n'est pas comme si cette liste était si compliqué à trouver : il suffit de regarder la Définition de Type de Document dont l'url se trouve dans la déclaration DOCTYPE de tout bon document XHTML Transitional.

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Et au tout début du document, ligne 24, se trouve les références vers les déclarations des entités :

  1. <!--================ Character mnemonic entities =========================-->
  2.  
  3. <!ENTITY % HTMLlat1 PUBLIC
  4.   "-//W3C//ENTITIES Latin 1 for XHTML//EN"
  5.   "xhtml-lat1.ent">
  6. %HTMLlat1;
  7.  
  8. <!ENTITY % HTMLsymbol PUBLIC
  9.   "-//W3C//ENTITIES Symbols for XHTML//EN"
  10.   "xhtml-symbol.ent">
  11. %HTMLsymbol;
  12.  
  13. <!ENTITY % HTMLspecial PUBLIC
  14.   "-//W3C//ENTITIES Special for XHTML//EN"
  15.   "xhtml-special.ent">
  16. %HTMLspecial;

En partant de là, il nous suffit donc d'aller chercher les trois fichiers contenant la totalité des entités déclarés :

La fonction PHP

J'ai donc rédigé cette fonction PHP qui prend en compte toutes les entités déclarés pour leurs substitutions en Unicode :

  1. <?php
  2.  
  3. /**
  4.  * Convertit toutes les entités déclarées dans la DTD XHTML Transitional en
  5.  * entités Unicode. Si c'est pas triste de devoir en arriver là...<br/>
  6.  * Section DTD :
  7.  * <code>
  8.  *   <!--================ Character mnemonic entities =========================-->
  9.  *
  10.  *   <!ENTITY % HTMLlat1 PUBLIC
  11.  *      "-//W3C//ENTITIES Latin 1 for XHTML//EN"
  12.  *      "xhtml-lat1.ent">
  13.  *   %HTMLlat1;
  14.  *
  15.  *   <!ENTITY % HTMLsymbol PUBLIC
  16.  *      "-//W3C//ENTITIES Symbols for XHTML//EN"
  17.  *      "xhtml-symbol.ent">
  18.  *   %HTMLsymbol;
  19.  *
  20.  *   <!ENTITY % HTMLspecial PUBLIC
  21.  *      "-//W3C//ENTITIES Special for XHTML//EN"
  22.  *      "xhtml-special.ent">
  23.  *   %HTMLspecial;
  24.  * </code>
  25.  * @author G. Qyy, <code[at]qyy.fr>
  26.  * @copyright Copyright (c) 2010 G. Qyy
  27.  * @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
  28.  * @link http://blog.qyy.fr/2010/10/convertir-des-entites-xhtml-en-unicode.html
  29.  * @link http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
  30.  * @link http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent
  31.  * @link http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent
  32.  * @link http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent
  33.  * @param string $chaine <p>
  34.  * Une chaine contenant des entités déclarées dans la DTD XHTML Transitional
  35.  * </p>
  36.  * @return string La chaine fournit dont les entités déclarées dans la DTD
  37.  * XHTML Transitional ont été convertis en entités Unicode.
  38.  */
  39. function ConvertieEntiteVersUnicode($chaine)
  40. {
  41.   $unicode = array(
  42.     '&#34;','&#38;','&#60;','&#62;','&#39;','&#338;','&#339;','&#352;',
  43.     '&#353;','&#376;','&#710;','&#732;','&#8194;','&#8195;','&#8201;',
  44.     '&#8204;','&#8205;','&#8206;','&#8207;','&#8211;','&#8212;','&#8216;',
  45.     '&#8217;','&#8218;','&#8220;','&#8221;','&#8222;','&#8224;','&#8225;',
  46.     '&#8240;','&#8249;','&#8250;','&#8364;','&#160;','&#161;','&#162;',
  47.     '&#163;','&#164;','&#165;','&#166;','&#167;','&#168;','&#169;','&#170;',
  48.     '&#171;','&#172;','&#173;','&#174;','&#175;','&#176;','&#177;','&#178;',
  49.     '&#179;','&#180;','&#181;','&#182;','&#183;','&#184;','&#185;','&#186;',
  50.     '&#187;','&#188;','&#189;','&#190;','&#191;','&#192;','&#193;','&#194;',
  51.     '&#195;','&#196;','&#197;','&#198;','&#199;','&#200;','&#201;','&#202;',
  52.     '&#203;','&#204;','&#205;','&#206;','&#207;','&#208;','&#209;','&#210;',
  53.     '&#211;','&#212;','&#213;','&#214;','&#215;','&#216;','&#217;','&#218;',
  54.     '&#219;','&#220;','&#221;','&#222;','&#223;','&#224;','&#225;','&#226;',
  55.     '&#227;','&#228;','&#229;','&#230;','&#231;','&#232;','&#233;','&#234;',
  56.     '&#235;','&#236;','&#237;','&#238;','&#239;','&#240;','&#241;','&#242;',
  57.     '&#243;','&#244;','&#245;','&#246;','&#247;','&#248;','&#249;','&#250;',
  58.     '&#251;','&#252;','&#253;','&#254;','&#255;','&#402;','&#913;','&#914;',
  59.     '&#915;','&#916;','&#917;','&#918;','&#919;','&#920;','&#921;','&#922;',
  60.     '&#923;','&#924;','&#925;','&#926;','&#927;','&#928;','&#929;','&#931;',
  61.     '&#932;','&#933;','&#934;','&#935;','&#936;','&#937;','&#945;','&#946;',
  62.     '&#947;','&#948;','&#949;','&#950;','&#951;','&#952;','&#953;','&#954;',
  63.     '&#955;','&#956;','&#957;','&#958;','&#959;','&#960;','&#961;','&#962;',
  64.     '&#963;','&#964;','&#965;','&#966;','&#967;','&#968;','&#969;','&#977;',
  65.     '&#978;','&#982;','&#8226;','&#8230;','&#8242;','&#8243;','&#8254;',
  66.     '&#8260;','&#8472;','&#8465;','&#8476;','&#8482;','&#8501;','&#8592;',
  67.     '&#8593;','&#8594;','&#8595;','&#8596;','&#8629;','&#8656;','&#8657;',
  68.     '&#8658;','&#8659;','&#8660;','&#8704;','&#8706;','&#8707;','&#8709;',
  69.     '&#8711;','&#8712;','&#8713;','&#8715;','&#8719;','&#8721;','&#8722;',
  70.     '&#8727;','&#8730;','&#8733;','&#8734;','&#8736;','&#8743;','&#8744;',
  71.     '&#8745;','&#8746;','&#8747;','&#8756;','&#8764;','&#8773;','&#8776;',
  72.     '&#8800;','&#8801;','&#8804;','&#8805;','&#8834;','&#8835;','&#8836;',
  73.     '&#8838;','&#8839;','&#8853;','&#8855;','&#8869;','&#8901;','&#8968;',
  74.     '&#8969;','&#8970;','&#8971;','&#9001;','&#9002;','&#9674;','&#9824;',
  75.     '&#9827;','&#9829;','&#9830;'
  76.   );
  77.  
  78.   $entite = array(
  79.     '&quot;','&amp;','&lt;','&gt;','&apos;','&OElig;','&oelig;','&Scaron;',
  80.     '&scaron;','&Yuml;','&circ;','&tilde;','&ensp;','&emsp;','&thinsp;',
  81.     '&zwnj;','&zwj;','&lrm;','&rlm;','&ndash;','&mdash;','&lsquo;','&rsquo;',
  82.     '&sbquo;','&ldquo;','&rdquo;','&bdquo;','&dagger;','&Dagger;','&permil;',
  83.     '&lsaquo;','&rsaquo;','&euro;','&nbsp;','&iexcl;','&cent;','&pound;',
  84.     '&curren;','&yen;','&brvbar;','&sect;','&uml;','&copy;','&ordf;',
  85.     '&laquo;','&not;','&shy;','&reg;','&macr;','&deg;','&plusmn;','&sup2;',
  86.     '&sup3;','&acute;','&micro;','&para;','&middot;','&cedil;','&sup1;',
  87.     '&ordm;','&raquo;','&frac14;','&frac12;','&frac34;','&iquest;','&Agrave;',
  88.     '&Aacute;','&Acirc;','&Atilde;','&Auml;','&Aring;','&AElig;','&Ccedil;',
  89.     '&Egrave;','&Eacute;','&Ecirc;','&Euml;','&Igrave;','&Iacute;','&Icirc;',
  90.     '&Iuml;','&ETH;','&Ntilde;','&Ograve;','&Oacute;','&Ocirc;','&Otilde;',
  91.     '&Ouml;','&times;','&Oslash;','&Ugrave;','&Uacute;','&Ucirc;','&Uuml;',
  92.     '&Yacute;','&THORN;','&szlig;','&agrave;','&aacute;','&acirc;','&atilde;',
  93.     '&auml;','&aring;','&aelig;','&ccedil;','&egrave;','&eacute;','&ecirc;',
  94.     '&euml;','&igrave;','&iacute;','&icirc;','&iuml;','&eth;','&ntilde;',
  95.     '&ograve;','&oacute;','&ocirc;','&otilde;','&ouml;','&divide;','&oslash;',
  96.     '&ugrave;','&uacute;','&ucirc;','&uuml;','&yacute;','&thorn;','&yuml;',
  97.     '&fnof;','&Alpha;','&Beta;','&Gamma;','&Delta;','&Epsilon;','&Zeta;',
  98.     '&Eta;','&Theta;','&Iota;','&Kappa;','&Lambda;','&Mu;','&Nu;','&Xi;',
  99.     '&Omicron;','&Pi;','&Rho;','&Sigma;','&Tau;','&Upsilon;','&Phi;','&Chi;',
  100.     '&Psi;','&Omega;','&alpha;','&beta;','&gamma;','&delta;','&epsilon;',
  101.     '&zeta;','&eta;','&theta;','&iota;','&kappa;','&lambda;','&mu;','&nu;',
  102.     '&xi;','&omicron;','&pi;','&rho;','&sigmaf;','&sigma;','&tau;',
  103.     '&upsilon;','&phi;','&chi;','&psi;','&omega;','&thetasym;','&upsih;',
  104.     '&piv;','&bull;','&hellip;','&prime;','&Prime;','&oline;','&frasl;',
  105.     '&weierp;','&image;','&real;','&trade;','&alefsym;','&larr;','&uarr;',
  106.     '&rarr;','&darr;','&harr;','&crarr;','&lArr;','&uArr;','&rArr;','&dArr;',
  107.     '&hArr;','&forall;','&part;','&exist;','&empty;','&nabla;','&isin;',
  108.     '&notin;','&ni;','&prod;','&sum;','&minus;','&lowast;','&radic;','&prop;',
  109.     '&infin;','&ang;','&and;','&or;','&cap;','&cup;','&int;','&there4;',
  110.     '&sim;','&cong;','&asymp;','&ne;','&equiv;','&le;','&ge;','&sub;','&sup;',
  111.     '&nsub;','&sube;','&supe;','&oplus;','&otimes;','&perp;','&sdot;',
  112.     '&lceil;','&rceil;','&lfloor;','&rfloor;','&lang;','&rang;','&loz;',
  113.     '&spades;','&clubs;','&hearts;','&diams;'
  114.   );
  115.  
  116.   $chaine = str_replace($entite, $unicode, $chaine);
  117.  
  118.   return $chaine;
  119. }
  120.  
  121. ?>

Droit d'auteur / propriété intellectuelle :

Sauf mention contraire cet article et son contenu sont régis par les conditions suivantes :

Tout contenu tiers est régi par les conditions des ayants droit.

Tout autre contenu ou ressource est soumis à l'acceptation du contrat Creative Commons by-nc-nd (Paternité - Pas d'Utilisation Commerciale - Pas de Modification).

Tout autre code source est soumis à l'acceptation du Contrat de Licence de Logiciel Libre CeCILL-B

En cas de non acceptation de tout ou partie des conditions (incluant celles des contenus tiers), le contenu de cet article reste la propriété morale et patrimoniale de son auteur, et tout usage non autorisé par écrit est explicitement proscrit.