[ Index ]
 

Code source de SPIP 1.8.3

Accédez au Source d'autres logiciels libres | Soutenez Angelica Josefina !

title

Body

[fermer]

/ecrire/ -> inc_charsets.php3 (source)

   1  <?php
   2  
   3  /***************************************************************************\
   4   *  SPIP, Systeme de publication pour l'internet                           *
   5   *                                                                         *
   6   *  Copyright (c) 2001-2005                                                *
   7   *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
   8   *                                                                         *
   9   *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  10   *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
  11  \***************************************************************************/
  12  
  13  
  14  //
  15  // Ce fichier ne sera execute qu'une fois
  16  if (defined("_ECRIRE_INC_CHARSETS")) return;
  17  define("_ECRIRE_INC_CHARSETS", "1");
  18  
  19  
  20  /* charsets supportes en natif (les autres via mb_string) :
  21      utf-8 ;
  22      iso-8859-1 ; iso-8859-9 ; iso-8859-15 ;
  23      windows-1251  = CP1251 ;
  24  */
  25  function load_charset ($charset = 'AUTO', $langue_site = 'AUTO') {
  26      if ($charset == 'AUTO')
  27          $charset = lire_meta('charset');
  28      if (is_array($GLOBALS['CHARSET'][$charset]))
  29          return $charset;
  30  
  31      if ($langue_site == 'AUTO')
  32          $langue_site = lire_meta('langue_site');
  33  
  34      switch (strtolower($charset)) {
  35      case 'utf-8':
  36          $GLOBALS['CHARSET'][$charset] = array();
  37          return $charset;
  38  
  39      // iso latin 1
  40      case 'iso-8859-1':
  41      case '':
  42          $GLOBALS['CHARSET'][$charset] = array (
  43          128=>128, 129=>129, 130=>130, 131=>131, 132=>132, 133=>133, 134=>134, 135=>135,
  44          136=>136, 137=>137, 138=>138, 139=>139, 140=>140, 141=>141, 142=>142, 143=>143,
  45          144=>144, 145=>145, 146=>146, 147=>147, 148=>148, 149=>149, 150=>150, 151=>151,
  46          152=>152, 153=>153, 154=>154, 155=>155, 156=>156, 157=>157, 158=>158, 159=>159,
  47          160=>160, 161=>161, 162=>162, 163=>163, 164=>164, 165=>165, 166=>166, 167=>167,
  48          168=>168, 169=>169, 170=>170, 171=>171, 172=>172, 173=>173, 174=>174, 175=>175,
  49          176=>176, 177=>177, 178=>178, 179=>179, 180=>180, 181=>181, 182=>182, 183=>183,
  50          184=>184, 185=>185, 186=>186, 187=>187, 188=>188, 189=>189, 190=>190, 191=>191,
  51          192=>192, 193=>193, 194=>194, 195=>195, 196=>196, 197=>197, 198=>198, 199=>199,
  52          200=>200, 201=>201, 202=>202, 203=>203, 204=>204, 205=>205, 206=>206, 207=>207,
  53          208=>208, 209=>209, 210=>210, 211=>211, 212=>212, 213=>213, 214=>214, 215=>215,
  54          216=>216, 217=>217, 218=>218, 219=>219, 220=>220, 221=>221, 222=>222, 223=>223,
  55          224=>224, 225=>225, 226=>226, 227=>227, 228=>228, 229=>229, 230=>230, 231=>231,
  56          232=>232, 233=>233, 234=>234, 235=>235, 236=>236, 237=>237, 238=>238, 239=>239,
  57          240=>240, 241=>241, 242=>242, 243=>243, 244=>244, 245=>245, 246=>246, 247=>247,
  58          248=>248, 249=>249, 250=>250, 251=>251, 252=>252, 253=>253, 254=>254, 255=>255
  59          );
  60          return $charset;
  61  
  62  
  63      // iso latin 9 - Turc <alexis@nds.k12.tr>
  64      case 'iso-8859-9':
  65          load_charset('iso-8859-1');
  66          $trans = $GLOBALS['CHARSET']['iso-8859-1'];
  67          $trans[240]=287; //gbreve
  68          $trans[208]=286; //Gbreve
  69          $trans[221]=304; //Idot
  70          $trans[253]=305; //inodot
  71          $trans[254]=351; //scedil
  72          $trans[222]=350; //Scedil
  73          $GLOBALS['CHARSET'][$charset] = $trans;
  74          return $charset;
  75  
  76  
  77      // iso latin 15 - Gaetan Ryckeboer <gryckeboer@virtual-net.fr>
  78      case 'iso-8859-15':
  79          load_charset('iso-8859-1');
  80          $trans = $GLOBALS['CHARSET']['iso-8859-1'];
  81          $trans[164]=8364;
  82          $trans[166]=352;
  83          $trans[168]=353;
  84          $trans[180]=381;
  85          $trans[184]=382;
  86          $trans[188]=338;
  87          $trans[189]=339;
  88          $trans[190]=376;
  89          $GLOBALS['CHARSET'][$charset] = $trans;
  90          return $charset;
  91  
  92  
  93      // cyrillic - ref. http://czyborra.com/charsets/cyrillic.html
  94      case 'windows-1251':
  95      case 'cp1251':
  96          $GLOBALS['CHARSET'][$charset] = array (
  97          0x80=>0x0402, 0x81=>0x0403, 0x82=>0x201A, 0x83=>0x0453, 0x84=>0x201E,
  98          0x85=>0x2026, 0x86=>0x2020, 0x87=>0x2021, 0x88=>0x20AC, 0x89=>0x2030,
  99          0x8A=>0x0409, 0x8B=>0x2039, 0x8C=>0x040A, 0x8D=>0x040C, 0x8E=>0x040B,
 100          0x8F=>0x040F, 0x90=>0x0452, 0x91=>0x2018, 0x92=>0x2019, 0x93=>0x201C,
 101          0x94=>0x201D, 0x95=>0x2022, 0x96=>0x2013, 0x97=>0x2014, 0x99=>0x2122,
 102          0x9A=>0x0459, 0x9B=>0x203A, 0x9C=>0x045A, 0x9D=>0x045C, 0x9E=>0x045B,
 103          0x9F=>0x045F, 0xA0=>0x00A0, 0xA1=>0x040E, 0xA2=>0x045E, 0xA3=>0x0408,
 104          0xA4=>0x00A4, 0xA5=>0x0490, 0xA6=>0x00A6, 0xA7=>0x00A7, 0xA8=>0x0401,
 105          0xA9=>0x00A9, 0xAA=>0x0404, 0xAB=>0x00AB, 0xAC=>0x00AC, 0xAD=>0x00AD,
 106          0xAE=>0x00AE, 0xAF=>0x0407, 0xB0=>0x00B0, 0xB1=>0x00B1, 0xB2=>0x0406,
 107          0xB3=>0x0456, 0xB4=>0x0491, 0xB5=>0x00B5, 0xB6=>0x00B6, 0xB7=>0x00B7,
 108          0xB8=>0x0451, 0xB9=>0x2116, 0xBA=>0x0454, 0xBB=>0x00BB, 0xBC=>0x0458,
 109          0xBD=>0x0405, 0xBE=>0x0455, 0xBF=>0x0457, 0xC0=>0x0410, 0xC1=>0x0411,
 110          0xC2=>0x0412, 0xC3=>0x0413, 0xC4=>0x0414, 0xC5=>0x0415, 0xC6=>0x0416,
 111          0xC7=>0x0417, 0xC8=>0x0418, 0xC9=>0x0419, 0xCA=>0x041A, 0xCB=>0x041B,
 112          0xCC=>0x041C, 0xCD=>0x041D, 0xCE=>0x041E, 0xCF=>0x041F, 0xD0=>0x0420,
 113          0xD1=>0x0421, 0xD2=>0x0422, 0xD3=>0x0423, 0xD4=>0x0424, 0xD5=>0x0425,
 114          0xD6=>0x0426, 0xD7=>0x0427, 0xD8=>0x0428, 0xD9=>0x0429, 0xDA=>0x042A,
 115          0xDB=>0x042B, 0xDC=>0x042C, 0xDD=>0x042D, 0xDE=>0x042E, 0xDF=>0x042F,
 116          0xE0=>0x0430, 0xE1=>0x0431, 0xE2=>0x0432, 0xE3=>0x0433, 0xE4=>0x0434,
 117          0xE5=>0x0435, 0xE6=>0x0436, 0xE7=>0x0437, 0xE8=>0x0438, 0xE9=>0x0439,
 118          0xEA=>0x043A, 0xEB=>0x043B, 0xEC=>0x043C, 0xED=>0x043D, 0xEE=>0x043E,
 119          0xEF=>0x043F, 0xF0=>0x0440, 0xF1=>0x0441, 0xF2=>0x0442, 0xF3=>0x0443,
 120          0xF4=>0x0444, 0xF5=>0x0445, 0xF6=>0x0446, 0xF7=>0x0447, 0xF8=>0x0448,
 121          0xF9=>0x0449, 0xFA=>0x044A, 0xFB=>0x044B, 0xFC=>0x044C, 0xFD=>0x044D,
 122          0xFE=>0x044E, 0xFF=>0x044F); // fin windows-1251
 123          return $charset;
 124      
 125      // arabic - george kandalaft - http://www.microsoft.com/typography/unicode/1256.htm
 126      case 'windows-1256':
 127      case 'cp1256':
 128          $GLOBALS['CHARSET'][$charset] = array (
 129          0x80=>0x20AC, 0x81=>0x067E, 0x82=>0x201A, 0x83=>0x0192, 0x84=>0x201E,
 130          0x85=>0x2026, 0x86=>0x2020, 0x87=>0x2021, 0x88=>0x02C6, 0x89=>0x2030,
 131          0x8A=>0x0679, 0x8B=>0x2039, 0x8C=>0x0152, 0x8D=>0x0686, 0x8E=>0x0698,
 132          0x8F=>0x0688, 0x90=>0x06AF, 0x91=>0x2018, 0x92=>0x2019, 0x93=>0x201C,
 133          0x94=>0x201D, 0x95=>0x2022, 0x96=>0x2013, 0x97=>0x2014, 0x98=>0x06A9,
 134          0x99=>0x2122, 0x9A=>0x0691, 0x9B=>0x203A, 0x9C=>0x0153, 0x9D=>0x200C,
 135          0x9E=>0x200D, 0x9F=>0x06BA, 0xA0=>0x00A0, 0xA1=>0x060C, 0xA2=>0x00A2,
 136          0xA3=>0x00A3, 0xA4=>0x00A4, 0xA5=>0x00A5, 0xA6=>0x00A6, 0xA7=>0x00A7,
 137          0xA8=>0x00A8, 0xA9=>0x00A9, 0xAA=>0x06BE, 0xAB=>0x00AB, 0xAC=>0x00AC,
 138          0xAD=>0x00AD, 0xAE=>0x00AE, 0xAF=>0x00AF, 0xB0=>0x00B0, 0xB1=>0x00B1,
 139          0xB2=>0x00B2, 0xB3=>0x00B3, 0xB4=>0x00B4, 0xB5=>0x00B5, 0xB6=>0x00B6,
 140          0xB7=>0x00B7, 0xB8=>0x00B8, 0xB9=>0x00B9, 0xBA=>0x061B, 0xBB=>0x00BB,
 141          0xBC=>0x00BC, 0xBD=>0x00BD, 0xBE=>0x00BE, 0xBF=>0x061F, 0xC0=>0x06C1,
 142          0xC1=>0x0621, 0xC2=>0x0622, 0xC3=>0x0623, 0xC4=>0x0624, 0xC5=>0x0625,
 143          0xC6=>0x0626, 0xC7=>0x0627, 0xC8=>0x0628, 0xC9=>0x0629, 0xCA=>0x062A,
 144          0xCB=>0x062B, 0xCC=>0x062C, 0xCD=>0x062D, 0xCE=>0x062E, 0xCF=>0x062F,
 145          0xD0=>0x0630, 0xD1=>0x0631, 0xD2=>0x0632, 0xD3=>0x0633, 0xD4=>0x0634,
 146          0xD5=>0x0635, 0xD6=>0x0636, 0xD7=>0x00D7, 0xD8=>0x0637, 0xD9=>0x0638,
 147          0xDA=>0x0639, 0xDB=>0x063A, 0xDC=>0x0640, 0xDD=>0x0641, 0xDE=>0x0642,
 148          0xDF=>0x0643, 0xE0=>0x00E0, 0xE1=>0x0644, 0xE2=>0x00E2, 0xE3=>0x0645,
 149          0xE4=>0x0646, 0xE5=>0x0647, 0xE6=>0x0648, 0xE7=>0x00E7, 0xE8=>0x00E8,
 150          0xE9=>0x00E9, 0xEA=>0x00EA, 0xEB=>0x00EB, 0xEC=>0x0649, 0xED=>0x064A,
 151          0xEE=>0x00EE, 0xEF=>0x00EF, 0xF0=>0x064B, 0xF1=>0x064C, 0xF2=>0x064D,
 152          0xF3=>0x064E, 0xF4=>0x00F4, 0xF5=>0x064F, 0xF6=>0x0650, 0xF7=>0x00F7,
 153          0xF8=>0x0651, 0xF9=>0x00F9, 0xFA=>0x0652, 0xFB=>0x00FB, 0xFC=>0x00FC,
 154          0xFD=>0x200E, 0xFE=>0x200F, 0xFF=>0x06D2); // fin windows-1256
 155          return $charset;
 156      // arabic iso-8859-6 - http://czyborra.com/charsets/iso8859.html#ISO-8859-6
 157      case 'iso-8859-6':
 158          load_charset('iso-8859-1');
 159          $trans = $GLOBALS['CHARSET']['iso-8859-1'];
 160          $mod = Array(
 161          0xA0=>0x00A0, 0xA4=>0x00A4, 0xAC=>0x060C, 0xAD=>0x00AD, 0xBB=>0x061B,
 162          0xBF=>0x061F, 0xC1=>0x0621, 0xC2=>0x0622, 0xC3=>0x0623, 0xC4=>0x0624,
 163          0xC5=>0x0625, 0xC6=>0x0626, 0xC7=>0x0627, 0xC8=>0x0628, 0xC9=>0x0629,
 164          0xCA=>0x062A, 0xCB=>0x062B, 0xCC=>0x062C, 0xCD=>0x062D, 0xCE=>0x062E,
 165          0xCF=>0x062F, 0xD0=>0x0630, 0xD1=>0x0631, 0xD2=>0x0632, 0xD3=>0x0633,
 166          0xD4=>0x0634, 0xD5=>0x0635, 0xD6=>0x0636, 0xD7=>0x0637, 0xD8=>0x0638,
 167          0xD9=>0x0639, 0xDA=>0x063A, 0xE0=>0x0640, 0xE1=>0x0641, 0xE2=>0x0642,
 168          0xE3=>0x0643, 0xE4=>0x0644, 0xE5=>0x0645, 0xE6=>0x0646, 0xE7=>0x0647,
 169          0xE8=>0x0648, 0xE9=>0x0649, 0xEA=>0x064A, 0xEB=>0x064B, 0xEC=>0x064C,
 170          0xED=>0x064D, 0xEE=>0x064E, 0xEF=>0x064F, 0xF0=>0x0650, 0xF1=>0x0651,
 171          0xF2=>0x0652
 172          );
 173          foreach ($mod as $num=>$val)
 174              $trans[$num]=$val;
 175          $GLOBALS['CHARSET'][$charset] = $trans;
 176          return $charset;
 177  
 178      // ------------------------------------------------------------------
 179  
 180      // cas particulier pour les entites html (a completer eventuellement)
 181      case 'html':
 182          $GLOBALS['CHARSET'][$charset] = array (
 183          'ldquo'=>'&#147;', 'rdquo'=>'&#148;',
 184          'cent'=>'&#162;', 'pound'=>'&#163;', 'curren'=>'&#164;', 'yen'=>'&#165;', 'brvbar'=>'&#166;',
 185          'sect'=>'&#167;', 'uml'=>'&#168;', 'ordf'=>'&#170;', 'laquo'=>'&#171;', 'not'=>'&#172;',
 186          'shy'=>'&#173;', 'macr'=>'&#175;', 'deg'=>'&#176;', 'plusmn'=>'&#177;', 'sup2'=>'&#178;',
 187          'sup3'=>'&#179;', 'acute'=>'&#180;', 'micro'=>'&#181;', 'para'=>'&#182;', 'middot'=>'&#183;',
 188          'cedil'=>'&#184;', 'sup1'=>'&#185;', 'ordm'=>'&#186;', 'raquo'=>'&#187;', 'iquest'=>'&#191;',
 189          'Agrave'=>'&#192;', 'Aacute'=>'&#193;', 'Acirc'=>'&#194;', 'Atilde'=>'&#195;', 'Auml'=>'&#196;',
 190          'Aring'=>'&#197;', 'AElig'=>'&#198;', 'Ccedil'=>'&#199;', 'Egrave'=>'&#200;', 'Eacute'=>'&#201;',
 191          'Ecirc'=>'&#202;', 'Euml'=>'&#203;', 'Igrave'=>'&#204;', 'Iacute'=>'&#205;', 'Icirc'=>'&#206;',
 192          'Iuml'=>'&#207;', 'ETH'=>'&#208;', 'Ntilde'=>'&#209;', 'Ograve'=>'&#210;', 'Oacute'=>'&#211;',
 193          'Ocirc'=>'&#212;', 'Otilde'=>'&#213;', 'Ouml'=>'&#214;', 'times'=>'&#215;', 'Oslash'=>'&#216;',
 194          'Ugrave'=>'&#217;', 'Uacute'=>'&#218;', 'Ucirc'=>'&#219;', 'Uuml'=>'&#220;', 'Yacute'=>'&#221;',
 195          'THORN'=>'&#222;', 'szlig'=>'&#223;', 'agrave'=>'&#224;', 'aacute'=>'&#225;', 'acirc'=>'&#226;',
 196          'atilde'=>'&#227;', 'auml'=>'&#228;', 'aring'=>'&#229;', 'aelig'=>'&#230;', 'ccedil'=>'&#231;',
 197          'egrave'=>'&#232;', 'eacute'=>'&#233;', 'ecirc'=>'&#234;', 'euml'=>'&#235;', 'igrave'=>'&#236;',
 198          'iacute'=>'&#237;', 'icirc'=>'&#238;', 'iuml'=>'&#239;', 'eth'=>'&#240;', 'ntilde'=>'&#241;',
 199          'ograve'=>'&#242;', 'oacute'=>'&#243;', 'ocirc'=>'&#244;', 'otilde'=>'&#245;', 'ouml'=>'&#246;',
 200          'divide'=>'&#247;', 'oslash'=>'&#248;', 'ugrave'=>'&#249;', 'uacute'=>'&#250;',
 201          'ucirc'=>'&#251;', 'uuml'=>'&#252;', 'yacute'=>'&#253;', 'thorn'=>'&#254;',
 202          'nbsp' => " ", 'copy' => "(c)", 'reg' => "(r)", 'frac14' => "1/4",
 203          'frac12' => "1/2", 'frac34' => "3/4", 'amp' => '&', 'quot' => '"',
 204          'apos' => "'", 'lt' => '<', 'gt' => '>',
 205          'mdash' => '&#8212;', 'ndash' => '&#8211;'
 206          );
 207          return $charset;
 208          
 209      case 'mathml':
 210          $GLOBALS['CHARSET'][$charset] = array (
 211          'ac' => '&#xE207;',
 212          'acd' => '&#xE3A6;',
 213          'acE' => '&E#290;',
 214          'acute' => '&#x0301;',
 215          'Afr' => '&#xE47C;',
 216          'afr' => '&#xE495;',
 217          'aleph' => '&#x2135;',
 218          'alpha' => '&#x03B1;',
 219          'amalg' => '&#xE251;',
 220          'amp' => '&#x0026;',
 221          'And' => '&#x2227;',
 222          'and' => '&#x2227;',
 223          'andand' => '&#xE36E;',
 224          'andd' => '&#xE394;',
 225          'andslope' => '&#xE50A;',
 226          'andv' => '&#xE391;',
 227          'ang' => '&#x2220;',
 228          'ange' => '&#xE2D6;',
 229          'angle' => '&#x2220;',
 230          'angmsd' => '&#x2221;',
 231          'angmsdaa' => '&#xE2D9;',
 232          'angmsdab' => '&#xE2DA;',
 233          'angmsdac' => '&#xE2DB;',
 234          'angmsdad' => '&#xE2DC;',
 235          'angmsdae' => '&#xE2DD;',
 236          'angmsdaf' => '&#xE2DE;',
 237          'angmsdag' => '&#xE2DF;',
 238          'angmsdah' => '&#xE2E0;',
 239          'angrt' => '&#x221F;',
 240          'angrtvb' => '&#xE418;',
 241          'angrtvbd' => '&#xE2E1;',
 242          'angsph' => '&#x2222;',
 243          'angst' => '&#x212B;',
 244          'angzarr' => '&#xE248;',
 245          'Aopf' => '&#xE4AF;',
 246          'ap' => '&#x2248;',
 247          'apacir' => '&#xE38C;',
 248          'apE' => '&#xE315;',
 249          'ape' => '&#x224A;',
 250          'apid' => '&#x224B;',
 251          'apos' => '&#x0027;',
 252          'approx' => '&#x2248;',
 253          'approxeq' => '&#x224A;',
 254          'Ascr' => '&#xE4C5;',
 255          'ascr' => '&#xE4DF;',
 256          'ast' => '&#x2217;',
 257          'asymp' => '&#x224D;',
 258          'awconint' => '&#x2233;',
 259          'awint' => '&#xE39B;',
 260          'backcong' => '&#x224C;',
 261          'backepsilon' => '&#xE420;',
 262          'backprime' => '&#x2035;',
 263          'backsim' => '&#x223D;',
 264          'backsimeq' => '&#x22CD;',
 265          'Backslash' => '&#x2216;',
 266          'Barv' => '&#xE311;',
 267          'barvee' => '&#x22BD;',
 268          'Barwed' => '&#x2306;',
 269          'barwed' => '&#x22BC;',
 270          'barwedge' => '&#x22BC;',
 271          'bbrk' => '&#xE2EE;',
 272          'bbrktbrk' => '&#xE419;',
 273          'bcong' => '&#x224C;',
 274          'becaus' => '&#x2235;',
 275          'Because' => '&#x2235;',
 276          'because' => '&#x2235;',
 277          'bemptyv' => '&#xE41A;',
 278          'benzen' => '&#xE43C;',
 279          'benzena' => '&#xE42A;',
 280          'benzenb' => '&#xE42B;',
 281          'benzenc' => '&#xE42C;',
 282          'benzend' => '&#xE42D;',
 283          'benzene' => '&#xE42E;',
 284          'benzenf' => '&#xE42F;',
 285          'benzeng' => '&#xE430;',
 286          'benzenh' => '&#xE431;',
 287          'benzeni' => '&#xE432;',
 288          'benzenj' => '&#xE433;',
 289          'benzenk' => '&#xE434;',
 290          'benzenl' => '&#xE435;',
 291          'benzenm' => '&#xE436;',
 292          'benzenn' => '&#xE437;',
 293          'benzeno' => '&#xE438;',
 294          'benzenp' => '&#xE439;',
 295          'benzenq' => '&#xE43A;',
 296          'benzenr' => '&#xE43B;',
 297          'bepsi' => '&#xE420;',
 298          'bernou' => '&#x212C;',
 299          'beta' => '&#x03B2;',
 300          'beth' => '&#x2136;',
 301          'between' => '&#x226C;',
 302          'Bfr' => '&#xE47D;',
 303          'bfr' => '&#xE496;',
 304          'bigcap' => '&#x22C2;',
 305          'bigcirc' => '&#x25CB;',
 306          'bigcup' => '&#x22C3;',
 307          'bigodot' => '&#x2299;',
 308          'bigoplus' => '&#x2295;',
 309          'bigotimes' => '&#x2297;',
 310          'bigsqcup' => '&#x2294;',
 311          'bigstar' => '&#x2605;',
 312          'bigtriangledown' => '&#x25BD;',
 313          'bigtriangleup' => '&#x25B3;',
 314          'biguplus' => '&#x228E;',
 315          'bigvee' => '&#x22C1;',
 316          'bigwedge' => '&#x22C0;',
 317          'bkarow' => '&#xE405;',
 318          'blacklozenge' => '&#xE501;',
 319          'blacksquare' => '&#x25A0;',
 320          'blacktriangle' => '&#x25B4;',
 321          'blacktriangledown' => '&#x25BE;',
 322          'blacktriangleleft' => '&#x25C2;',
 323          'blacktriangleright' => '&#x25B8;',
 324          'blank' => '&#xE4F9;',
 325          'blk12' => '&#x2592;',
 326          'blk14' => '&#x2591;',
 327          'blk34' => '&#x2593;',
 328          'block' => '&#x2588;',
 329          'bne' => '&#xE388;',
 330          'bnequiv' => '&#xE387;',
 331          'bNot' => '&#xE3AD;',
 332          'bnot' => '&#x2310;',
 333          'Bopf' => '&#xE4B0;',
 334          'bot' => '&#x22A5;',
 335          'bottom' => '&#x22A5;',
 336          'bowtie' => '&#x22C8;',
 337          'boxbox' => '&#xE2E6;',
 338          'boxminus' => '&#x229F;',
 339          'boxplus' => '&#x229E;',
 340          'boxtimes' => '&#x22A0;',
 341          'bprime' => '&#x2035;',
 342          'Breve' => '&#x0306;',
 343          'breve' => '&#x0306;',
 344          'brvbar' => '&#x00A6;',
 345          'Bscr' => '&#xE4C6;',
 346          'bscr' => '&#xE4E0;',
 347          'bsemi' => '&#xE2ED;',
 348          'bsim' => '&#x223D;',
 349          'bsime' => '&#x22CD;',
 350          'bsol' => '&#x005C;',
 351          'bsolb' => '&#xE280;',
 352          'bsolhsub' => '&#xE34D;',
 353          'bull' => '&#x2022;',
 354          'bullet' => '&#x2022;',
 355          'bump' => '&#x224E;',
 356          'bumpe' => '&#x224F;',
 357          'Bumpeq' => '&#x224E;',
 358          'bumpeq' => '&#x224F;',
 359          'Cap' => '&#x22D2;',
 360          'cap' => '&#x2229;',
 361          'capand' => '&#xE281;',
 362          'capbrcup' => '&#xE271;',
 363          'capcap' => '&#xE273;',
 364          'capcup' => '&#xE26F;',
 365          'capdot' => '&#xE261;',
 366          'caps' => '&#xE275;',
 367          'caret' => '&#x2038;',
 368          'caron' => '&#x030C;',
 369          'ccaps' => '&#xE279;',
 370          'Cconint' => '&#x2230;',
 371          'ccups' => '&#xE278;',
 372          'ccupssm' => '&#xE27A;',
 373          'cdot' => '&#x22C5;',
 374          'cedil' => '&#x0327;',
 375          'Cedilla' => '&#x0327;',
 376          'cemptyv' => '&#xE2E8;',
 377          'cent' => '&#x00A2;',
 378          'CenterDot' => '&#x00B7;',
 379          'centerdot' => '&#x00B7;',
 380          'Cfr' => '&#xE47E;',
 381          'cfr' => '&#xE497;',
 382          'check' => '&#x2713;',
 383          'checkmark' => '&#x2713;',
 384          'chi' => '&#x03C7;',
 385          'cir' => '&#x2218;',
 386          'circ' => '&#x2218;',
 387          'circeq' => '&#x2257;',
 388          'circle' => '&#xE4FA;',
 389          'circlearrowleft' => '&#x21BA;',
 390          'circlearrowright' => '&#x21BB;',
 391          'circledast' => '&#x229B;',
 392          'circledcirc' => '&#x229A;',
 393          'circleddash' => '&#x229D;',
 394          'CircleDot' => '&#x2299;',
 395          'circledR' => '&#x00AF;',
 396          'circledS' => '&#xE41D;',
 397          'circlef' => '&#x25CF;',
 398          'circlefb' => '&#x25D2;',
 399          'circlefl' => '&#x25D0;',
 400          'circlefr' => '&#x25D1;',
 401          'circleft' => '&#x25D3;',
 402          'CircleMinus' => '&#x2296;',
 403          'CirclePlus' => '&#x2295;',
 404          'CircleTimes' => '&#x2297;',
 405          'cirE' => '&#xE41B;',
 406          'cire' => '&#x2257;',
 407          'cirfnint' => '&#xE395;',
 408          'cirmid' => '&#xE250;',
 409          'cirscir' => '&#xE41C;',
 410          'ClockwiseContourIntegral' => '&#x2232;',
 411          'CloseCurlyDoubleQuote' => '&#x201D;',
 412          'CloseCurlyQuote' => '&#x2019;',
 413          'clubs' => '&#x2663;',
 414          'clubsuit' => '&#x2663;',
 415          'Colon' => '&#x2237;',
 416          'colon' => '&#x003A;',
 417          'Colone' => '&#xE30E;',
 418          'colone' => '&#x2254;',
 419          'coloneq' => '&#x2254;',
 420          'comma' => '&#x002C;',
 421          'commat' => '&#x0040;',
 422          'comp' => '&#x2201;',
 423          'compfn' => '&#x2218;',
 424          'complement' => '&#x2201;',
 425          'cong' => '&#x2245;',
 426          'congdot' => '&#xE314;',
 427          'Congruent' => '&#x2261;',
 428          'Conint' => '&#x222F;',
 429          'conint' => '&#x222E;',
 430          'ContourIntegral' => '&#x222E;',
 431          'Copf' => '&#x2102;',
 432          'coprod' => '&#x2210;',
 433          'Coproduct' => '&#x2210;',
 434          'copy' => '&#x00A9;',
 435          'copysr' => '&#x2117;',
 436          'CounterClockwiseContourIntegral' => '&#x2233;',
 437          'cross' => '&#x2612;',
 438          'Cscr' => '&#xE4C7;',
 439          'cscr' => '&#xE4E1;',
 440          'csub' => '&#xE351;',
 441          'csube' => '&#xE353;',
 442          'csup' => '&#xE352;',
 443          'csupe' => '&#xE354;',
 444          'ctdot' => '&#x22EF;',
 445          'cudarrl' => '&#xE23E;',
 446          'cudarrr' => '&#xE400;',
 447          'cuepr' => '&#x22DE;',
 448          'cuesc' => '&#x22DF;',
 449          'cularr' => '&#x21B6;',
 450          'cularrp' => '&#xE24A;',
 451          'Cup' => '&#x2323;',
 452          'cup' => '&#x222A;',
 453          'cupbrcap' => '&#xE270;',
 454          'CupCap' => '&#x224D;',
 455          'cupcap' => '&#xE26E;',
 456          'cupcup' => '&#xE272;',
 457          'cupdot' => '&#x228D;',
 458          'cupor' => '&#xE282;',
 459          'cups' => '&#xE274;',
 460          'curarr' => '&#x21B7;',
 461          'curarrm' => '&#xE249;',
 462          'curlyeqprec' => '&#x22DE;',
 463          'curlyeqsucc' => '&#x22DF;',
 464          'curlyvee' => '&#x22CE;',
 465          'curlywedge' => '&#x22CF;',
 466          'curren' => '&#x00A4;',
 467          'curvearrowleft' => '&#x21B6;',
 468          'curvearrowright' => '&#x21B7;',
 469          'cuvee' => '&#x22CE;',
 470          'cuwed' => '&#x22CF;',
 471          'cwconint' => '&#x2232;',
 472          'cwint' => '&#x2231;',
 473          'cylcty' => '&#x232D;',
 474          'Dagger' => '&#x2021;',
 475          'dagger' => '&#x2020;',
 476          'daleth' => '&#x2138;',
 477          'Darr' => '&#x21A1;',
 478          'dArr' => '&#x21D3;',
 479          'darr' => '&#x2193;',
 480          'dash' => '&#x2010;',
 481          'Dashv' => '&#xE30F;',
 482          'dashv' => '&#x22A3;',
 483          'dbkarow' => '&#xE207;',
 484          'dblac' => '&#x030B;',
 485          'ddagger' => '&#x2021;',
 486          'ddarr' => '&#x21CA;',
 487          'DDotrahd' => '&#xE238;',
 488          'ddotseq' => '&#xE309;',
 489          'deg' => '&#x00B0;',
 490          'Del' => '&#x2207;',
 491          'Delta' => '&#x0394;',
 492          'delta' => '&#x03B4;',
 493          'demptyv' => '&#xE2E7;',
 494          'dfisht' => '&#xE24C;',
 495          'Dfr' => '&#xE47F;',
 496          'dfr' => '&#xE498;',
 497          'dHar' => '&#xE227;',
 498          'dharl' => '&#x21C3;',
 499          'dharr' => '&#x21C2;',
 500          'DiacriticalAcute' => '&#x0301;',
 501          'DiacriticalDot' => '&#x0307;',
 502          'DiacriticalDoubleAcute' => '&#x030B;',
 503          'DiacriticalGrave' => '&#x0300;',
 504          'DiacriticalLeftArrow' => '&#x20D6;',
 505          'DiacriticalLeftRightArrow' => '&#x20E1;',
 506          'DiacriticalLeftRightVector' => '&#xF505;',
 507          'DiacriticalLeftVector' => '&#x20D0;',
 508          'DiacriticalRightArrow' => '&#x20D7;',
 509          'DiacriticalRightVector' => '&#x20D1;',
 510          'DiacriticalTilde' => '&#x0303;',
 511          'diam' => '&#x22C4;',
 512          'diamond' => '&#x22C4;',
 513          'diamondf' => '&#xE4FB;',
 514          'diamondsuit' => '&#x2662;',
 515          'diamonfb' => '&#xE4FC;',
 516          'diamonfl' => '&#xE4FD;',
 517          'diamonfr' => '&#xE4FE;',
 518          'diamonft' => '&#xE4FF;',
 519          'diams' => '&#x2662;',
 520          'die' => '&#x0308;',
 521          'digamma' => '&#x03DC;',
 522          'disin' => '&#xE3A0;',
 523          'div' => '&#x00F7;',
 524          'divide' => '&#x00F7;',
 525          'divideontimes' => '&#x22C7;',
 526          'divonx' => '&#x22C7;',
 527          'dlcorn' => '&#x231E;',
 528          'dlcrop' => '&#x230D;',
 529          'dollar' => '&#x0024;',
 530          'Dopf' => '&#xE4B1;',
 531          'Dot' => '&#x0308;',
 532          'dot' => '&#x0307;',
 533          'DotDot' => '&#x20DC;',
 534          'doteq' => '&#x2250;',
 535          'doteqdot' => '&#x2251;',
 536          'DotEqual' => '&#x2250;',
 537          'dotminus' => '&#x2238;',
 538          'dotplus' => '&#x2214;',
 539          'dotsquare' => '&#x22A1;',
 540          'doublebarwedge' => '&#x2306;',
 541          'DoubleContourIntegral' => '&#x222F;',
 542          'DoubleDot' => '&#x0308;',
 543          'DoubleDownArrow' => '&#x21D3;',
 544          'DoubleLeftArrow' => '&#x21D0;',
 545          'DoubleLeftRightArrow' => '&#x21D4;',
 546          'DoubleLongLeftArrow' => '&#xE200;',
 547          'DoubleLongLeftRightArrow' => '&#xE202;',
 548          'DoubleLongRightArrow' => '&#xE204;',
 549          'DoubleRightArrow' => '&#x21D2;',
 550          'DoubleRightTee' => '&#x22A8;',
 551          'DoubleUpArrow' => '&#x21D1;',
 552          'DoubleUpDownArrow' => '&#x21D5;',
 553          'DoubleVerticalBar' => '&#x2225;',
 554          'DownArrow' => '&#x2193;',
 555          'Downarrow' => '&#x21D3;',
 556          'downarrow' => '&#x2193;',
 557          'DownArrowUpArrow' => '&#xE216;',
 558          'downdownarrows' => '&#x21CA;',
 559          'downharpoonleft' => '&#x21C3;',
 560          'downharpoonright' => '&#x21C2;',
 561          'DownLeftVector' => '&#x21BD;',
 562          'DownRightVector' => '&#x21C1;',
 563          'DownTee' => '&#x22A4;',
 564          'drbkarow' => '&#xE209;',
 565          'drcorn' => '&#x231F;',
 566          'drcrop' => '&#x230C;',
 567          'Dscr' => '&#xE4C8;',
 568          'dscr' => '&#xE4E2;',
 569          'dsol' => '&#xE3A9;',
 570          'dtdot' => '&#x22F1;',
 571          'dtri' => '&#x25BF;',
 572          'dtrif' => '&#x25BE;',
 573          'duarr' => '&#xE216;',
 574          'duhar' => '&#xE217;',
 575          'dwangle' => '&#xE3AA;',
 576          'dzigrarr' => '&#x21DD;',
 577          'easter' => '&#x225B;',
 578          'ecir' => '&#x2256;',
 579          'ecolon' => '&#x2255;',
 580          'eDDot' => '&#xE309;',
 581          'eDot' => '&#x2251;',
 582          'efDot' => '&#x2252;',
 583          'Efr' => '&#xE480;',
 584          'efr' => '&#xE499;',
 585          'eg' => '&#xE328;',
 586          'egs' => '&#x22DD;',
 587          'egsdot' => '&#xE324;',
 588          'el' => '&#xE327;',
 589          'Element' => '&#x2208;',
 590          'elinters' => '&#xE3A7;',
 591          'ell' => '&#x2113;',
 592          'els' => '&#x22DC;',
 593          'elsdot' => '&#xE323;',
 594          'empty' => '&#xE2D3;',
 595          'emptyset' => '&#xE2D3;',
 596          'emptyv' => '&#x2205;',
 597          'emsp' => '&#x2003;',
 598          'emsp13' => '&#x2004;',
 599          'emsp14' => '&#x2005;',
 600          'ensp' => '&#x2002;',
 601          'Eopf' => '&#xE4B2;',
 602          'epar' => '&#x22D5;',
 603          'eparsl' => '&#xE384;',
 604          'eplus' => '&#xE268;',
 605          'epsi' => '&#x220A;',
 606          'epsiv' => '&#x03B5;',
 607          'eqcirc' => '&#x2256;',
 608          'eqcolon' => '&#x2255;',
 609          'eqsim' => '&#x2242;',
 610          'eqslantgtr' => '&#x22DD;',
 611          'eqslantless' => '&#x22DC;',
 612          'equals' => '&#x003D;',
 613          'EqualTilde' => '&#x2242;',
 614          'equest' => '&#x225F;',
 615          'Equilibrium' => '&#x21CC;',
 616          'equiv' => '&#x2261;',
 617          'equivDD' => '&#xE318;',
 618          'eqvparsl' => '&#xE386;',
 619          'erarr' => '&#xE236;',
 620          'erDot' => '&#x2253;',
 621          'Escr' => '&#xE4C9;',
 622          'escr' => '&#xE4E3;',
 623          'esdot' => '&#x2250;',
 624          'Esim' => '&#xE317;',
 625          'esim' => '&#x2242;',
 626          'eta' => '&#x03B7;',
 627          'excl' => '&#x0021;',
 628          'exist' => '&#x2203;',
 629          'Exists' => '&#x2203;',
 630          'fallingdotseq' => '&#x2252;',
 631          'female' => '&#x2640;',
 632          'ffilig' => '&#xFB03;',
 633          'fflig' => '&#xFB00;',
 634          'ffllig' => '&#xFB04;',
 635          'Ffr' => '&#xE481;',
 636          'ffr' => '&#xE49A;',
 637          'filig' => '&#xFB01;',
 638          'fjlig' => '&#xE500;',
 639          'flat' => '&#x266D;',
 640          'fllig' => '&#xFB02;',
 641          'fltns' => '&#xE381;',
 642          'Fopf' => '&#xE4B3;',
 643          'ForAll' => '&#x2200;',
 644          'forall' => '&#x2200;',
 645          'fork' => '&#x22D4;',
 646          'forkv' => '&#xE31B;',
 647          'fpartint' => '&#xE396;',
 648          'frac12' => '&#x00BD;',
 649          'frac13' => '&#x2153;',
 650          'frac14' => '&#x00BC;',
 651          'frac15' => '&#x2155;',
 652          'frac16' => '&#x2159;',
 653          'frac18' => '&#x215B;',
 654          'frac23' => '&#x2254;',
 655          'frac25' => '&#x2156;',
 656          'frac34' => '&#x00BE;',
 657          'frac35' => '&#x2157;',
 658          'frac38' => '&#x215C;',
 659          'frac45' => '&#x2158;',
 660          'frac56' => '&#x215A;',
 661          'frac58' => '&#x215D;',
 662          'frac78' => '&#x215E;',
 663          'frown' => '&#x2322;',
 664          'Fscr' => '&#xE4CA;',
 665          'fscr' => '&#xE4E4;',
 666          'Gamma' => '&#x0393;',
 667          'gamma' => '&#x03B3;',
 668          'Gammad' => '&#x03DC;',
 669          'gammad' => '&#x03DC;',
 670          'gap' => '&#x2273;',
 671          'gE' => '&#x2267;',
 672          'ge' => '&#x2265;',
 673          'gEl' => '&#x22DB;',
 674          'gel' => '&#x22DB;',
 675          'geq' => '&#x2265;',
 676          'geqq' => '&#x2267;',
 677          'geqslant' => '&#xE421;',
 678          'ges' => '&#xE421;',
 679          'gescc' => '&#xE358;',
 680          'gesdot' => '&#xE31E;',
 681          'gesdoto' => '&#xE320;',
 682          'gesdotol' => '&#xE322;',
 683          'gesl' => '&#xE32C;',
 684          'gesles' => '&#xE332;',
 685          'Gfr' => '&#xE482;',
 686          'gfr' => '&#xE49B;',
 687          'Gg' => '&#x22D9;',
 688          'gg' => '&#x226B;',
 689          'ggg' => '&#x22D9;',
 690          'gimel' => '&#x2137;',
 691          'gl' => '&#x2277;',
 692          'gla' => '&#xE330;',
 693          'glE' => '&#xE32E;',
 694          'glj' => '&#xE32F;',
 695          'gnap' => '&#xE411;',
 696          'gnapprox' => '&#xE411;',
 697          'gnE' => '&#x2269;',
 698          'gne' => '&#x2269;',
 699          'gneq' => '&#x2269;',
 700          'gneqq' => '&#x2269;',
 701          'gnsim' => '&#x22E7;',
 702          'Gopf' => '&#xE4B4;',
 703          'grave' => '&#x0300;',
 704          'GreaterEqual' => '&#x2265;',
 705          'GreaterEqualLess' => '&#x22DB;',
 706          'GreaterFullEqual' => '&#x2267;',
 707          'GreaterLess' => '&#x2277;',
 708          'GreaterSlantEqual' => '&#xE421;',
 709          'GreaterTilde' => '&#x2273;',
 710          'Gscr' => '&#xE4CB;',
 711          'gscr' => '&#xE4E5;',
 712          'gsim' => '&#x2273;',
 713          'gsime' => '&#xE334;',
 714          'gsiml' => '&#xE336;',
 715          'Gt' => '&#x226B;',
 716          'gt' => '&#x003E;',
 717          'gtcc' => '&#xE356;',
 718          'gtcir' => '&#xE326;',
 719          'gtdot' => '&#x22D7;',
 720          'gtlPar' => '&#xE296;',
 721          'gtquest' => '&#xE32A;',
 722          'gtrapprox' => '&#x2273;',
 723          'gtrarr' => '&#xE35F;',
 724          'gtrdot' => '&#x22D7;',
 725          'gtreqless' => '&#x22DB;',
 726          'gtreqqless' => '&#x22DB;',
 727          'gtrless' => '&#x2277;',
 728          'gtrsim' => '&#x2273;',
 729          'gvertneqq' => '&#xE2A1;',
 730          'gvnE' => '&#xE2A1;',
 731          'Hacek' => '&#x030C;',
 732          'hairsp' => '&#x200A;',
 733          'half' => '&#x00BD;',
 734          'hamilt' => '&#x210B;',
 735          'hArr' => '&#x21D4;',
 736          'harr' => '&#x2194;',
 737          'harrcir' => '&#xE240;',
 738          'harrw' => '&#x21AD;',
 739          'Hat' => '&#x0302;',
 740          'hbar' => '&#xE2D5;',
 741          'hbenzen' => '&#xE44F;',
 742          'hbenzena' => '&#xE43D;',
 743          'hbenzenb' => '&#xE43E;',
 744          'hbenzenc' => '&#xE43F;',
 745          'hbenzend' => '&#xE440;',
 746          'hbenzene' => '&#xE441;',
 747          'hbenzenf' => '&#xE442;',
 748          'hbenzeng' => '&#xE443;',
 749          'hbenzenh' => '&#xE444;',
 750          'hbenzeni' => '&#xE445;',
 751          'hbenzenj' => '&#xE446;',
 752          'hbenzenk' => '&#xE447;',
 753          'hbenzenl' => '&#xE448;',
 754          'hbenzenm' => '&#xE449;',
 755          'hbenzenn' => '&#xE44A;',
 756          'hbenzeno' => '&#xE44B;',
 757          'hbenzenp' => '&#xE44C;',
 758          'hbenzenq' => '&#xE44D;',
 759          'hbenzenr' => '&#xE44E;',
 760          'hearts' => '&#x2661;',
 761          'heartsuit' => '&#x2661;',
 762          'hellip' => '&#x2026;',
 763          'hercon' => '&#x22B9;',
 764          'Hfr' => '&#xE483;',
 765          'hfr' => '&#xE49C;',
 766          'hksearow' => '&#xE20B;',
 767          'hkswarow' => '&#xE20A;',
 768          'hoarr' => '&#xE243;',
 769          'homtht' => '&#x223B;',
 770          'hookleftarrow' => '&#x21A9;',
 771          'hookrightarrow' => '&#x21AA;',
 772          'Hopf' => '&#xE4B5;',
 773          'horbar' => '&#x2015;',
 774          'Hscr' => '&#xE4CC;',
 775          'hscr' => '&#xE4E6;',
 776          'hslash' => '&#x210F;',
 777          'HumpDownHump' => '&#x224E;',
 778          'HumpEqual' => '&#x224F;',
 779          'hybull' => '&#x2043;',
 780          'hyphen' => '&#xE4F8;',
 781          'iexcl' => '&#x00A1;',
 782          'iff' => '&#xE365;',
 783          'Ifr' => '&#xE484;',
 784          'ifr' => '&#xE49D;',
 785          'iiiint' => '&#xE378;',
 786          'iiint' => '&#x222D;',
 787          'iinfin' => '&#xE372;',
 788          'iiota' => '&#x2129;',
 789          'Im' => '&#x2111;',
 790          'image' => '&#x2111;',
 791          'imath' => '&#x0131;',
 792          'imof' => '&#x22B7;',
 793          'imped' => '&#xE50B;',
 794          'Implies' => '&#x21D2;',
 795          'in' => '&#x220A;',
 796          'incare' => '&#x2105;',
 797          'infin' => '&#x221E;',
 798          'infintie' => '&#xE50C;',
 799          'Int' => '&#x222C;',
 800          'int' => '&#x222B;',
 801          'intcal' => '&#x22BA;',
 802          'Integral' => '&#x222B;',
 803          'intercal' => '&#x22BA;',
 804          'Intersection' => '&#x22C2;',
 805          'intlarhk' => '&#xE39A;',
 806          'intprod' => '&#xE259;',
 807          'Iopf' => '&#xE4B6;',
 808          'iota' => '&#x03B9;',
 809          'iprod' => '&#xE259;',
 810          'iquest' => '&#x00BF;',
 811          'Iscr' => '&#xE4CD;',
 812          'iscr' => '&#xE4E7;',
 813          'isin' => '&#x220A;',
 814          'isindot' => '&#xE39C;',
 815          'isinE' => '&#xE39E;',
 816          'isins' => '&#xE3A4;',
 817          'isinsv' => '&#xE3A2;',
 818          'isinv' => '&#x2208;',
 819          'Jfr' => '&#xE485;',
 820          'jfr' => '&#xE49E;',
 821          'jmath' => '&#xE2D4;',
 822          'Jopf' => '&#xE4B7;',
 823          'Jscr' => '&#xE4CE;',
 824          'jscr' => '&#xE4E8;',
 825          'kappa' => '&#x03BA;',
 826          'kappav' => '&#x03F0;',
 827          'Kfr' => '&#xE486;',
 828          'kfr' => '&#xE49F;',
 829          'Kopf' => '&#xE4B8;',
 830          'Kscr' => '&#xE4CF;',
 831          'kscr' => '&#xE4E9;',
 832          'lAarr' => '&#x21DA;',
 833          'laemptyv' => '&#xE2EA;',
 834          'lagran' => '&#x2112;',
 835          'Lambda' => '&#x039B;',
 836          'lambda' => '&#x03BB;',
 837          'Lang' => '&#x300A;',
 838          'lang' => '&#x3008;',
 839          'langd' => '&#xE297;',
 840          'langle' => '&#x3008;',
 841          'lap' => '&#x2272;',
 842          'laquo' => '&#x00AB;',
 843          'Larr' => '&#x219E;',
 844          'lArr' => '&#x21D0;',
 845          'larr' => '&#x2190;',
 846          'larrbfs' => '&#xE220;',
 847          'larrfs' => '&#xE222;',
 848          'larrhk' => '&#x21A9;',
 849          'larrlp' => '&#x21AB;',
 850          'larrpl' => '&#xE23F;',
 851          'larrsim' => '&#xE24E;',
 852          'larrtl' => '&#x21A2;',
 853          'lat' => '&#xE33A;',
 854          'lAtail' => '&#xE23D;',
 855          'latail' => '&#xE23C;',
 856          'late' => '&#xE33C;',
 857          'lates' => '&#xE33E;',
 858          'lBarr' => '&#xE206;',
 859          'lbarr' => '&#xE402;',
 860          'lbbrk' => '&#x3014;',
 861          'lbrace' => '&#x007B;',
 862          'lbrack' => '&#x005B;',
 863          'lbrke' => '&#xE299;',
 864          'lbrksld' => '&#xE29D;',
 865          'lbrkslu' => '&#xE29B;',
 866          'lceil' => '&#x2308;',
 867          'lcub' => '&#x007B;',
 868          'ldca' => '&#xE21A;',
 869          'ldquo' => '&#x201C;',
 870          'ldquor' => '&#x201E;',
 871          'ldrdhar' => '&#xE22C;',
 872          'ldrushar' => '&#xE228;',
 873          'ldsh' => '&#x21B2;',
 874          'lE' => '&#x2266;',
 875          'le' => '&#x2264;',
 876          'LeftAngleBracket' => '&#x3008;',
 877          'LeftArrow' => '&#x2190;',
 878          'Leftarrow' => '&#x21D0;',
 879          'leftarrow' => '&#x2190;',
 880          'LeftArrowRightArrow' => '&#x21C6;',
 881          'leftarrowtail' => '&#x21A2;',
 882          'LeftCeiling' => '&#x2308;',
 883          'LeftDownVector' => '&#x21C3;',
 884          'LeftFloor' => '&#x230A;',
 885          'leftharpoondown' => '&#x21BD;',
 886          'leftharpoonup' => '&#x21BC;',
 887          'leftleftarrows' => '&#x21C7;',
 888          'LeftRightArrow' => '&#x2194;',
 889          'Leftrightarrow' => '&#x21D4;',
 890          'leftrightarrow' => '&#x2194;',
 891          'leftrightarrows' => '&#x21C6;',
 892          'leftrightharpoons' => '&#x21CB;',
 893          'leftrightsquigarrow' => '&#x21AD;',
 894          'LeftTee' => '&#x22A3;',
 895          'leftthreetimes' => '&#x22CB;',
 896          'LeftTriangle' => '&#x22B2;',
 897          'LeftTriangleEqual' => '&#x22B4;',
 898          'LeftUpVector' => '&#x21BF;',
 899          'LeftVector' => '&#x21BC;',
 900          'lEg' => '&#x22DA;',
 901          'leg' => '&#x22DA;',
 902          'leq' => '&#x2264;',
 903          'leqq' => '&#x2266;',
 904          'leqslant' => '&#xE425;',
 905          'les' => '&#xE425;',
 906          'lescc' => '&#xE357;',
 907          'lesdot' => '&#xE31D;',
 908          'lesdoto' => '&#xE31F;',
 909          'lesdotor' => '&#xE321;',
 910          'lesg' => '&#xE32B;',
 911          'lesges' => '&#xE331;',
 912          'lessapprox' => '&#x2272;',
 913          'lessdot' => '&#x22D6;',
 914          'lesseqgtr' => '&#x22DA;',
 915          'lesseqqgtr' => '&#x22DA;',
 916          'LessEqualGreater' => '&#x22DA;',
 917          'LessFullEqual' => '&#x2266;',
 918          'LessGreater' => '&#x2276;',
 919          'lessgtr' => '&#x2276;',
 920          'lesssim' => '&#x2272;',
 921          'LessSlantEqual' => '&#xE425;',
 922          'LessTilde' => '&#x2272;',
 923          'lfisht' => '&#xE214;',
 924          'lfloor' => '&#x230A;',
 925          'Lfr' => '&#xE487;',
 926          'lfr' => '&#xE4A0;',
 927          'lg' => '&#x2276;',
 928          'lgE' => '&#xE32D;',
 929          'lHar' => '&#xE225;',
 930          'lhard' => '&#x21BD;',
 931          'lharu' => '&#x21BC;',
 932          'lharul' => '&#xE22E;',
 933          'lhblk' => '&#x2584;',
 934          'Ll' => '&#x22D8;',
 935          'll' => '&#x226A;',
 936          'llarr' => '&#x21C7;',
 937          'llcorner' => '&#x231E;',
 938          'Lleftarrow' => '&#x21DA;',
 939          'llhard' => '&#xE231;',
 940          'lltri' => '&#xE2E5;',
 941          'lmoust' => '&#xE294;',
 942          'lmoustache' => '&#xE294;',
 943          'lnap' => '&#xE2A2;',
 944          'lnapprox' => '&#xE2A2;',
 945          'lnE' => '&#x2268;',
 946          'lne' => '&#x2268;',
 947          'lneq' => '&#x2268;',
 948          'lneqq' => '&#x2268;',
 949          'lnsim' => '&#x22E6;',
 950          'loang' => '&#x3018;',
 951          'loarr' => '&#xE242;',
 952          'lobrk' => '&#x301A;',
 953          'LongLeftArrow' => '&#xE201;',
 954          'Longleftarrow' => '&#xE200;',
 955          'longleftarrow' => '&#xE201;',
 956          'LongLeftRightArrow' => '&#xE203;',
 957          'Longleftrightarrow' => '&#xE202;',
 958          'longleftrightarrow' => '&#xE203;',
 959          'longmapsto' => '&#xE208;',
 960          'LongRightArrow' => '&#xE205;',
 961          'Longrightarrow' => '&#xE204;',
 962          'longrightarrow' => '&#xE205;',
 963          'looparrowleft' => '&#x21AB;',
 964          'looparrowright' => '&#x21AC;',
 965          'lopar' => '&#xE379;',
 966          'Lopf' => '&#xE4B9;',
 967          'loplus' => '&#xE25C;',
 968          'lotimes' => '&#xE25E;',
 969          'lowast' => '&#x2217;',
 970          'lowbar' => '&#x005F;',
 971          'LowerLeftArrow' => '&#x2199;',
 972          'LowerRightArrow' => '&#x2198;',
 973          'loz' => '&#x25CA;',
 974          'lozenge' => '&#x25CA;',
 975          'lozf' => '&#xE501;',
 976          'lpar' => '&#x0028;',
 977          'lparlt' => '&#xE292;',
 978          'lrarr' => '&#x21C6;',
 979          'lrcorner' => '&#x231F;',
 980          'lrhar' => '&#x21CB;',
 981          'lrhard' => '&#xE22F;',
 982          'lrtri' => '&#xE2E3;',
 983          'Lscr' => '&#xE4D0;',
 984          'lscr' => '&#xE4EA;',
 985          'Lsh' => '&#x21B0;',
 986          'lsh' => '&#x21B0;',
 987          'lsim' => '&#x2272;',
 988          'lsime' => '&#xE333;',
 989          'lsimg' => '&#xE335;',
 990          'lsqb' => '&#x005B;',
 991          'lsquo' => '&#x2018;',
 992          'lsquor' => '&#x201A;',
 993          'Lt' => '&#x226A;',
 994          'lt' => '&#x003C;',
 995          'ltcc' => '&#xE355;',
 996          'ltcir' => '&#xE325;',
 997          'ltdot' => '&#x22D6;',
 998          'lthree' => '&#x22CB;',
 999          'ltimes' => '&#x22C9;',
1000          'ltlarr' => '&#xE35E;',
1001          'ltquest' => '&#xE329;',
1002          'ltri' => '&#x25C3;',
1003          'ltrie' => '&#x22B4;',
1004          'ltrif' => '&#x25C2;',
1005          'ltrPar' => '&#xE295;',
1006          'lurdshar' => '&#xE229;',
1007          'luruhar' => '&#xE22B;',
1008          'lvertneqq' => '&#xE2A4;',
1009          'lvnE' => '&#xE2A4;',
1010          'macr' => '&#x0304;',
1011          'male' => '&#x2642;',
1012          'malt' => '&#x2720;',
1013          'maltese' => '&#x2720;',
1014          'Map' => '&#xE212;',
1015          'map' => '&#x21A6;',
1016          'mapsto' => '&#x21A6;',
1017          'marker' => '&#xE502;',
1018          'mcomma' => '&#xE31A;',
1019          'mdash' => '&#x2014;',
1020          'mDDot' => '&#x223A;',
1021          'measuredangle' => '&#x2221;',
1022          'Mfr' => '&#xE488;',
1023          'mfr' => '&#xE4A1;',
1024          'mho' => '&#x2127;',
1025          'micro' => '&#x00B5;',
1026          'mid' => '&#x2223;',
1027          'midast' => '&#x2217;',
1028          'midcir' => '&#xE20F;',
1029          'middot' => '&#x00B7;',
1030          'minus' => '&#x2212;',
1031          'minusb' => '&#x229F;',
1032          'minusd' => '&#x2238;',
1033          'minusdu' => '&#xE25B;',
1034          'MinusPlus' => '&#x2213;',
1035          'mlcp' => '&#xE30A;',
1036          'mldr' => '&#xE503;',
1037          'mnplus' => '&#x2213;',
1038          'models' => '&#x22A7;',
1039          'Mopf' => '&#xE4BA;',
1040          'mp' => '&#x2213;',
1041          'Mscr' => '&#xE4D1;',
1042          'mscr' => '&#xE4EB;',
1043          'mstpos' => '&#x223E;',
1044          'mu' => '&#x03BC;',
1045          'multimap' => '&#x22B8;',
1046          'mumap' => '&#x22B8;',
1047          'nabla' => '&#x2207;',
1048          'nang' => '&#xE2D8;',
1049          'nap' => '&#x2249;',
1050          'napE' => '&#xE2C7;',
1051          'napid' => '&#xE2BC;',
1052          'napprox' => '&#x2249;',
1053          'natur' => '&#x266E;',
1054          'natural' => '&#x266E;',
1055          'nbsp' => '&#x00A0;',
1056          'ncap' => '&#xE284;',
1057          'ncong' => '&#x2247;',
1058          'ncongdot' => '&#xE2C5;',
1059          'ncup' => '&#xE283;',
1060          'ndash' => '&#x2013;',
1061          'ne' => '&#x2260;',
1062          'nearhk' => '&#xE20D;',
1063          'neArr' => '&#x21D7;',
1064          'nearr' => '&#x2197;',
1065          'nearrow' => '&#x2197;',
1066          'nedot' => '&#xE38A;',
1067          'nequiv' => '&#x2262;',
1068          'nesear' => '&#xE20E;',
1069          'NestedGreaterGreater' => '&#x226B;',
1070          'NestedLessLess' => '&#x226A;',
1071          'nexist' => '&#x2204;',
1072          'nexists' => '&#x2204;',
1073          'Nfr' => '&#xE489;',
1074          'nfr' => '&#xE4A2;',
1075          'ngE' => '&#x2271;',
1076          'nge' => '&#xE2A6;',
1077          'ngeq' => '&#xE2A6;',
1078          'ngeqq' => '&#x2271;',
1079          'ngeqslant' => '&#x2271;',
1080          'nges' => '&#x2271;',
1081          'nGg' => '&#xE2CE;',
1082          'ngsim' => '&#x2275;',
1083          'nGt' => '&#xE2CA;',
1084          'ngt' => '&#x226F;',
1085          'ngtr' => '&#x226F;',
1086          'nGtv' => '&#xE2CC;',
1087          'nhArr' => '&#x21CE;',
1088          'nharr' => '&#x21AE;',
1089          'nhpar' => '&#xE38D;',
1090          'ni' => '&#x220D;',
1091          'nis' => '&#xE3A5;',
1092          'nisd' => '&#xE3A1;',
1093          'niv' => '&#x220B;',
1094          'nlArr' => '&#x21CD;',
1095          'nlarr' => '&#x219A;',
1096          'nldr' => '&#x2025;',
1097          'nlE' => '&#x2270;',
1098          'nle' => '&#xE2A7;',
1099          'nLeftarrow' => '&#x21CD;',
1100          'nleftarrow' => '&#x219A;',
1101          'nLeftrightarrow' => '&#x21CE;',
1102          'nleftrightarrow' => '&#x21AE;',
1103          'nleq' => '&#xE2A7;',
1104          'nleqq' => '&#x2270;',
1105          'nleqslant' => '&#x2270;',
1106          'nles' => '&#x2270;',
1107          'nless' => '&#x226E;',
1108          'nLl' => '&#xE2CD;',
1109          'nlsim' => '&#x2274;',
1110          'nLt' => '&#xE2C9;',
1111          'nlt' => '&#x226E;',
1112          'nltri' => '&#x22EA;',
1113          'nltrie' => '&#x22EC;',
1114          'nLtv' => '&#xE2CB;',
1115          'nmid' => '&#x2224;',
1116          'Nopf' => '&#x2115;',
1117          'Not' => '&#xE3AC;',
1118          'not' => '&#x00AC;',
1119          'NotCongruent' => '&#x2262;',
1120          'NotDoubleVerticalBar' => '&#x2226;',
1121          'NotElement' => '&#x2209;',
1122          'NotEqual' => '&#x2260;',
1123          'NotExists' => '&#x2204;',
1124          'NotGreater' => '&#x226F;',
1125          'NotGreaterEqual' => '&#xE2A6;',
1126          'NotGreaterFullEqual' => '&#x2270;',
1127          'NotGreaterGreater' => '&#xE2CC;',
1128          'NotGreaterLess' => '&#x2279;',
1129          'NotGreaterSlantEqual' => '&#x2271;',
1130          'NotGreaterTilde' => '&#x2275;',
1131          'notin' => '&#x2209;',
1132          'notindot' => '&#xE39D;',
1133          'notinE' => '&#xE50D;',
1134          'notinva' => '&#xE370;',
1135          'notinvb' => '&#xE37B;',
1136          'notinvc' => '&#xE37C;',
1137          'NotLeftTriangle' => '&#x22EA;',
1138          'NotLeftTriangleEqual' => '&#x22EC;',
1139          'NotLess' => '&#x226E;',
1140          'NotLessEqual' => '&#xE2A7;',
1141          'NotLessFullEqual' => '&#x2270;',
1142          'NotLessGreater' => '&#x2278;',
1143          'NotLessLess' => '&#xE2CB;',
1144          'NotLessSlantEqual' => '&#x2270;',
1145          'NotLessTilde' => '&#x2274;',
1146          'notni' => '&#x220C;',
1147          'notniva' => '&#x220C;',
1148          'notnivb' => '&#xE37D;',
1149          'notnivc' => '&#xE37E;',
1150          'NotPrecedes' => '&#x2280;',
1151          'NotPrecedesEqual' => '&#xE412;',
1152          'NotPrecedesSlantEqual' => '&#x22E0;',
1153          'NotReverseElement' => '&#x220C;',
1154          'NotRightTriangle' => '&#x22EB;',
1155          'NotRightTriangleEqual' => '&#x22ED;',
1156          'NotSquareSubsetEqual' => '&#x22E2;',
1157          'NotSquareSupersetEqual' => '&#x22E3;',
1158          'NotSubset' => '&#x2284;',
1159          'NotSucceeds' => '&#x2281;',
1160          'NotSucceedsEqual' => '&#xE413;',
1161          'NotSucceedsSlantEqual' => '&#x22E1;',
1162          'NotSuperset' => '&#x2285;',
1163          'NotTilde' => '&#x2241;',
1164          'NotTildeEqual' => '&#x2244;',
1165          'NotTildeFullEqual' => '&#x2247;',
1166          'NotTildeTilde' => '&#x2249;',
1167          'NotVerticalBar' => '&#x2224;',
1168          'npar' => '&#x2226;',
1169          'nparallel' => '&#x2226;',
1170          'nparsl' => '&#xE389;',
1171          'npart' => '&#xE390;',
1172          'npolint' => '&#xE399;',
1173          'npr' => '&#x2280;',
1174          'nprcue' => '&#x22E0;',
1175          'npre' => '&#xE412;',
1176          'nprec' => '&#x2280;',
1177          'npreceq' => '&#xE412;',
1178          'nrArr' => '&#x21CF;',
1179          'nrarr' => '&#x219B;',
1180          'nrarrc' => '&#xE21D;',
1181          'nrarrw' => '&#xE21B;',
1182          'nRightarrow' => '&#x21CF;',
1183          'nrightarrow' => '&#x219B;',
1184          'nrtri' => '&#x22EB;',
1185          'nrtrie' => '&#x22ED;',
1186          'nsc' => '&#x2281;',
1187          'nsccue' => '&#x22E1;',
1188          'nsce' => '&#xE413;',
1189          'Nscr' => '&#xE4D2;',
1190          'nscr' => '&#xE4EC;',
1191          'nshortmid' => '&#xE2AA;',
1192          'nshortparallel' => '&#xE2AB;',
1193          'nsim' => '&#x2241;',
1194          'nsime' => '&#x2244;',
1195          'nsimeq' => '&#x2244;',
1196          'nsmid' => '&#xE2AA;',
1197          'nspar' => '&#xE2AB;',
1198          'nsqsube' => '&#x22E2;',
1199          'nsqsupe' => '&#x22E3;',
1200          'nsub' => '&#x2284;',
1201          'nsubE' => '&#x2288;',
1202          'nsube' => '&#x2288;',
1203          'nsubset' => '&#x2284;',
1204          'nsubseteq' => '&#x2288;',
1205          'nsubseteqq' => '&#x2288;',
1206          'nsucc' => '&#x2281;',
1207          'nsucceq' => '&#xE413;',
1208          'nsup' => '&#x2285;',
1209          'nsupE' => '&#x2289;',
1210          'nsupe' => '&#x2289;',
1211          'nsupset' => '&#x2285;',
1212          'nsupseteq' => '&#x2289;',
1213          'nsupseteqq' => '&#x2289;',
1214          'ntgl' => '&#x2279;',
1215          'ntlg' => '&#x2278;',
1216          'ntriangleleft' => '&#x22EA;',
1217          'ntrianglelefteq' => '&#x22EC;',
1218          'ntriangleright' => '&#x22EB;',
1219          'ntrianglerighteq' => '&#x22ED;',
1220          'ntvgl' => '&#x2279;',
1221          'ntvlg' => '&#x2278;',
1222          'nu' => '&#x03BD;',
1223          'num' => '&#x0023;',
1224          'numsp' => '&#x2007;',
1225          'nvap' => '&#xE2C6;',
1226          'nVDash' => '&#x22AF;',
1227          'nVdash' => '&#x22AE;',
1228          'nvDash' => '&#x22AD;',
1229          'nvdash' => '&#x22AC;',
1230          'nvge' => '&#x2271;',
1231          'nvgt' => '&#x226F;',
1232          'nvhArr*' => '&#x21CE;',
1233          'nvinfin' => '&#xE38E;',
1234          'nvlArr' => '&#x21CD;',
1235          'nvle' => '&#x2270;',
1236          'nvlt' => '&#x226E;',
1237          'nvltrie' => '&#xE2D0;',
1238          'nvrArr' => '&#x21CF;',
1239          'nvrtrie' => '&#xE2CF;',
1240          'nvsim' => '&#xE415;',
1241          'nwarhk' => '&#xE20C;',
1242          'nwArr' => '&#x21D6;',
1243          'nwarr' => '&#x2196;',
1244          'nwarrow' => '&#x2196;',
1245          'nwnear' => '&#xE211;',
1246          'oast' => '&#x229B;',
1247          'ocir' => '&#x229A;',
1248          'odash' => '&#x229D;',
1249          'odiv' => '&#xE285;',
1250          'odot' => '&#x2299;',
1251          'odsold' => '&#xE286;',
1252          'ofcir' => '&#xE287;',
1253          'Ofr' => '&#xE48A;',
1254          'ofr' => '&#xE4A3;',
1255          'ogon' => '&#x0328;',
1256          'ogt' => '&#xE289;',
1257          'ohbar' => '&#xE260;',
1258          'ohm' => '&#x2126;',
1259          'oint' => '&#x222E;',
1260          'olarr' => '&#x21BA;',
1261          'olcir' => '&#xE409;',
1262          'olcross' => '&#xE3A8;',
1263          'olt' => '&#xE288;',
1264          'Omega' => '&#x03A9;',
1265          'omega' => '&#x03C9;',
1266          'omicron' => '&#x03BE;',
1267          'omid' => '&#xE40A;',
1268          'ominus' => '&#x2296;',
1269          'Oopf' => '&#xE4BC;',
1270          'opar' => '&#xE28A;',
1271          'OpenCurlyDoubleQuote' => '&#x201C;',
1272          'OpenCurlyQuote' => '&#x2018;',
1273          'operp' => '&#xE28B;',
1274          'oplus' => '&#x2295;',
1275          'Or' => '&#xE375;',
1276          'or' => '&#x2228;',
1277          'orarr' => '&#x21BB;',
1278          'ord' => '&#xE393;',
1279          'order' => '&#x2134;',
1280          'ordf' => '&#x00AA;',
1281          'ordm' => '&#x00BA;',
1282          'origof' => '&#x22B6;',
1283          'oror' => '&#xE50E;',
1284          'orslope' => '&#xE3AE;',
1285          'orv' => '&#xE392;',
1286          'oS' => '&#xE41D;',
1287          'Oscr' => '&#xE4D3;',
1288          'oscr' => '&#xE4ED;',
1289          'oslash' => '&#x2298;',
1290          'osol' => '&#x2298;',
1291          'Otimes' => '&#xE28C;',
1292          'otimes' => '&#x2297;',
1293          'otimesas' => '&#xE28D;',
1294          'ovbar' => '&#xE40B;',
1295          'OverLine' => '&#x0305;',
1296          'par' => '&#x2225;',
1297          'para' => '&#x00B6;',
1298          'parallel' => '&#x2225;',
1299          'parsim' => '&#xE2C8;',
1300          'parsl' => '&#xE382;',
1301          'part' => '&#x2202;',
1302          'PartialD' => '&#x2202;',
1303          'percnt' => '&#x0025;',
1304          'period' => '&#x002E;',
1305          'permil' => '&#x2030;',
1306          'perp' => '&#x22A5;',
1307          'pertenk' => '&#x2031;',
1308          'Pfr' => '&#xE48B;',
1309          'pfr' => '&#xE4A4;',
1310          'Phi' => '&#x03A6;',
1311          'phi' => '&#x03C6;',
1312          'phiv' => '&#x03D5;',
1313          'phmmat' => '&#x2133;',
1314          'phone' => '&#x260E;',
1315          'Pi' => '&#x03A0;',
1316          'pi' => '&#x03C0;',
1317          'pitchfork' => '&#x22D4;',
1318          'piv' => '&#x03D6;',
1319          'plank' => '&#xE2D5;',
1320          'plankv' => '&#x210F;',
1321          'plus' => '&#x002B;',
1322          'plusacir' => '&#xE26A;',
1323          'plusb' => '&#x229E;',
1324          'pluscir' => '&#xE266;',
1325          'plusdo' => '&#x2214;',
1326          'plusdu' => '&#xE25A;',
1327          'pluse' => '&#xE267;',
1328          'PlusMinus' => '&#x00B1;',
1329          'plusmn' => '&#x00B1;',
1330          'plussim' => '&#xE26C;',
1331          'plustwo' => '&#xE269;',
1332          'pm' => '&#x00B1;',
1333          'pointint' => '&#xE376;',
1334          'Popf' => '&#x2119;',
1335          'pound' => '&#x00A3;',
1336          'Pr' => '&#xE35C;',
1337          'pr' => '&#x227A;',
1338          'prap' => '&#x227E;',
1339          'prcue' => '&#x227C;',
1340          'prE' => '&#x227C;',
1341          'pre' => '&#x227C;',
1342          'prec' => '&#x227A;',
1343          'precapprox' => '&#x227E;',
1344          'preccurlyeq' => '&#x227C;',
1345          'Precedes' => '&#x227A;',
1346          'PrecedesEqual' => '&#x227C;',
1347          'PrecedesSlantEqual' => '&#x227C;',
1348          'PrecedesTilde' => '&#x227E;',
1349          'preceq' => '&#x227C;',
1350          'precnapprox' => '&#x22E8;',
1351          'precneqq' => '&#xE2B3;',
1352          'precnsim' => '&#x22E8;',
1353          'precsim' => '&#x227E;',
1354          'Prime' => '&#x2033;',
1355          'prime' => '&#x2032;',
1356          'prnap' => '&#x22E8;',
1357          'prnE' => '&#xE2B3;',
1358          'prnsim' => '&#x22E8;',
1359          'profalar' => '&#x232E;',
1360          'profline' => '&#x2312;',
1361          'profsurf' => '&#x2313;',
1362          'prop' => '&#x221D;',
1363          'Proportion' => '&#x2237;',
1364          'Proportional' => '&#x221D;',
1365          'propto' => '&#x221D;',
1366          'prsim' => '&#x227E;',
1367          'prurel' => '&#x22B0;',
1368          'Pscr' => '&#xE4D4;',
1369          'pscr' => '&#xE4EE;',
1370          'Psi' => '&#x03A8;',
1371          'psi' => '&#x03C8;',
1372          'puncsp' => '&#x2008;',
1373          'Qfr' => '&#xE48C;',
1374          'qfr' => '&#xE4A5;',
1375          'qint' => '&#xE378;',
1376          'Qopf' => '&#x211A;',
1377          'qprime' => '&#xE371;',
1378          'Qscr' => '&#xE4D5;',
1379          'qscr' => '&#xE4EF;',
1380          'quatint' => '&#xE377;',
1381          'quest' => '&#x003F;',
1382          'questeq' => '&#x225F;',
1383          'quot' => '&#x0022;',
1384          'rAarr' => '&#x21DB;',
1385          'race' => '&#xE40C;',
1386          'radic' => '&#x221A;',
1387          'raemptyv' => '&#xE2E9;',
1388          'Rang' => '&#x300B;',
1389          'rang' => '&#x3009;',
1390          'rangd' => '&#xE298;',
1391          'range' => '&#xE2D7;',
1392          'rangle' => '&#x3009;',
1393          'raquo' => '&#x00BB;',
1394          'Rarr' => '&#x21A0;',
1395          'rArr' => '&#x21D2;',
1396          'rarr' => '&#x2192;',
1397          'rarrap' => '&#xE235;',
1398          'rarrbfs' => '&#xE221;',
1399          'rarrc' => '&#xE21C;',
1400          'rarrfs' => '&#xE223;',
1401          'rarrhk' => '&#x21AA;',
1402          'rarrlp' => '&#x21AC;',
1403          'rarrpl' => '&#xE21E;',
1404          'rarrsim' => '&#xE24D;',
1405          'Rarrtl' => '&#xE239;',
1406          'rarrtl' => '&#x21A3;',
1407          'rarrw' => '&#x219D;',
1408          'rAtail' => '&#xE23B;',
1409          'ratail' => '&#x21A3;',
1410          'ratio' => '&#x2236;',
1411          'RBarr' => '&#xE209;',
1412          'rBarr' => '&#xE207;',
1413          'rbarr' => '&#xE405;',
1414          'rbbrk' => '&#x3015;',
1415          'rbrace' => '&#x007D;',
1416          'rbrack' => '&#x005D;',
1417          'rbrke' => '&#xE29A;',
1418          'rbrksld' => '&#xE29C;',
1419          'rbrkslu' => '&#xE29E;',
1420          'rceil' => '&#x2309;',
1421          'rcub' => '&#x007D;',
1422          'rdca' => '&#xE219;',
1423          'rdldhar' => '&#xE22D;',
1424          'rdquo' => '&#x201D;',
1425          'rdquor' => '&#x201B;',
1426          'rdsh' => '&#x21B3;',
1427          'Re' => '&#x211C;',
1428          'real' => '&#x211C;',
1429          'rect' => '&#xE504;',
1430          'reg' => '&#x00AF;',
1431          'ReverseElement' => '&#x220B;',
1432          'ReverseEquilibrium' => '&#x21CB;',
1433          'ReverseUpEquilibrium' => '&#xE217;',
1434          'rfisht' => '&#xE215;',
1435          'rfloor' => '&#x230B;',
1436          'Rfr' => '&#xE48D;',
1437          'rfr' => '&#xE4A6;',
1438          'rHar' => '&#xE224;',
1439          'rhard' => '&#x21C1;',
1440          'rharu' => '&#x21C0;',
1441          'rharul' => '&#xE230;',
1442          'rho' => '&#x03C1;',
1443          'rhov' => '&#x03F1;',
1444          'RightAngleBracket' => '&#x3009;',
1445          'RightArrow' => '&#x2192;',
1446          'Rightarrow' => '&#x21D2;',
1447          'rightarrow' => '&#x2192;',
1448          'RightArrowLeftArrow' => '&#x21C4;',
1449          'rightarrowtail' => '&#x21A3;',
1450          'RightCeiling' => '&#x2309;',
1451          'RightDownVector' => '&#x21C2;',
1452          'RightFloor' => '&#x230B;',
1453          'rightharpoondown' => '&#x21C1;',
1454          'rightharpoonup' => '&#x21C0;',
1455          'rightleftarrows' => '&#x21C4;',
1456          'rightleftharpoons' => '&#x21CC;',
1457          'rightrightarrows' => '&#x21C9;',
1458          'rightsquigarrow' => '&#x219D;',
1459          'RightTee' => '&#x22A2;',
1460          'RightTeeArrow' => '&#x21A6;',
1461          'rightthreetimes' => '&#x22CC;',
1462          'RightTriangle' => '&#x22B3;',
1463          'RightTriangleEqual' => '&#x22B5;',
1464          'RightUpVector' => '&#x21BE;',
1465          'RightVector' => '&#x21C0;',
1466          'ring' => '&#x030A;',
1467          'risingdotseq' => '&#x2253;',
1468          'rlarr' => '&#x21C4;',
1469          'rlhar' => '&#x21CC;',
1470          'rmoust' => '&#xE293;',
1471          'rmoustache' => '&#xE293;',
1472          'rnmid' => '&#xE2D1;',
1473          'roang' => '&#x3019;',
1474          'roarr' => '&#xE241;',
1475          'robrk' => '&#x301B;',
1476          'ropar' => '&#xE37A;',
1477          'Ropf' => '&#x211D;',
1478          'roplus' => '&#xE25D;',
1479          'rotimes' => '&#xE40D;',
1480          'rpar' => '&#x0029;',
1481          'rpargt' => '&#xE291;',
1482          'rppolint' => '&#xE397;',
1483          'rrarr' => '&#x21C9;',
1484          'Rrightarrow' => '&#x21DB;',
1485          'Rscr' => '&#xE4D6;',
1486          'rscr' => '&#x211B;',
1487          'Rsh' => '&#x21B1;',
1488          'rsh' => '&#x21B1;',
1489          'rsqb' => '&#x005D;',
1490          'rsquo' => '&#x2019;',
1491          'rsquor' => '&#x201F;',
1492          'rthree' => '&#x22CC;',
1493          'rtimes' => '&#x22CA;',
1494          'rtri' => '&#x25B9;',
1495          'rtrie' => '&#x22B5;',
1496          'rtrif' => '&#x25B8;',
1497          'rtriltri' => '&#xE359;',
1498          'ruluhar' => '&#xE22A;',
1499          'rx' => '&#x211E;',
1500          'Sc' => '&#xE35D;',
1501          'sc' => '&#x227B;',
1502          'scap' => '&#x227F;',
1503          'sccue' => '&#x227D;',
1504          'scE' => '&#x227E;',
1505          'sce' => '&#x227D;',
1506          'scnap' => '&#x22E9;',
1507          'scnE' => '&#xE2B5;',
1508          'scnsim' => '&#x22E9;',
1509          'scpolint' => '&#xE398;',
1510          'scsim' => '&#x227F;',
1511          'sdot' => '&#x22C5;',
1512          'sdotb' => '&#x22A1;',
1513          'sdote' => '&#xE319;',
1514          'searhk' => '&#xE20B;',
1515          'seArr' => '&#x21D8;',
1516          'searr' => '&#x2198;',
1517          'searrow' => '&#x2198;',
1518          'sect' => '&#x00A7;',
1519          'semi' => '&#x003B;',
1520          'seswar' => '&#xE406;',
1521          'setminus' => '&#x2216;',
1522          'setmn' => '&#x2216;',
1523          'sext' => '&#xE505;',
1524          'Sfr' => '&#xE48E;',
1525          'sfr' => '&#xE4A7;',
1526          'sfrown' => '&#xE426;',
1527          'sharp' => '&#x266F;',
1528          'ShortLeftArrow' => '&#xE233;',
1529          'shortmid' => '&#xE301;',
1530          'shortparallel' => '&#xE302;',
1531          'ShortRightArrow' => '&#xE232;',
1532          'shy' => '&#x00AD;',
1533          'Sigma' => '&#x03A3;',
1534          'sigma' => '&#x03C3;',
1535          'sigmav' => '&#x03C2;',
1536          'sim' => '&#x223C;',
1537          'simdot' => '&#xE38B;',
1538          'sime' => '&#x2243;',
1539          'simeq' => '&#x2243;',
1540          'simg' => '&#xE30C;',
1541          'simgE' => '&#xE338;',
1542          'siml' => '&#xE30B;',
1543          'simlE' => '&#xE337;',
1544          'simne' => '&#x2246;',
1545          'simplus' => '&#xE26B;',
1546          'simrarr' => '&#xE234;',
1547          'slarr' => '&#xE233;',
1548          'SmallCircle' => '&#x2218;',
1549          'smallfrown' => '&#xE426;',
1550          'smallsetminus' => '&#xE844;',
1551          'smallsmile' => '&#xE303;',
1552          'smashp' => '&#xE264;',
1553          'smeparsl' => '&#xE385;',
1554          'smid' => '&#xE301;',
1555          'smile' => '&#x2323;',
1556          'smt' => '&#xE339;',
1557          'smte' => '&#xE33B;',
1558          'smtes' => '&#xE33D;',
1559          'sol' => '&#x002F;',
1560          'solb' => '&#xE27F;',
1561          'solbar' => '&#xE416;',
1562          'Sopf' => '&#xE4BD;',
1563          'spades' => '&#x2660;',
1564          'spadesuit' => '&#x2660;',
1565          'spar' => '&#xE302;',
1566          'sqcap' => '&#x2293;',
1567          'sqcaps' => '&#xE277;',
1568          'sqcup' => '&#x2294;',
1569          'sqcups' => '&#xE276;',
1570          'Sqrt' => '&#x221A;',
1571          'sqsub' => '&#x228F;',
1572          'sqsube' => '&#x2291;',
1573          'sqsubset' => '&#x228F;',
1574          'sqsubseteq' => '&#x2291;',
1575          'sqsup' => '&#x2290;',
1576          'sqsupe' => '&#x2292;',
1577          'sqsupset' => '&#x2290;',
1578          'sqsupseteq' => '&#x2292;',
1579          'squ' => '&#x25A1;',
1580          'square' => '&#x25A1;',
1581          'SquareIntersection' => '&#x2293;',
1582          'SquareSubset' => '&#x228F;',
1583          'SquareSubsetEqual' => '&#x2291;',
1584          'SquareSuperset' => '&#x2290;',
1585          'SquareSupersetEqual' => '&#x2292;',
1586          'SquareUnion' => '&#x2294;',
1587          'squarf' => '&#x25A0;',
1588          'squarfb' => '&#xE507;',
1589          'squarfbl' => '&#xE506;',
1590          'squarfbr' => '&#x25EA;',
1591          'squarfl' => '&#x25E7;',
1592          'squarfr' => '&#x25E8;',
1593          'squarft' => '&#xE509;',
1594          'squarftl' => '&#x25E9;',
1595          'squarftr' => '&#xE508;',
1596          'squf' => '&#x25AA;',
1597          'srarr' => '&#xE232;',
1598          'Sscr' => '&#xE4D7;',
1599          'sscr' => '&#xE4F0;',
1600          'ssetmn' => '&#xE844;',
1601          'ssmile' => '&#xE303;',
1602          'sstarf' => '&#x22C6;',
1603          'Star' => '&#x22C6;',
1604          'star' => '&#x22C6;',
1605          'starf' => '&#x2605;',
1606          'straightepsilon' => '&#x220A;',
1607          'straightphi' => '&#x03C6;',
1608          'strns' => '&#xE380;',
1609          'Sub' => '&#x22D0;',
1610          'sub' => '&#x2282;',
1611          'subdot' => '&#xE262;',
1612          'subE' => '&#x2286;',
1613          'sube' => '&#x2286;',
1614          'subedot' => '&#xE34F;',
1615          'submult' => '&#xE343;',
1616          'subnE' => '&#x228A;',
1617          'subne' => '&#x228A;',
1618          'subplus' => '&#xE341;',
1619          'subrarr' => '&#xE33F;',
1620          'Subset' => '&#x22D0;',
1621          'subset' => '&#x2282;',
1622          'subseteq' => '&#x2286;',
1623          'subseteqq' => '&#x2286;',
1624          'SubsetEqual' => '&#x2286;',
1625          'subsetneq' => '&#x228A;',
1626          'subsetneqq' => '&#x228A;',
1627          'subsim' => '&#xE345;',
1628          'subsub' => '&#xE349;',
1629          'subsup' => '&#xE347;',
1630          'succ' => '&#x227B;',
1631          'succapprox' => '&#x227F;',
1632          'succcurlyeq' => '&#x227D;',
1633          'Succeeds' => '&#x227B;',
1634          'SucceedsEqual' => '&#x227D;',
1635          'SucceedsSlantEqual' => '&#x227D;',
1636          'SucceedsTilde' => '&#x227F;',
1637          'succeq' => '&#x227D;',
1638          'succnapprox' => '&#x22E9;',
1639          'succneqq' => '&#xE2B5;',
1640          'succnsim' => '&#x22E9;',
1641          'succsim' => '&#x227F;',
1642          'SuchThat' => '&#x220D;',
1643          'Sum' => '&#x2211;',
1644          'sum' => '&#x2211;',
1645          'sung' => '&#x2669;',
1646          'Sup' => '&#x22D1;',
1647          'sup' => '&#x2283;',
1648          'sup1' => '&#x00B9;',
1649          'sup2' => '&#x00B2;',
1650          'sup3' => '&#x00B3;',
1651          'supdot' => '&#xE263;',
1652          'supdsub' => '&#xE34C;',
1653          'supE' => '&#x2287;',
1654          'supe' => '&#x2287;',
1655          'supedot' => '&#xE350;',
1656          'Superset' => '&#x2283;',
1657          'SupersetEqual' => '&#x2287;',
1658          'suphsol' => '&#xE34E;',
1659          'suphsub' => '&#xE34B;',
1660          'suplarr' => '&#xE340;',
1661          'supmult' => '&#xE344;',
1662          'supnE' => '&#x228B;',
1663          'supne' => '&#x228B;',
1664          'supplus' => '&#xE342;',
1665          'Supset' => '&#x22D1;',
1666          'supset' => '&#x2283;',
1667          'supseteq' => '&#x2287;',
1668          'supseteqq' => '&#x2287;',
1669          'supsetneq' => '&#x228B;',
1670          'supsetneqq' => '&#x228B;',
1671          'supsim' => '&#xE346;',
1672          'supsub' => '&#xE348;',
1673          'supsup' => '&#xE34A;',
1674          'swarhk' => '&#xE20A;',
1675          'swArr' => '&#x21D9;',
1676          'swarr' => '&#x2199;',
1677          'swarrow' => '&#x2199;',
1678          'swnwar' => '&#xE210;',
1679          'target' => '&#x2316;',
1680          'tau' => '&#x03C4;',
1681          'tbrk' => '&#xE2EF;',
1682          'tdot' => '&#x20DB;',
1683          'telrec' => '&#x2315;',
1684          'Tfr' => '&#xE48F;',
1685          'tfr' => '&#xE4A8;',
1686          'there4' => '&#x2234;',
1687          'Therefore' => '&#x2234;',
1688          'therefore' => '&#x2234;',
1689          'Theta' => '&#x0398;',
1690          'theta' => '&#x03B8;',
1691          'thetav' => '&#x03D1;',
1692          'thickapprox' => '&#xE306;',
1693          'thicksim' => '&#xE429;',
1694          'thinsp' => '&#x2009;',
1695          'thkap' => '&#xE306;',
1696          'thksim' => '&#xE429;',
1697          'Tilde' => '&#x223C;',
1698          'tilde' => '&#x0303;',
1699          'TildeEqual' => '&#x2243;',
1700          'TildeFullEqual' => '&#x2245;',
1701          'TildeTilde' => '&#x2248;',
1702          'times' => '&#x00D7;',
1703          'timesb' => '&#x22A0;',
1704          'timesbar' => '&#xE28E;',
1705          'timesd' => '&#xE26D;',
1706          'tint' => '&#x222D;',
1707          'toea' => '&#xE20E;',
1708          'top' => '&#x22A4;',
1709          'topbot' => '&#x2336;',
1710          'topcir' => '&#xE383;',
1711          'Topf' => '&#xE4BE;',
1712          'topfork' => '&#xE31C;',
1713          'tosa' => '&#xE20F;',
1714          'tprime' => '&#x2034;',
1715          'trade' => '&#x2122;',
1716          'triangle' => '&#x25B5;',
1717          'triangledown' => '&#x25BF;',
1718          'triangleleft' => '&#x25C3;',
1719          'trianglelefteq' => '&#x22B4;',
1720          'triangleq' => '&#x225C;',
1721          'triangleright' => '&#x25B9;',
1722          'trianglerighteq' => '&#x22B5;',
1723          'tridot' => '&#x25EC;',
1724          'trie' => '&#x225C;',
1725          'triminus' => '&#xE27C;',
1726          'TripleDot' => '&#x20DB;',
1727          'triplus' => '&#xE27B;',
1728          'trisb' => '&#xE27E;',
1729          'tritime' => '&#xE27D;',
1730          'trpezium' => '&#xE2EC;',
1731          'Tscr' => '&#xE4D8;',
1732          'tscr' => '&#xE4F1;',
1733          'twixt' => '&#x226C;',
1734          'twoheadleftarrow' => '&#x219E;',
1735          'twoheadrightarrow' => '&#x21A0;',
1736          'Uarr' => '&#x219F;',
1737          'uArr' => '&#x21D1;',
1738          'uarr' => '&#x2191;',
1739          'Uarrocir' => '&#xE237;',
1740          'udarr' => '&#x21C5;',
1741          'udhar' => '&#xE218;',
1742          'ufisht' => '&#xE24B;',
1743          'Ufr' => '&#xE490;',
1744          'ufr' => '&#xE4A9;',
1745          'uHar' => '&#xE226;',
1746          'uharl' => '&#x21BF;',
1747          'uharr' => '&#x21BE;',
1748          'uhblk' => '&#x2580;',
1749          'ulcorn' => '&#x231C;',
1750          'ulcorner' => '&#x231C;',
1751          'ulcrop' => '&#x230F;',
1752          'ultri' => '&#xE2E4;',
1753          'uml' => '&#x0308;',
1754          'UnderLine' => '&#x0332;',
1755          'Union' => '&#x22C3;',
1756          'UnionPlus' => '&#x228E;',
1757          'Uopf' => '&#xE4BF;',
1758          'UpArrow' => '&#x2191;',
1759          'Uparrow' => '&#x21D1;',
1760          'uparrow' => '&#x2191;',
1761          'UpArrowDownArrow' => '&#x21C5;',
1762          'UpDownArrow' => '&#x2195;',
1763          'Updownarrow' => '&#x21D5;',
1764          'updownarrow' => '&#x2195;',
1765          'UpEquilibrium' => '&#xE218;',
1766          'upharpoonleft' => '&#x21BF;',
1767          'upharpoonright' => '&#x21BE;',
1768          'uplus' => '&#x228E;',
1769          'UpperLeftArrow' => '&#x2196;',
1770          'UpperRightArrow' => '&#x2197;',
1771          'Upsi' => '&#x03D2;',
1772          'upsi' => '&#x03C5;',
1773          'Upsilon' => '&#x03D2;',
1774          'upsilon' => '&#x03C5;',
1775          'UpTee' => '&#x22A5;',
1776          'upuparrows' => '&#x21C8;',
1777          'urcorn' => '&#x231D;',
1778          'urcorner' => '&#x231D;',
1779          'urcrop' => '&#x230E;',
1780          'urtri' => '&#xE2E2;',
1781          'Uscr' => '&#xE4D9;',
1782          'uscr' => '&#xE4F2;',
1783          'utdot' => '&#x22F0;',
1784          'utri' => '&#x25B5;',
1785          'utrif' => '&#x25B4;',
1786          'uuarr' => '&#x21C8;',
1787          'uwangle' => '&#xE3AB;',
1788          'vangrt' => '&#x22BE;',
1789          'varepsilon' => '&#x03B5;',
1790          'varkappa' => '&#x03F0;',
1791          'varnothing' => '&#x2205;',
1792          'varphi' => '&#x03D5;',
1793          'varpi' => '&#x03D6;',
1794          'varpropto' => '&#x221D;',
1795          'vArr' => '&#x21D5;',
1796          'varr' => '&#x2195;',
1797          'varrho' => '&#x03F1;',
1798          'varsigma' => '&#x03C2;',
1799          'varsubsetneq' => '&#xE2B9;',
1800          'varsubsetneqq' => '&#xE2B8;',
1801          'varsupsetneq' => '&#xE2BA;',
1802          'varsupsetneqq' => '&#xE2BB;',
1803          'vartheta' => '&#x03D1;',
1804          'vartriangleleft' => '&#x22B2;',
1805          'vartriangleright' => '&#x22B3;',
1806          'Vbar' => '&#xE30D;',
1807          'vBar' => '&#xE310;',
1808          'vBarv' => '&#xE312;',
1809          'VDash' => '&#x22AB;',
1810          'Vdash' => '&#x22A9;',
1811          'vDash' => '&#x22A8;',
1812          'vdash' => '&#x22A2;',
1813          'Vdashl' => '&#xE313;',
1814          'Vee' => '&#x22C1;',
1815          'vee' => '&#x2228;',
1816          'veebar' => '&#x22BB;',
1817          'veeeq' => '&#x225A;',
1818          'vellip' => '&#x22EE;',
1819          'Verbar' => '&#x2016;',
1820          'verbar' => '&#x007C;',
1821          'Vert' => '&#x2016;',
1822          'vert' => '&#x007C;',
1823          'VerticalBar' => '&#x2223;',
1824          'VerticalTilde' => '&#x2240;',
1825          'Vfr' => '&#xE491;',
1826          'vfr' => '&#xE4AA;',
1827          'vltri' => '&#x22B2;',
1828          'vnsub' => '&#x2284;',
1829          'vnsup' => '&#x2285;',
1830          'Vopf' => '&#xE4C0;',
1831          'vprop' => '&#x221D;',
1832          'vrtri' => '&#x22B3;',
1833          'Vscr' => '&#xE4DA;',
1834          'vscr' => '&#xE4F3;',
1835          'vsubnE' => '&#xE2B8;',
1836          'vsubne' => '&#xE2B9;',
1837          'vsupnE' => '&#xE2BB;',
1838          'vsupne' => '&#xE2BA;',
1839          'Vvdash' => '&#x22AA;',
1840          'vzigzag' => '&#xE2EB;',
1841          'wedbar' => '&#xE265;',
1842          'Wedge' => '&#x22C0;',
1843          'wedge' => '&#x2227;',
1844          'wedgeq' => '&#x2259;',
1845          'weierp' => '&#x2118;',
1846          'Wfr' => '&#xE492;',
1847          'wfr' => '&#xE4AB;',
1848          'Wopf' => '&#xE4C1;',
1849          'wp' => '&#x2118;',
1850          'wr' => '&#x2240;',
1851          'wreath' => '&#x2240;',
1852          'Wscr' => '&#xE4DB;',
1853          'wscr' => '&#xE4F4;',
1854          'xcap' => '&#x22C2;',
1855          'xcirc' => '&#x25CB;',
1856          'xcup' => '&#x22C3;',
1857          'xdtri' => '&#x25BD;',
1858          'Xfr' => '&#xE493;',
1859          'xfr' => '&#xE4AC;',
1860          'xhArr' => '&#xE202;',
1861          'xharr' => '&#xE203;',
1862          'Xi' => '&#x039E;',
1863          'xi' => '&#x03BE;',
1864          'xlArr' => '&#xE200;',
1865          'xlarr' => '&#xE201;',
1866          'xmap' => '&#xE208;',
1867          'xnis' => '&#xE3A3;',
1868          'xodot' => '&#x2299;',
1869          'Xopf' => '&#xE4C2;',
1870          'xoplus' => '&#x2295;',
1871          'xotime' => '&#x2297;',
1872          'xrArr' => '&#xE204;',
1873          'xrarr' => '&#xE205;',
1874          'Xscr' => '&#xE4DC;',
1875          'xscr' => '&#xE4F5;',
1876          'xsqcup' => '&#x2294;',
1877          'xuplus' => '&#x228E;',
1878          'xutri' => '&#x25B3;',
1879          'xvee' => '&#x22C1;',
1880          'xwedge' => '&#x22C0;',
1881          'yen' => '&#x00A5;',
1882          'Yfr' => '&#xE494;',
1883          'yfr' => '&#xE4AD;',
1884          'Yopf' => '&#xE4C3;',
1885          'Yscr' => '&#xE4DD;',
1886          'yscr' => '&#xE4F6;',
1887          'zeta' => '&#x03B6;',
1888          'Zfr' => '&#x2124;',
1889          'zfr' => '&#xE4AE;',
1890          'zigrarr' => '&#xE244;',
1891          'Zopf' => '&#xE4C4;',
1892          'Zscr' => '&#xE4DE;',
1893          'zscr' => '&#xE4F7;'
1894          );
1895          return $charset;
1896              
1897          
1898  
1899      // cas particuliers pour la translitteration
1900      case 'translit':
1901          $GLOBALS['CHARSET'][$charset] = array (
1902          // latin
1903          128=>'euro', 131=>'f', 140=>'OE', 147=>'\'\'', 148=>'\'\'', 153=>'TM', 156=>'oe', 159=>'Y', 160=>' ',
1904          161=>'!', 162=>'c', 163=>'L', 164=>'O', 165=>'yen',166=>'|',
1905          167=>'p',169=>'(c)', 171=>'<<',172=>'-',173=>'-',174=>'(R)',
1906          176=>'o',177=>'+-',181=>'mu',182=>'p',183=>'.',187=>'>>', 192=>'A',
1907          193=>'A', 194=>'A', 195=>'A', 196=>'A', 197=>'A', 198=>'AE', 199=>'C',
1908          200=>'E', 201=>'E', 202=>'E', 203=>'E', 204=>'I', 205=>'I', 206=>'I',
1909          207=>'I', 209=>'N', 210=>'O', 211=>'O', 212=>'O', 213=>'O', 214=>'O',
1910          216=>'O', 217=>'U', 218=>'U', 219=>'U', 220=>'U', 223=>'ss', 224=>'a',
1911          225=>'a', 226=>'a', 227=>'a', 228=>'a', 229=>'a', 230=>'ae', 231=>'c',
1912          232=>'e', 233=>'e', 234=>'e', 235=>'e', 236=>'i', 237=>'i', 238=>'i',
1913          239=>'i', 241=>'n', 242=>'o', 243=>'o', 244=>'o', 245=>'o', 246=>'o',
1914          248=>'o', 249=>'u', 250=>'u', 251=>'u', 252=>'u', 255=>'y',
1915  
1916          // turc
1917          286=>'G', 287=>'g', 304=>'I', 305=>'i', 350=>'S', 351=>'s',
1918  
1919          // esperanto
1920          264 => 'Cx',265 => 'cx',
1921          284 => 'Gx',285 => 'gx',
1922          292 => 'Hx',293 => 'hx',
1923          308 => 'Jx',309 => 'jx',
1924          348 => 'Sx',349 => 'sx',
1925          364 => 'Ux',365 => 'ux',
1926  
1927          // cyrillique
1928          1026=>'D%', 1027=>'G%', 8218=>'\'', 1107=>'g%', 8222=>'"', 8230=>'...',
1929          8224=>'/-', 8225=>'/=',  8364=>'EUR', 8240=>'0/00', 1033=>'LJ',
1930          8249=>'<', 1034=>'NJ', 1036=>'KJ', 1035=>'Ts', 1039=>'DZ',  1106=>'d%',
1931          8216=>'`', 8217=>'\'', 8220=>'"', 8221=>'"', 8226=>' o ', 8211=>'-',
1932          8212=>'--', 8212=>'~',  8482=>'(TM)', 1113=>'lj', 8250=>'>', 1114=>'nj',
1933          1116=>'kj', 1115=>'ts', 1119=>'dz',  1038=>'V%', 1118=>'v%', 1032=>'J%',
1934          1168=>'G3', 1025=>'IO',  1028=>'IE', 1031=>'YI', 1030=>'II',
1935          1110=>'ii', 1169=>'g3', 1105=>'io', 8470=>'No.', 1108=>'ie',
1936          1112=>'j%', 1029=>'DS', 1109=>'ds', 1111=>'yi', 1040=>'A', 1041=>'B',
1937          1042=>'V', 1043=>'G', 1044=>'D',  1045=>'E', 1046=>'ZH', 1047=>'Z',
1938          1048=>'I', 1049=>'J', 1050=>'K', 1051=>'L', 1052=>'M', 1053=>'N',
1939          1054=>'O', 1055=>'P', 1056=>'R', 1057=>'S', 1058=>'T', 1059=>'U',
1940          1060=>'F', 1061=>'H', 1062=>'C',  1063=>'CH', 1064=>'SH', 1065=>'SCH',
1941          1066=>'"', 1067=>'Y', 1068=>'\'', 1069=>'`E', 1070=>'YU',  1071=>'YA',
1942          1072=>'a', 1073=>'b', 1074=>'v', 1075=>'g', 1076=>'d', 1077=>'e',
1943          1078=>'zh', 1079=>'z',  1080=>'i', 1081=>'j', 1082=>'k', 1083=>'l',
1944          1084=>'m', 1085=>'n', 1086=>'o', 1087=>'p', 1088=>'r',  1089=>'s',
1945          1090=>'t', 1091=>'u', 1092=>'f', 1093=>'h', 1094=>'c', 1095=>'ch',
1946          1096=>'sh', 1097=>'sch',  1098=>'"', 1099=>'y', 1100=>'\'', 1101=>'`e',
1947          1102=>'yu', 1103=>'ya',
1948          
1949          // vietnamien en translitteration de base
1950          7843=>"a",7841=>"a",7845=>"a",7847=>"a",7849=>"a",7851=>"a",7853=>"a",
1951          7855=>"a",7857=>"a",7859=>"a",7861=>"a",7863=>"a",
1952          7842=>"A",7840=>"A",7844=>"A",7846=>"A",7848=>"A",
1953          7850=>"A",7852=>"A",7854=>"A",7856=>"A",7858=>"A",7860=>"A",
1954          7862=>"A",7867=>"e",7869=>"e",7865=>"e",
1955          7871=>"e",7873=>"e",7875=>"e",7877=>"e",7879=>"e",
1956          7866=>"E",7868=>"E",7864=>"E",7870=>"E",7872=>"E",7874=>"E",
1957          7876=>"E",7878=>"E",7881=>"i",7883=>"i",
1958          7880=>"I",7882=>"I",
1959          7887=>"o",7885=>"o",7889=>"o",7891=>"o",7893=>"o",
1960          7895=>"o",7897=>"o",417=>"o",7899=>"o",7901=>"o",7903=>"o",7905=>"o",
1961          7907=>"o",7886=>"O",7884=>"O",
1962          7888=>"O",7890=>"O",7892=>"O",7894=>"O",7896=>"O",416=>"O",7898=>"O",
1963          7900=>"O",7902=>"O",7904=>"O",7906=>"O",7911=>"u",
1964          361=>"u",7909=>"u",432=>"u",7913=>"u",7915=>"u",7917=>"u",7919=>"u",
1965          7921=>"u",7910=>"U",360=>"U",7908=>"U",431=>"U",
1966          7912=>"U",7914=>"U",7916=>"U",7918=>"U",7920=>"U",253=>"y",7923=>"y",
1967          7927=>"y",7929=>"y",7925=>"y",221=>"Y",7922=>"Y",7926=>"Y",7928=>"Y",
1968          7924=>"Y",273=>"d"
1969          
1970          );
1971          return $charset;
1972  
1973      // translitteration complexe
1974      case 'translitcomplexe':
1975          load_charset('translit');
1976          $trans = $GLOBALS['CHARSET']['translit'];
1977  
1978          $translit_c = array (
1979          // vietnamien
1980          225=>"a'", 224=>"a`",7843=>"a?",227=>"a~",7841=>"a.",
1981          226=>"a^",7845=>"a^'",7847=>"a^`",7849=>"a^?",7851=>"a^~",7853=>"a^.",259=>"a(",
1982          7855=>"a('",7857=>"a(`",7859=>"a(?",7861=>"a(~",7863=>"a(.",193=>"A'",192=>"A`",
1983          7842=>"A?",195=>"A~",7840=>"A.",194=>"A^",7844=>"A^'",7846=>"A^`",7848=>"A^?",
1984          7850=>"A^~",7852=>"A^.",258=>"A(",7854=>"A('",7856=>"A(`",7858=>"A(?",7860=>"A(~",
1985          7862=>"A(.",233=>"e'",232=>"e`",7867=>"e?",7869=>"e~",7865=>"e.",234=>"e^",
1986          7871=>"e^'",7873=>"e^`",7875=>"e^?",7877=>"e^~",7879=>"e^.",201=>"E'",200=>"E`",
1987          7866=>"E?",7868=>"E~",7864=>"E.",202=>"E^",7870=>"E^'",7872=>"E^`",7874=>"E^?",
1988          7876=>"E^~",7878=>"E^.",237=>"i'",236=>"i`",7881=>"i?",297=>"i~",7883=>"i.",
1989          205=>"I'",204=>"I`",7880=>"I?",296=>"I~",7882=>"I.",243=>"o'",242=>"o`",
1990          7887=>"o?",245=>"o~",7885=>"o.",244=>"o^",7889=>"o^'",7891=>"o^`",7893=>"o^?",
1991          7895=>"o^~",7897=>"o^.",417=>"o+",7899=>"o+'",7901=>"o+`",7903=>"o+?",7905=>"o+~",
1992          7907=>"o+.",211=>"O'",210=>"O`",7886=>"O?",213=>"O~",7884=>"O.",212=>"O^",
1993          7888=>"O^'",7890=>"O^`",7892=>"O^?",7894=>"O^~",7896=>"O^.",416=>"O+",7898=>"O+'",
1994          7900=>"O+`",7902=>"O+?",7904=>"O+~",7906=>"O+.",250=>"u'",249=>"u`",7911=>"u?",
1995          361=>"u~",7909=>"u.",432=>"u+",7913=>"u+'",7915=>"u+`",7917=>"u+?",7919=>"u+~",
1996          7921=>"u+.",218=>"U'",217=>"U`",7910=>"U?",360=>"U~",7908=>"U.",431=>"U+",
1997          7912=>"U+'",7914=>"U+`",7916=>"U+?",7918=>"U+~",7920=>"U+.",253=>"y'",7923=>"y`",
1998          7927=>"y?",7929=>"y~",7925=>"y.",221=>"Y'",7922=>"Y`",7926=>"Y?",7928=>"Y~",
1999          7924=>"Y.",273=>"d-",208=>"D-",
2000  
2001          // allemand
2002          228=>'ae',246=>'oe',252=>'ue',196=>'Ae',214=>'Oe',220=>'Ue'
2003          );
2004          foreach($translit_c as $u=>$t)
2005              $trans[$u] = $t;
2006          $GLOBALS['CHARSET'][$charset] = $trans;
2007          return $charset;
2008  
2009  
2010      default:
2011          $GLOBALS['CHARSET'][$charset] = array();
2012          return $charset;
2013      }
2014  }
2015  
2016  //
2017  // Verifier qu'on peut utiliser mb_string
2018  //
2019  function init_mb_string() {
2020      static $mb;
2021  
2022      // verifier que tout est present (fonctions mb_string pour php >= 4.0.6)
2023      // et que le charset interne est connu de mb_string
2024      if (!$mb) {
2025          if (function_exists('mb_internal_encoding')
2026          AND function_exists('mb_detect_order')
2027          AND function_exists('mb_substr')
2028          AND function_exists('mb_strlen')
2029          AND function_exists('mb_encode_mimeheader')
2030          AND function_exists('mb_encode_numericentity')
2031          AND function_exists('mb_decode_numericentity')
2032          AND mb_detect_order(lire_meta('charset'))
2033          ) {
2034              mb_internal_encoding('utf-8');
2035              $mb = 1;
2036          } else
2037              $mb = -1;
2038      }
2039  
2040      return ($mb == 1);
2041  }
2042  
2043  // Detecter les versions buggees d'iconv
2044  function test_iconv() {
2045      static $iconv_ok;
2046  
2047      if (!$iconv_ok) {
2048          if (!function_exists('iconv'))
2049              $iconv_ok = -1;
2050          else {
2051              if (utf_32_to_unicode(@iconv('utf-8', 'utf-32', 'chaine de test')) == 'chaine de test')
2052                  $iconv_ok = 1;
2053              else
2054                  $iconv_ok = -1;
2055          }
2056      }
2057      return ($iconv_ok == 1);
2058  }
2059  
2060  // Test de fonctionnement du support UTF-8 dans PCRE
2061  // (contournement bug Debian Woody)
2062  function test_pcre_unicode() {
2063      static $pcre_ok = 0;
2064  
2065      if (!$pcre_ok) {
2066          $s = " ".chr(195).chr(169)."t".chr(195).chr(169)." ";
2067          if (preg_match(',\W\w\w\w\W,u', $s)) $pcre_ok = 1;
2068          else $pcre_ok = -1;
2069      }
2070      return $pcre_ok == 1;
2071  }
2072  
2073  // Plages alphanumeriques (incomplet...)
2074  function pcre_lettres_unicode() {
2075      static $plage_unicode;
2076  
2077      if (!$plage_unicode) {
2078          if (test_pcre_unicode()) {
2079              // cf. http://www.unicode.org/charts/
2080              $plage_unicode = '\w' // iso-latin
2081                  . '\x{100}-\x{24f}' // europeen etendu
2082                  . '\x{300}-\x{1cff}' // des tas de trucs
2083              ;
2084          }
2085          else {
2086              // fallback a trois sous
2087              $plage_unicode = '\w';
2088          }
2089      }
2090      return $plage_unicode;
2091  }
2092  
2093  // Plage ponctuation de 0x2000 a 0x206F
2094  // (i.e. de 226-128-128 a 226-129-176)
2095  function plage_punct_unicode() {
2096      return '\xE2(\x80[\x80-\xBF]|\x81[\x80-\xAF])';
2097  }
2098  
2099  //
2100  // Transformer les &eacute; en &#123;
2101  //
2102  function html2unicode($texte) {
2103      static $trans;
2104      if (!$trans) {
2105          global $CHARSET;
2106          load_charset('html');
2107          foreach ($CHARSET['html'] as $key => $val) {
2108              $trans["&$key;"] = $val;
2109          }
2110      }
2111  
2112      return strtr($texte, $trans);
2113  }
2114  
2115  //
2116  // Transformer les &eacute; en &#123;
2117  //
2118  function mathml2unicode($texte) {
2119      static $trans;
2120      if (!$trans) {
2121          global $CHARSET;
2122          load_charset('mathml');
2123          
2124          foreach ($CHARSET['mathml'] as $key => $val)
2125              $trans["&$key;"] = $val;
2126      }
2127  
2128      return strtr($texte, $trans);
2129  }
2130  
2131  
2132  //
2133  // Transforme une chaine en entites unicode &#129;
2134  //
2135  function charset2unicode($texte, $charset='AUTO', $forcer = false) {
2136      static $trans;
2137  
2138      if ($charset == 'AUTO')
2139          $charset = lire_meta('charset');
2140  
2141      $charset = strtolower($charset);
2142  
2143      switch ($charset) {
2144      case 'utf-8':
2145          return utf_8_to_unicode($texte);
2146  
2147      case 'iso-8859-1':
2148          // corriger caracteres non-conformes issus de Windows (CP-1252)
2149          $faux_latin = array(
2150              chr(138) => "&#352;", // Scaron
2151              chr(140) => "&#338;", // OElig
2152              chr(142) => "&#381;", // Zcaron
2153              chr(154) => "&#353;", // scaron
2154              chr(156) => "&#339;", // oelig
2155              chr(158) => "&#382;" // zcaron
2156          );
2157          $texte = strtr($texte, $faux_latin);
2158  
2159          // On commente cet appel tant qu'il reste des spip v<1.5 dans la nature
2160          // pour que le filtre |entites_unicode donne des backends lisibles sur ces spips.
2161          if (!$forcer) return $texte;
2162  
2163      default:
2164          // mbstring presente ?
2165          if (init_mb_string()) {
2166              if ($order = mb_detect_order() # mb_string connait-il $charset?
2167              AND mb_detect_order($charset)) {
2168                  $s = mb_convert_encoding($texte, 'utf-8', $charset);
2169                  if ($s && $s != $texte) return utf_8_to_unicode($s);
2170              }
2171              mb_detect_order($order); # remettre comme precedemment
2172          }
2173  
2174          // Sinon, peut-etre connaissons-nous ce charset ?
2175          if (!isset($trans[$charset])) {
2176              global $CHARSET;
2177              load_charset($charset);
2178              foreach ($CHARSET[$charset] as $key => $val) {
2179                  $trans[$charset][chr($key)] = '&#'.$val.';';
2180              }
2181          }
2182          if (count($trans[$charset]))
2183              return strtr($texte, $trans[$charset]);
2184  
2185          // Sinon demander a iconv (malgre le fait qu'il coupe quand un
2186          // caractere n'appartient pas au charset, mais c'est un probleme
2187          // surtout en utf-8, gere ci-dessus)
2188          if (test_iconv()) {
2189              $s = iconv($charset, 'utf-32le', $texte);
2190              if ($s) return utf_32_to_unicode($s);
2191          }
2192  
2193          // Au pire ne rien faire
2194          spip_log("erreur charset $charset non supporte");
2195          return $texte;
2196      }
2197  }
2198  
2199  //
2200  // Transforme les entites unicode &#129; dans le charset specifie
2201  //
2202  function unicode2charset($texte, $charset='AUTO') {
2203      static $CHARSET_REVERSE;
2204      if ($charset == 'AUTO')
2205          $charset = lire_meta('charset');
2206  
2207      switch($charset) {
2208      case 'utf-8':
2209          return unicode_to_utf_8($texte);
2210          break;
2211  
2212      default:
2213          $charset = load_charset($charset);
2214  
2215          if (!is_array($CHARSET_REVERSE[$charset])) {
2216              $CHARSET_REVERSE[$charset] = array_flip($GLOBALS['CHARSET'][$charset]);
2217          }
2218  
2219          $trans = array();
2220          // Construire la table de remplacements
2221          // 1. Entites decimales (type "&#123;")
2222          if (preg_match_all(',&#([0-9]+);,', $texte, $regs, PREG_PATTERN_ORDER)) {
2223              $entites = array_flip($regs[1]);
2224              foreach ($entites as $e => $v) {
2225                  if ($s = ($e < 128) ? $e : $CHARSET_REVERSE[$charset][intval($e)])
2226                      $trans['&#'.$e.';'] = chr($s);
2227              }
2228          }
2229          // 2. Entites hexadecimales (type "&#xD;")
2230          if (preg_match_all(',&#x([0-9a-zA-Z]+);,', $texte, $regs, PREG_PATTERN_ORDER)) {
2231              $entites = array_flip($regs[1]);
2232              foreach ($entites as $e => $v) {
2233                  $h = hexdec($e);
2234                  if ($s = ($h < 128) ? $h : $CHARSET_REVERSE[$charset][$h])
2235                      $trans['&#x'.$e.';'] = chr($s);
2236              }
2237          }
2238          $texte = strtr($texte, $trans);
2239          return $texte;
2240      }
2241  }
2242  
2243  
2244  // Importer un texte depuis un charset externe vers le charset du site
2245  // (les caracteres non resolus sont transformes en &#123;)
2246  function importer_charset($texte, $charset = 'AUTO') {
2247      return unicode2charset(charset2unicode($texte, $charset, true));
2248  }
2249  
2250  // UTF-8
2251  function utf_8_to_unicode($source) {
2252  
2253      // mb_string : methode rapide
2254      if (init_mb_string()) {
2255          $convmap = array(0x7F, 0xFFFFFF, 0x0, 0xFFFFFF);
2256          return mb_encode_numericentity($source, $convmap, 'UTF-8');
2257      }
2258  
2259      // Sinon methode pas a pas
2260      static $decrement;
2261      static $shift;
2262  
2263      // Cf. php.net, par Ronen. Adapte pour compatibilite php3
2264      if (!is_array($decrement)) {
2265          // array used to figure what number to decrement from character order value
2266          // according to number of characters used to map unicode to ascii by utf-8
2267          $decrement[4] = 240;
2268          $decrement[3] = 224;
2269          $decrement[2] = 192;
2270          $decrement[1] = 0;
2271          // the number of bits to shift each charNum by
2272          $shift[1][0] = 0;
2273          $shift[2][0] = 6;
2274          $shift[2][1] = 0;
2275          $shift[3][0] = 12;
2276          $shift[3][1] = 6;
2277          $shift[3][2] = 0;
2278          $shift[4][0] = 18;
2279          $shift[4][1] = 12;
2280          $shift[4][2] = 6;
2281          $shift[4][3] = 0;
2282      }
2283  
2284      $pos = 0;
2285      $len = strlen ($source);
2286      $encodedString = '';
2287      while ($pos < $len) {
2288          $char = '';
2289          $ischar = false;
2290          $asciiPos = ord (substr ($source, $pos, 1));
2291          if (($asciiPos >= 240) && ($asciiPos <= 255)) {
2292              // 4 chars representing one unicode character
2293              $thisLetter = substr ($source, $pos, 4);
2294              $pos += 4;
2295          }
2296          else if (($asciiPos >= 224) && ($asciiPos <= 239)) {
2297              // 3 chars representing one unicode character
2298              $thisLetter = substr ($source, $pos, 3);
2299              $pos += 3;
2300          }
2301          else if (($asciiPos >= 192) && ($asciiPos <= 223)) {
2302              // 2 chars representing one unicode character
2303              $thisLetter = substr ($source, $pos, 2);
2304              $pos += 2;
2305          }
2306          else {
2307              // 1 char (lower ascii)
2308              $thisLetter = substr ($source, $pos, 1);
2309              $pos += 1;
2310              $char = $thisLetter;
2311              $ischar = true;
2312          }
2313  
2314          if ($ischar)
2315              $encodedString .= $char;
2316          else {    // process the string representing the letter to a unicode entity
2317              $thisLen = strlen ($thisLetter);
2318              $thisPos = 0;
2319              $decimalCode = 0;
2320              while ($thisPos < $thisLen) {
2321                  $thisCharOrd = ord (substr ($thisLetter, $thisPos, 1));
2322                  if ($thisPos == 0) {
2323                      $charNum = intval ($thisCharOrd - $decrement[$thisLen]);
2324                      $decimalCode += ($charNum << $shift[$thisLen][$thisPos]);
2325                  } else {
2326                      $charNum = intval ($thisCharOrd - 128);
2327                      $decimalCode += ($charNum << $shift[$thisLen][$thisPos]);
2328                  }
2329                  $thisPos++;
2330              }
2331              $encodedLetter = "&#". ereg_replace('^0+', '', $decimalCode) . ';';
2332              $encodedString .= $encodedLetter;
2333          }
2334      }
2335      return $encodedString;
2336  }
2337  
2338  // UTF-32 ne sert plus que si on passe par iconv, c'est-a-dire quand
2339  // mb_string est absente ou ne connait pas notre charset
2340  // mais on l'optimise quand meme par mb_string
2341  // => tout ca sera osolete quand on sera surs d'avoir mb_string
2342  function utf_32_to_unicode($source) {
2343  
2344      // mb_string : methode rapide
2345      if (init_mb_string()) {
2346          $convmap = array(0x7F, 0xFFFFFF, 0x0, 0xFFFFFF);
2347          $source = mb_encode_numericentity($source, $convmap, 'UTF-32LE');
2348          return str_replace(chr(0), '', $source);
2349      }
2350  
2351      // Sinon methode lente
2352      $texte = '';
2353      while ($source) {
2354          $words = unpack("V*", substr($source, 0, 1024));
2355          $source = substr($source, 1024);
2356          foreach ($words as $word) {
2357              if ($word < 128)
2358                  $texte .= chr($word);
2359              // ignorer le BOM - http://www.unicode.org/faq/utf_bom.html
2360              else if ($word != 65279)
2361                  $texte .= '&#'.$word.';';
2362          }
2363      }
2364      return $texte;
2365  
2366  }
2367  
2368  // Ce bloc provient de php.net, auteur Ronen
2369  function caractere_utf_8($num) {
2370      if($num<128)
2371          return chr($num);
2372      if($num<2048)
2373          return chr(($num>>6)+192).chr(($num&63)+128);
2374      if($num<65536)
2375          return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
2376      if($num<1114112)
2377          return chr($num>>18+240).chr((($num>>12)&63)+128).chr(($num>>6)&63+128). chr($num&63+128);
2378      return '';
2379  }
2380  
2381  function unicode_to_utf_8($texte) {
2382      while (preg_match(',&#0*([0-9]+);,', $texte, $regs)) {
2383          $s = caractere_utf_8($regs[1]);
2384          $texte = str_replace($regs[0], $s, $texte);
2385      }
2386      return $texte;
2387  }
2388  
2389  // convertit les &#264; en \u0108
2390  function unicode_to_javascript($texte) {
2391      while (preg_match(',&#0*([0-9]+);,', $texte, $regs) AND !$vu[$regs[1]]) {
2392          $num = $regs[1];
2393          $vu[$num] = true;
2394          $s = '\u'.sprintf("%04x", $num);
2395          $texte = str_replace($regs[0], $s, $texte);
2396      }
2397      return $texte;
2398  }
2399  
2400  // convertit les %uxxxx (envoyes par javascript)
2401  function javascript_to_unicode ($texte) {
2402      while (ereg("%u([0-9A-F][0-9A-F][0-9A-F][0-9A-F])", $texte, $regs))
2403          $texte = str_replace($regs[0],"&#".hexdec($regs[1]).";", $texte);
2404      return $texte;
2405  }
2406  // convertit les %E9 (envoyes par le browser) en chaine du charset du site (binaire)
2407  function javascript_to_binary ($texte) {
2408      while (ereg("%([0-9A-F][0-9A-F])", $texte, $regs))
2409          $texte = str_replace($regs[0],chr(hexdec($regs[1])), $texte);
2410      return $texte;
2411  }
2412  
2413  
2414  //
2415  // Translitteration charset => ascii (pour l'indexation)
2416  // Attention les caracteres non reconnus sont renvoyes en utf-8
2417  //
2418  function translitteration($texte, $charset='AUTO', $complexe='') {
2419      static $trans;
2420      if ($charset == 'AUTO')
2421          $charset = lire_meta('charset');
2422  
2423      $table_translit ='translit'.$complexe;
2424  
2425      // 1. Passer le charset et les &eacute en utf-8
2426      $texte = unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset, true)));
2427  
2428      // 2. Translitterer grace a la table predefinie
2429      if (!$trans[$complexe]) {
2430          global $CHARSET;
2431          load_charset($table_translit);
2432          foreach ($CHARSET[$table_translit] as $key => $val)
2433              $trans[$complexe][caractere_utf_8($key)] = $val;
2434      }
2435  
2436      return strtr($texte, $trans[$complexe]);
2437  }
2438  
2439  function translitteration_complexe($texte) {
2440      return translitteration($texte,'AUTO','complexe');
2441  }
2442  
2443  // Reconnaitre le BOM utf-8 (0xEFBBBF)
2444  function bom_utf8($texte) {
2445      return (substr($texte, 0,3) == chr(0xEF).chr(0xBB).chr(0xBF));
2446  }
2447  
2448  // Transcode une page (probablement attrapee sur le web) en essayant
2449  // par tous les moyens de deviner son charset (y compris headers HTTP)
2450  function transcoder_page($texte, $headers='') {
2451  
2452      // Reconnaitre le BOM utf-8 (0xEFBBBF)
2453      if (bom_utf8($texte))
2454          $charset = 'utf-8';
2455      // charset precise par le contenu (xml)
2456      else if (preg_match(',<[?]xml[^>]*encoding[^>]*=[^>]*([-_a-z0-9]+?),Uims', $texte, $regs))
2457          $charset = trim(strtolower($regs[1]));
2458      // charset precise par le contenu (html)
2459      else if (preg_match(',<(meta|html|body)[^>]*charset[^>]*=[^>]*([-_a-z0-9]+?),Uims', $texte, $regs))
2460          $charset = trim(strtolower($regs[2]));
2461      // charset de la reponse http
2462      else if (preg_match(',charset=([-_a-z0-9]+),i', $headers, $regs))
2463          $charset = trim(strtolower($regs[1]));
2464  
2465      // normaliser les noms du shif-jis japonais
2466      if (preg_match(',^(x|shift)[_-]s?jis$,i', $charset))
2467          $charset = 'shift-jis';
2468  
2469      if ($charset) {
2470          spip_log("charset source detecte : $charset");
2471      } else {
2472          // valeur par defaut
2473          $charset = 'iso-8859-1';
2474          spip_log("pas de charset detecte, on suppose : $charset");
2475      }
2476  
2477      return importer_charset($texte, $charset);
2478  }
2479  
2480  // Initialisation
2481  $GLOBALS['CHARSET'] = Array();
2482  
2483  ?>


Généré le : Thu Feb 22 22:27:47 2007 par Balluche grâce à PHPXref 0.7