Subversion Repositories Sites.tela-botanica.org

Rev

Rev 609 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2005                                                *
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/


//
// Ce fichier ne sera execute qu'une fois
if (defined("_ECRIRE_INC_CHARSETS")) return;
define("_ECRIRE_INC_CHARSETS", "1");


/* charsets supportes en natif (les autres via mb_string) :
        utf-8 ;
        iso-8859-1 ; iso-8859-9 ; iso-8859-15 ;
        windows-1251  = CP1251 ;
*/
function load_charset ($charset = 'AUTO', $langue_site = 'AUTO') {
        if ($charset == 'AUTO')
                $charset = lire_meta('charset');
        if (is_array($GLOBALS['CHARSET'][$charset]))
                return $charset;

        if ($langue_site == 'AUTO')
                $langue_site = lire_meta('langue_site');

        switch (strtolower($charset)) {
        case 'utf-8':
                $GLOBALS['CHARSET'][$charset] = array();
                return $charset;

        // iso latin 1
        case 'iso-8859-1':
        case '':
                $GLOBALS['CHARSET'][$charset] = array (
                128=>128, 129=>129, 130=>130, 131=>131, 132=>132, 133=>133, 134=>134, 135=>135,
                136=>136, 137=>137, 138=>138, 139=>139, 140=>140, 141=>141, 142=>142, 143=>143,
                144=>144, 145=>145, 146=>146, 147=>147, 148=>148, 149=>149, 150=>150, 151=>151,
                152=>152, 153=>153, 154=>154, 155=>155, 156=>156, 157=>157, 158=>158, 159=>159,
                160=>160, 161=>161, 162=>162, 163=>163, 164=>164, 165=>165, 166=>166, 167=>167,
                168=>168, 169=>169, 170=>170, 171=>171, 172=>172, 173=>173, 174=>174, 175=>175,
                176=>176, 177=>177, 178=>178, 179=>179, 180=>180, 181=>181, 182=>182, 183=>183,
                184=>184, 185=>185, 186=>186, 187=>187, 188=>188, 189=>189, 190=>190, 191=>191,
                192=>192, 193=>193, 194=>194, 195=>195, 196=>196, 197=>197, 198=>198, 199=>199,
                200=>200, 201=>201, 202=>202, 203=>203, 204=>204, 205=>205, 206=>206, 207=>207,
                208=>208, 209=>209, 210=>210, 211=>211, 212=>212, 213=>213, 214=>214, 215=>215,
                216=>216, 217=>217, 218=>218, 219=>219, 220=>220, 221=>221, 222=>222, 223=>223,
                224=>224, 225=>225, 226=>226, 227=>227, 228=>228, 229=>229, 230=>230, 231=>231,
                232=>232, 233=>233, 234=>234, 235=>235, 236=>236, 237=>237, 238=>238, 239=>239,
                240=>240, 241=>241, 242=>242, 243=>243, 244=>244, 245=>245, 246=>246, 247=>247,
                248=>248, 249=>249, 250=>250, 251=>251, 252=>252, 253=>253, 254=>254, 255=>255
                );
                return $charset;


        // iso latin 9 - Turc <alexis@nds.k12.tr>
        case 'iso-8859-9':
                load_charset('iso-8859-1');
                $trans = $GLOBALS['CHARSET']['iso-8859-1'];
                $trans[240]=287; //gbreve
                $trans[208]=286; //Gbreve
                $trans[221]=304; //Idot
                $trans[253]=305; //inodot
                $trans[254]=351; //scedil
                $trans[222]=350; //Scedil
                $GLOBALS['CHARSET'][$charset] = $trans;
                return $charset;


        // iso latin 15 - Gaetan Ryckeboer <gryckeboer@virtual-net.fr>
        case 'iso-8859-15':
                load_charset('iso-8859-1');
                $trans = $GLOBALS['CHARSET']['iso-8859-1'];
                $trans[164]=8364;
                $trans[166]=352;
                $trans[168]=353;
                $trans[180]=381;
                $trans[184]=382;
                $trans[188]=338;
                $trans[189]=339;
                $trans[190]=376;
                $GLOBALS['CHARSET'][$charset] = $trans;
                return $charset;


        // cyrillic - ref. http://czyborra.com/charsets/cyrillic.html
        case 'windows-1251':
        case 'cp1251':
                $GLOBALS['CHARSET'][$charset] = array (
                0x80=>0x0402, 0x81=>0x0403, 0x82=>0x201A, 0x83=>0x0453, 0x84=>0x201E,
                0x85=>0x2026, 0x86=>0x2020, 0x87=>0x2021, 0x88=>0x20AC, 0x89=>0x2030,
                0x8A=>0x0409, 0x8B=>0x2039, 0x8C=>0x040A, 0x8D=>0x040C, 0x8E=>0x040B,
                0x8F=>0x040F, 0x90=>0x0452, 0x91=>0x2018, 0x92=>0x2019, 0x93=>0x201C,
                0x94=>0x201D, 0x95=>0x2022, 0x96=>0x2013, 0x97=>0x2014, 0x99=>0x2122,
                0x9A=>0x0459, 0x9B=>0x203A, 0x9C=>0x045A, 0x9D=>0x045C, 0x9E=>0x045B,
                0x9F=>0x045F, 0xA0=>0x00A0, 0xA1=>0x040E, 0xA2=>0x045E, 0xA3=>0x0408,
                0xA4=>0x00A4, 0xA5=>0x0490, 0xA6=>0x00A6, 0xA7=>0x00A7, 0xA8=>0x0401,
                0xA9=>0x00A9, 0xAA=>0x0404, 0xAB=>0x00AB, 0xAC=>0x00AC, 0xAD=>0x00AD,
                0xAE=>0x00AE, 0xAF=>0x0407, 0xB0=>0x00B0, 0xB1=>0x00B1, 0xB2=>0x0406,
                0xB3=>0x0456, 0xB4=>0x0491, 0xB5=>0x00B5, 0xB6=>0x00B6, 0xB7=>0x00B7,
                0xB8=>0x0451, 0xB9=>0x2116, 0xBA=>0x0454, 0xBB=>0x00BB, 0xBC=>0x0458,
                0xBD=>0x0405, 0xBE=>0x0455, 0xBF=>0x0457, 0xC0=>0x0410, 0xC1=>0x0411,
                0xC2=>0x0412, 0xC3=>0x0413, 0xC4=>0x0414, 0xC5=>0x0415, 0xC6=>0x0416,
                0xC7=>0x0417, 0xC8=>0x0418, 0xC9=>0x0419, 0xCA=>0x041A, 0xCB=>0x041B,
                0xCC=>0x041C, 0xCD=>0x041D, 0xCE=>0x041E, 0xCF=>0x041F, 0xD0=>0x0420,
                0xD1=>0x0421, 0xD2=>0x0422, 0xD3=>0x0423, 0xD4=>0x0424, 0xD5=>0x0425,
                0xD6=>0x0426, 0xD7=>0x0427, 0xD8=>0x0428, 0xD9=>0x0429, 0xDA=>0x042A,
                0xDB=>0x042B, 0xDC=>0x042C, 0xDD=>0x042D, 0xDE=>0x042E, 0xDF=>0x042F,
                0xE0=>0x0430, 0xE1=>0x0431, 0xE2=>0x0432, 0xE3=>0x0433, 0xE4=>0x0434,
                0xE5=>0x0435, 0xE6=>0x0436, 0xE7=>0x0437, 0xE8=>0x0438, 0xE9=>0x0439,
                0xEA=>0x043A, 0xEB=>0x043B, 0xEC=>0x043C, 0xED=>0x043D, 0xEE=>0x043E,
                0xEF=>0x043F, 0xF0=>0x0440, 0xF1=>0x0441, 0xF2=>0x0442, 0xF3=>0x0443,
                0xF4=>0x0444, 0xF5=>0x0445, 0xF6=>0x0446, 0xF7=>0x0447, 0xF8=>0x0448,
                0xF9=>0x0449, 0xFA=>0x044A, 0xFB=>0x044B, 0xFC=>0x044C, 0xFD=>0x044D,
                0xFE=>0x044E, 0xFF=>0x044F); // fin windows-1251
                return $charset;
        
        // arabic - george kandalaft - http://www.microsoft.com/typography/unicode/1256.htm
        case 'windows-1256':
        case 'cp1256':
                $GLOBALS['CHARSET'][$charset] = array (
                0x80=>0x20AC, 0x81=>0x067E, 0x82=>0x201A, 0x83=>0x0192, 0x84=>0x201E,
                0x85=>0x2026, 0x86=>0x2020, 0x87=>0x2021, 0x88=>0x02C6, 0x89=>0x2030,
                0x8A=>0x0679, 0x8B=>0x2039, 0x8C=>0x0152, 0x8D=>0x0686, 0x8E=>0x0698,
                0x8F=>0x0688, 0x90=>0x06AF, 0x91=>0x2018, 0x92=>0x2019, 0x93=>0x201C,
                0x94=>0x201D, 0x95=>0x2022, 0x96=>0x2013, 0x97=>0x2014, 0x98=>0x06A9,
                0x99=>0x2122, 0x9A=>0x0691, 0x9B=>0x203A, 0x9C=>0x0153, 0x9D=>0x200C,
                0x9E=>0x200D, 0x9F=>0x06BA, 0xA0=>0x00A0, 0xA1=>0x060C, 0xA2=>0x00A2,
                0xA3=>0x00A3, 0xA4=>0x00A4, 0xA5=>0x00A5, 0xA6=>0x00A6, 0xA7=>0x00A7,
                0xA8=>0x00A8, 0xA9=>0x00A9, 0xAA=>0x06BE, 0xAB=>0x00AB, 0xAC=>0x00AC,
                0xAD=>0x00AD, 0xAE=>0x00AE, 0xAF=>0x00AF, 0xB0=>0x00B0, 0xB1=>0x00B1,
                0xB2=>0x00B2, 0xB3=>0x00B3, 0xB4=>0x00B4, 0xB5=>0x00B5, 0xB6=>0x00B6,
                0xB7=>0x00B7, 0xB8=>0x00B8, 0xB9=>0x00B9, 0xBA=>0x061B, 0xBB=>0x00BB,
                0xBC=>0x00BC, 0xBD=>0x00BD, 0xBE=>0x00BE, 0xBF=>0x061F, 0xC0=>0x06C1,
                0xC1=>0x0621, 0xC2=>0x0622, 0xC3=>0x0623, 0xC4=>0x0624, 0xC5=>0x0625,
                0xC6=>0x0626, 0xC7=>0x0627, 0xC8=>0x0628, 0xC9=>0x0629, 0xCA=>0x062A,
                0xCB=>0x062B, 0xCC=>0x062C, 0xCD=>0x062D, 0xCE=>0x062E, 0xCF=>0x062F,
                0xD0=>0x0630, 0xD1=>0x0631, 0xD2=>0x0632, 0xD3=>0x0633, 0xD4=>0x0634,
                0xD5=>0x0635, 0xD6=>0x0636, 0xD7=>0x00D7, 0xD8=>0x0637, 0xD9=>0x0638,
                0xDA=>0x0639, 0xDB=>0x063A, 0xDC=>0x0640, 0xDD=>0x0641, 0xDE=>0x0642,
                0xDF=>0x0643, 0xE0=>0x00E0, 0xE1=>0x0644, 0xE2=>0x00E2, 0xE3=>0x0645,
                0xE4=>0x0646, 0xE5=>0x0647, 0xE6=>0x0648, 0xE7=>0x00E7, 0xE8=>0x00E8,
                0xE9=>0x00E9, 0xEA=>0x00EA, 0xEB=>0x00EB, 0xEC=>0x0649, 0xED=>0x064A,
                0xEE=>0x00EE, 0xEF=>0x00EF, 0xF0=>0x064B, 0xF1=>0x064C, 0xF2=>0x064D,
                0xF3=>0x064E, 0xF4=>0x00F4, 0xF5=>0x064F, 0xF6=>0x0650, 0xF7=>0x00F7,
                0xF8=>0x0651, 0xF9=>0x00F9, 0xFA=>0x0652, 0xFB=>0x00FB, 0xFC=>0x00FC,
                0xFD=>0x200E, 0xFE=>0x200F, 0xFF=>0x06D2); // fin windows-1256
                return $charset;
        // arabic iso-8859-6 - http://czyborra.com/charsets/iso8859.html#ISO-8859-6
        case 'iso-8859-6':
                load_charset('iso-8859-1');
                $trans = $GLOBALS['CHARSET']['iso-8859-1'];
                $mod = Array(
                0xA0=>0x00A0, 0xA4=>0x00A4, 0xAC=>0x060C, 0xAD=>0x00AD, 0xBB=>0x061B,
                0xBF=>0x061F, 0xC1=>0x0621, 0xC2=>0x0622, 0xC3=>0x0623, 0xC4=>0x0624,
                0xC5=>0x0625, 0xC6=>0x0626, 0xC7=>0x0627, 0xC8=>0x0628, 0xC9=>0x0629,
                0xCA=>0x062A, 0xCB=>0x062B, 0xCC=>0x062C, 0xCD=>0x062D, 0xCE=>0x062E,
                0xCF=>0x062F, 0xD0=>0x0630, 0xD1=>0x0631, 0xD2=>0x0632, 0xD3=>0x0633,
                0xD4=>0x0634, 0xD5=>0x0635, 0xD6=>0x0636, 0xD7=>0x0637, 0xD8=>0x0638,
                0xD9=>0x0639, 0xDA=>0x063A, 0xE0=>0x0640, 0xE1=>0x0641, 0xE2=>0x0642,
                0xE3=>0x0643, 0xE4=>0x0644, 0xE5=>0x0645, 0xE6=>0x0646, 0xE7=>0x0647,
                0xE8=>0x0648, 0xE9=>0x0649, 0xEA=>0x064A, 0xEB=>0x064B, 0xEC=>0x064C,
                0xED=>0x064D, 0xEE=>0x064E, 0xEF=>0x064F, 0xF0=>0x0650, 0xF1=>0x0651,
                0xF2=>0x0652
                );
                foreach ($mod as $num=>$val)
                        $trans[$num]=$val;
                $GLOBALS['CHARSET'][$charset] = $trans;
                return $charset;

        // ------------------------------------------------------------------

        // cas particulier pour les entites html (a completer eventuellement)
        case 'html':
                $GLOBALS['CHARSET'][$charset] = array (
                'ldquo'=>'&#147;', 'rdquo'=>'&#148;',
                'cent'=>'&#162;', 'pound'=>'&#163;', 'curren'=>'&#164;', 'yen'=>'&#165;', 'brvbar'=>'&#166;',
                'sect'=>'&#167;', 'uml'=>'&#168;', 'ordf'=>'&#170;', 'laquo'=>'&#171;', 'not'=>'&#172;',
                'shy'=>'&#173;', 'macr'=>'&#175;', 'deg'=>'&#176;', 'plusmn'=>'&#177;', 'sup2'=>'&#178;',
                'sup3'=>'&#179;', 'acute'=>'&#180;', 'micro'=>'&#181;', 'para'=>'&#182;', 'middot'=>'&#183;',
                'cedil'=>'&#184;', 'sup1'=>'&#185;', 'ordm'=>'&#186;', 'raquo'=>'&#187;', 'iquest'=>'&#191;',
                'Agrave'=>'&#192;', 'Aacute'=>'&#193;', 'Acirc'=>'&#194;', 'Atilde'=>'&#195;', 'Auml'=>'&#196;',
                'Aring'=>'&#197;', 'AElig'=>'&#198;', 'Ccedil'=>'&#199;', 'Egrave'=>'&#200;', 'Eacute'=>'&#201;',
                'Ecirc'=>'&#202;', 'Euml'=>'&#203;', 'Igrave'=>'&#204;', 'Iacute'=>'&#205;', 'Icirc'=>'&#206;',
                'Iuml'=>'&#207;', 'ETH'=>'&#208;', 'Ntilde'=>'&#209;', 'Ograve'=>'&#210;', 'Oacute'=>'&#211;',
                'Ocirc'=>'&#212;', 'Otilde'=>'&#213;', 'Ouml'=>'&#214;', 'times'=>'&#215;', 'Oslash'=>'&#216;',
                'Ugrave'=>'&#217;', 'Uacute'=>'&#218;', 'Ucirc'=>'&#219;', 'Uuml'=>'&#220;', 'Yacute'=>'&#221;',
                'THORN'=>'&#222;', 'szlig'=>'&#223;', 'agrave'=>'&#224;', 'aacute'=>'&#225;', 'acirc'=>'&#226;',
                'atilde'=>'&#227;', 'auml'=>'&#228;', 'aring'=>'&#229;', 'aelig'=>'&#230;', 'ccedil'=>'&#231;',
                'egrave'=>'&#232;', 'eacute'=>'&#233;', 'ecirc'=>'&#234;', 'euml'=>'&#235;', 'igrave'=>'&#236;',
                'iacute'=>'&#237;', 'icirc'=>'&#238;', 'iuml'=>'&#239;', 'eth'=>'&#240;', 'ntilde'=>'&#241;',
                'ograve'=>'&#242;', 'oacute'=>'&#243;', 'ocirc'=>'&#244;', 'otilde'=>'&#245;', 'ouml'=>'&#246;',
                'divide'=>'&#247;', 'oslash'=>'&#248;', 'ugrave'=>'&#249;', 'uacute'=>'&#250;',
                'ucirc'=>'&#251;', 'uuml'=>'&#252;', 'yacute'=>'&#253;', 'thorn'=>'&#254;',
                'nbsp' => " ", 'copy' => "(c)", 'reg' => "(r)", 'frac14' => "1/4",
                'frac12' => "1/2", 'frac34' => "3/4", 'amp' => '&', 'quot' => '"',
                'apos' => "'", 'lt' => '<', 'gt' => '>',
                'mdash' => '&#8212;', 'ndash' => '&#8211;'
                );
                return $charset;
                
        case 'mathml':
                $GLOBALS['CHARSET'][$charset] = array (
                'ac' => '&#xE207;',
                'acd' => '&#xE3A6;',
                'acE' => '&E#290;',
                'acute' => '&#x0301;',
                'Afr' => '&#xE47C;',
                'afr' => '&#xE495;',
                'aleph' => '&#x2135;',
                'alpha' => '&#x03B1;',
                'amalg' => '&#xE251;',
                'amp' => '&#x0026;',
                'And' => '&#x2227;',
                'and' => '&#x2227;',
                'andand' => '&#xE36E;',
                'andd' => '&#xE394;',
                'andslope' => '&#xE50A;',
                'andv' => '&#xE391;',
                'ang' => '&#x2220;',
                'ange' => '&#xE2D6;',
                'angle' => '&#x2220;',
                'angmsd' => '&#x2221;',
                'angmsdaa' => '&#xE2D9;',
                'angmsdab' => '&#xE2DA;',
                'angmsdac' => '&#xE2DB;',
                'angmsdad' => '&#xE2DC;',
                'angmsdae' => '&#xE2DD;',
                'angmsdaf' => '&#xE2DE;',
                'angmsdag' => '&#xE2DF;',
                'angmsdah' => '&#xE2E0;',
                'angrt' => '&#x221F;',
                'angrtvb' => '&#xE418;',
                'angrtvbd' => '&#xE2E1;',
                'angsph' => '&#x2222;',
                'angst' => '&#x212B;',
                'angzarr' => '&#xE248;',
                'Aopf' => '&#xE4AF;',
                'ap' => '&#x2248;',
                'apacir' => '&#xE38C;',
                'apE' => '&#xE315;',
                'ape' => '&#x224A;',
                'apid' => '&#x224B;',
                'apos' => '&#x0027;',
                'approx' => '&#x2248;',
                'approxeq' => '&#x224A;',
                'Ascr' => '&#xE4C5;',
                'ascr' => '&#xE4DF;',
                'ast' => '&#x2217;',
                'asymp' => '&#x224D;',
                'awconint' => '&#x2233;',
                'awint' => '&#xE39B;',
                'backcong' => '&#x224C;',
                'backepsilon' => '&#xE420;',
                'backprime' => '&#x2035;',
                'backsim' => '&#x223D;',
                'backsimeq' => '&#x22CD;',
                'Backslash' => '&#x2216;',
                'Barv' => '&#xE311;',
                'barvee' => '&#x22BD;',
                'Barwed' => '&#x2306;',
                'barwed' => '&#x22BC;',
                'barwedge' => '&#x22BC;',
                'bbrk' => '&#xE2EE;',
                'bbrktbrk' => '&#xE419;',
                'bcong' => '&#x224C;',
                'becaus' => '&#x2235;',
                'Because' => '&#x2235;',
                'because' => '&#x2235;',
                'bemptyv' => '&#xE41A;',
                'benzen' => '&#xE43C;',
                'benzena' => '&#xE42A;',
                'benzenb' => '&#xE42B;',
                'benzenc' => '&#xE42C;',
                'benzend' => '&#xE42D;',
                'benzene' => '&#xE42E;',
                'benzenf' => '&#xE42F;',
                'benzeng' => '&#xE430;',
                'benzenh' => '&#xE431;',
                'benzeni' => '&#xE432;',
                'benzenj' => '&#xE433;',
                'benzenk' => '&#xE434;',
                'benzenl' => '&#xE435;',
                'benzenm' => '&#xE436;',
                'benzenn' => '&#xE437;',
                'benzeno' => '&#xE438;',
                'benzenp' => '&#xE439;',
                'benzenq' => '&#xE43A;',
                'benzenr' => '&#xE43B;',
                'bepsi' => '&#xE420;',
                'bernou' => '&#x212C;',
                'beta' => '&#x03B2;',
                'beth' => '&#x2136;',
                'between' => '&#x226C;',
                'Bfr' => '&#xE47D;',
                'bfr' => '&#xE496;',
                'bigcap' => '&#x22C2;',
                'bigcirc' => '&#x25CB;',
                'bigcup' => '&#x22C3;',
                'bigodot' => '&#x2299;',
                'bigoplus' => '&#x2295;',
                'bigotimes' => '&#x2297;',
                'bigsqcup' => '&#x2294;',
                'bigstar' => '&#x2605;',
                'bigtriangledown' => '&#x25BD;',
                'bigtriangleup' => '&#x25B3;',
                'biguplus' => '&#x228E;',
                'bigvee' => '&#x22C1;',
                'bigwedge' => '&#x22C0;',
                'bkarow' => '&#xE405;',
                'blacklozenge' => '&#xE501;',
                'blacksquare' => '&#x25A0;',
                'blacktriangle' => '&#x25B4;',
                'blacktriangledown' => '&#x25BE;',
                'blacktriangleleft' => '&#x25C2;',
                'blacktriangleright' => '&#x25B8;',
                'blank' => '&#xE4F9;',
                'blk12' => '&#x2592;',
                'blk14' => '&#x2591;',
                'blk34' => '&#x2593;',
                'block' => '&#x2588;',
                'bne' => '&#xE388;',
                'bnequiv' => '&#xE387;',
                'bNot' => '&#xE3AD;',
                'bnot' => '&#x2310;',
                'Bopf' => '&#xE4B0;',
                'bot' => '&#x22A5;',
                'bottom' => '&#x22A5;',
                'bowtie' => '&#x22C8;',
                'boxbox' => '&#xE2E6;',
                'boxminus' => '&#x229F;',
                'boxplus' => '&#x229E;',
                'boxtimes' => '&#x22A0;',
                'bprime' => '&#x2035;',
                'Breve' => '&#x0306;',
                'breve' => '&#x0306;',
                'brvbar' => '&#x00A6;',
                'Bscr' => '&#xE4C6;',
                'bscr' => '&#xE4E0;',
                'bsemi' => '&#xE2ED;',
                'bsim' => '&#x223D;',
                'bsime' => '&#x22CD;',
                'bsol' => '&#x005C;',
                'bsolb' => '&#xE280;',
                'bsolhsub' => '&#xE34D;',
                'bull' => '&#x2022;',
                'bullet' => '&#x2022;',
                'bump' => '&#x224E;',
                'bumpe' => '&#x224F;',
                'Bumpeq' => '&#x224E;',
                'bumpeq' => '&#x224F;',
                'Cap' => '&#x22D2;',
                'cap' => '&#x2229;',
                'capand' => '&#xE281;',
                'capbrcup' => '&#xE271;',
                'capcap' => '&#xE273;',
                'capcup' => '&#xE26F;',
                'capdot' => '&#xE261;',
                'caps' => '&#xE275;',
                'caret' => '&#x2038;',
                'caron' => '&#x030C;',
                'ccaps' => '&#xE279;',
                'Cconint' => '&#x2230;',
                'ccups' => '&#xE278;',
                'ccupssm' => '&#xE27A;',
                'cdot' => '&#x22C5;',
                'cedil' => '&#x0327;',
                'Cedilla' => '&#x0327;',
                'cemptyv' => '&#xE2E8;',
                'cent' => '&#x00A2;',
                'CenterDot' => '&#x00B7;',
                'centerdot' => '&#x00B7;',
                'Cfr' => '&#xE47E;',
                'cfr' => '&#xE497;',
                'check' => '&#x2713;',
                'checkmark' => '&#x2713;',
                'chi' => '&#x03C7;',
                'cir' => '&#x2218;',
                'circ' => '&#x2218;',
                'circeq' => '&#x2257;',
                'circle' => '&#xE4FA;',
                'circlearrowleft' => '&#x21BA;',
                'circlearrowright' => '&#x21BB;',
                'circledast' => '&#x229B;',
                'circledcirc' => '&#x229A;',
                'circleddash' => '&#x229D;',
                'CircleDot' => '&#x2299;',
                'circledR' => '&#x00AF;',
                'circledS' => '&#xE41D;',
                'circlef' => '&#x25CF;',
                'circlefb' => '&#x25D2;',
                'circlefl' => '&#x25D0;',
                'circlefr' => '&#x25D1;',
                'circleft' => '&#x25D3;',
                'CircleMinus' => '&#x2296;',
                'CirclePlus' => '&#x2295;',
                'CircleTimes' => '&#x2297;',
                'cirE' => '&#xE41B;',
                'cire' => '&#x2257;',
                'cirfnint' => '&#xE395;',
                'cirmid' => '&#xE250;',
                'cirscir' => '&#xE41C;',
                'ClockwiseContourIntegral' => '&#x2232;',
                'CloseCurlyDoubleQuote' => '&#x201D;',
                'CloseCurlyQuote' => '&#x2019;',
                'clubs' => '&#x2663;',
                'clubsuit' => '&#x2663;',
                'Colon' => '&#x2237;',
                'colon' => '&#x003A;',
                'Colone' => '&#xE30E;',
                'colone' => '&#x2254;',
                'coloneq' => '&#x2254;',
                'comma' => '&#x002C;',
                'commat' => '&#x0040;',
                'comp' => '&#x2201;',
                'compfn' => '&#x2218;',
                'complement' => '&#x2201;',
                'cong' => '&#x2245;',
                'congdot' => '&#xE314;',
                'Congruent' => '&#x2261;',
                'Conint' => '&#x222F;',
                'conint' => '&#x222E;',
                'ContourIntegral' => '&#x222E;',
                'Copf' => '&#x2102;',
                'coprod' => '&#x2210;',
                'Coproduct' => '&#x2210;',
                'copy' => '&#x00A9;',
                'copysr' => '&#x2117;',
                'CounterClockwiseContourIntegral' => '&#x2233;',
                'cross' => '&#x2612;',
                'Cscr' => '&#xE4C7;',
                'cscr' => '&#xE4E1;',
                'csub' => '&#xE351;',
                'csube' => '&#xE353;',
                'csup' => '&#xE352;',
                'csupe' => '&#xE354;',
                'ctdot' => '&#x22EF;',
                'cudarrl' => '&#xE23E;',
                'cudarrr' => '&#xE400;',
                'cuepr' => '&#x22DE;',
                'cuesc' => '&#x22DF;',
                'cularr' => '&#x21B6;',
                'cularrp' => '&#xE24A;',
                'Cup' => '&#x2323;',
                'cup' => '&#x222A;',
                'cupbrcap' => '&#xE270;',
                'CupCap' => '&#x224D;',
                'cupcap' => '&#xE26E;',
                'cupcup' => '&#xE272;',
                'cupdot' => '&#x228D;',
                'cupor' => '&#xE282;',
                'cups' => '&#xE274;',
                'curarr' => '&#x21B7;',
                'curarrm' => '&#xE249;',
                'curlyeqprec' => '&#x22DE;',
                'curlyeqsucc' => '&#x22DF;',
                'curlyvee' => '&#x22CE;',
                'curlywedge' => '&#x22CF;',
                'curren' => '&#x00A4;',
                'curvearrowleft' => '&#x21B6;',
                'curvearrowright' => '&#x21B7;',
                'cuvee' => '&#x22CE;',
                'cuwed' => '&#x22CF;',
                'cwconint' => '&#x2232;',
                'cwint' => '&#x2231;',
                'cylcty' => '&#x232D;',
                'Dagger' => '&#x2021;',
                'dagger' => '&#x2020;',
                'daleth' => '&#x2138;',
                'Darr' => '&#x21A1;',
                'dArr' => '&#x21D3;',
                'darr' => '&#x2193;',
                'dash' => '&#x2010;',
                'Dashv' => '&#xE30F;',
                'dashv' => '&#x22A3;',
                'dbkarow' => '&#xE207;',
                'dblac' => '&#x030B;',
                'ddagger' => '&#x2021;',
                'ddarr' => '&#x21CA;',
                'DDotrahd' => '&#xE238;',
                'ddotseq' => '&#xE309;',
                'deg' => '&#x00B0;',
                'Del' => '&#x2207;',
                'Delta' => '&#x0394;',
                'delta' => '&#x03B4;',
                'demptyv' => '&#xE2E7;',
                'dfisht' => '&#xE24C;',
                'Dfr' => '&#xE47F;',
                'dfr' => '&#xE498;',
                'dHar' => '&#xE227;',
                'dharl' => '&#x21C3;',
                'dharr' => '&#x21C2;',
                'DiacriticalAcute' => '&#x0301;',
                'DiacriticalDot' => '&#x0307;',
                'DiacriticalDoubleAcute' => '&#x030B;',
                'DiacriticalGrave' => '&#x0300;',
                'DiacriticalLeftArrow' => '&#x20D6;',
                'DiacriticalLeftRightArrow' => '&#x20E1;',
                'DiacriticalLeftRightVector' => '&#xF505;',
                'DiacriticalLeftVector' => '&#x20D0;',
                'DiacriticalRightArrow' => '&#x20D7;',
                'DiacriticalRightVector' => '&#x20D1;',
                'DiacriticalTilde' => '&#x0303;',
                'diam' => '&#x22C4;',
                'diamond' => '&#x22C4;',
                'diamondf' => '&#xE4FB;',
                'diamondsuit' => '&#x2662;',
                'diamonfb' => '&#xE4FC;',
                'diamonfl' => '&#xE4FD;',
                'diamonfr' => '&#xE4FE;',
                'diamonft' => '&#xE4FF;',
                'diams' => '&#x2662;',
                'die' => '&#x0308;',
                'digamma' => '&#x03DC;',
                'disin' => '&#xE3A0;',
                'div' => '&#x00F7;',
                'divide' => '&#x00F7;',
                'divideontimes' => '&#x22C7;',
                'divonx' => '&#x22C7;',
                'dlcorn' => '&#x231E;',
                'dlcrop' => '&#x230D;',
                'dollar' => '&#x0024;',
                'Dopf' => '&#xE4B1;',
                'Dot' => '&#x0308;',
                'dot' => '&#x0307;',
                'DotDot' => '&#x20DC;',
                'doteq' => '&#x2250;',
                'doteqdot' => '&#x2251;',
                'DotEqual' => '&#x2250;',
                'dotminus' => '&#x2238;',
                'dotplus' => '&#x2214;',
                'dotsquare' => '&#x22A1;',
                'doublebarwedge' => '&#x2306;',
                'DoubleContourIntegral' => '&#x222F;',
                'DoubleDot' => '&#x0308;',
                'DoubleDownArrow' => '&#x21D3;',
                'DoubleLeftArrow' => '&#x21D0;',
                'DoubleLeftRightArrow' => '&#x21D4;',
                'DoubleLongLeftArrow' => '&#xE200;',
                'DoubleLongLeftRightArrow' => '&#xE202;',
                'DoubleLongRightArrow' => '&#xE204;',
                'DoubleRightArrow' => '&#x21D2;',
                'DoubleRightTee' => '&#x22A8;',
                'DoubleUpArrow' => '&#x21D1;',
                'DoubleUpDownArrow' => '&#x21D5;',
                'DoubleVerticalBar' => '&#x2225;',
                'DownArrow' => '&#x2193;',
                'Downarrow' => '&#x21D3;',
                'downarrow' => '&#x2193;',
                'DownArrowUpArrow' => '&#xE216;',
                'downdownarrows' => '&#x21CA;',
                'downharpoonleft' => '&#x21C3;',
                'downharpoonright' => '&#x21C2;',
                'DownLeftVector' => '&#x21BD;',
                'DownRightVector' => '&#x21C1;',
                'DownTee' => '&#x22A4;',
                'drbkarow' => '&#xE209;',
                'drcorn' => '&#x231F;',
                'drcrop' => '&#x230C;',
                'Dscr' => '&#xE4C8;',
                'dscr' => '&#xE4E2;',
                'dsol' => '&#xE3A9;',
                'dtdot' => '&#x22F1;',
                'dtri' => '&#x25BF;',
                'dtrif' => '&#x25BE;',
                'duarr' => '&#xE216;',
                'duhar' => '&#xE217;',
                'dwangle' => '&#xE3AA;',
                'dzigrarr' => '&#x21DD;',
                'easter' => '&#x225B;',
                'ecir' => '&#x2256;',
                'ecolon' => '&#x2255;',
                'eDDot' => '&#xE309;',
                'eDot' => '&#x2251;',
                'efDot' => '&#x2252;',
                'Efr' => '&#xE480;',
                'efr' => '&#xE499;',
                'eg' => '&#xE328;',
                'egs' => '&#x22DD;',
                'egsdot' => '&#xE324;',
                'el' => '&#xE327;',
                'Element' => '&#x2208;',
                'elinters' => '&#xE3A7;',
                'ell' => '&#x2113;',
                'els' => '&#x22DC;',
                'elsdot' => '&#xE323;',
                'empty' => '&#xE2D3;',
                'emptyset' => '&#xE2D3;',
                'emptyv' => '&#x2205;',
                'emsp' => '&#x2003;',
                'emsp13' => '&#x2004;',
                'emsp14' => '&#x2005;',
                'ensp' => '&#x2002;',
                'Eopf' => '&#xE4B2;',
                'epar' => '&#x22D5;',
                'eparsl' => '&#xE384;',
                'eplus' => '&#xE268;',
                'epsi' => '&#x220A;',
                'epsiv' => '&#x03B5;',
                'eqcirc' => '&#x2256;',
                'eqcolon' => '&#x2255;',
                'eqsim' => '&#x2242;',
                'eqslantgtr' => '&#x22DD;',
                'eqslantless' => '&#x22DC;',
                'equals' => '&#x003D;',
                'EqualTilde' => '&#x2242;',
                'equest' => '&#x225F;',
                'Equilibrium' => '&#x21CC;',
                'equiv' => '&#x2261;',
                'equivDD' => '&#xE318;',
                'eqvparsl' => '&#xE386;',
                'erarr' => '&#xE236;',
                'erDot' => '&#x2253;',
                'Escr' => '&#xE4C9;',
                'escr' => '&#xE4E3;',
                'esdot' => '&#x2250;',
                'Esim' => '&#xE317;',
                'esim' => '&#x2242;',
                'eta' => '&#x03B7;',
                'excl' => '&#x0021;',
                'exist' => '&#x2203;',
                'Exists' => '&#x2203;',
                'fallingdotseq' => '&#x2252;',
                'female' => '&#x2640;',
                'ffilig' => '&#xFB03;',
                'fflig' => '&#xFB00;',
                'ffllig' => '&#xFB04;',
                'Ffr' => '&#xE481;',
                'ffr' => '&#xE49A;',
                'filig' => '&#xFB01;',
                'fjlig' => '&#xE500;',
                'flat' => '&#x266D;',
                'fllig' => '&#xFB02;',
                'fltns' => '&#xE381;',
                'Fopf' => '&#xE4B3;',
                'ForAll' => '&#x2200;',
                'forall' => '&#x2200;',
                'fork' => '&#x22D4;',
                'forkv' => '&#xE31B;',
                'fpartint' => '&#xE396;',
                'frac12' => '&#x00BD;',
                'frac13' => '&#x2153;',
                'frac14' => '&#x00BC;',
                'frac15' => '&#x2155;',
                'frac16' => '&#x2159;',
                'frac18' => '&#x215B;',
                'frac23' => '&#x2254;',
                'frac25' => '&#x2156;',
                'frac34' => '&#x00BE;',
                'frac35' => '&#x2157;',
                'frac38' => '&#x215C;',
                'frac45' => '&#x2158;',
                'frac56' => '&#x215A;',
                'frac58' => '&#x215D;',
                'frac78' => '&#x215E;',
                'frown' => '&#x2322;',
                'Fscr' => '&#xE4CA;',
                'fscr' => '&#xE4E4;',
                'Gamma' => '&#x0393;',
                'gamma' => '&#x03B3;',
                'Gammad' => '&#x03DC;',
                'gammad' => '&#x03DC;',
                'gap' => '&#x2273;',
                'gE' => '&#x2267;',
                'ge' => '&#x2265;',
                'gEl' => '&#x22DB;',
                'gel' => '&#x22DB;',
                'geq' => '&#x2265;',
                'geqq' => '&#x2267;',
                'geqslant' => '&#xE421;',
                'ges' => '&#xE421;',
                'gescc' => '&#xE358;',
                'gesdot' => '&#xE31E;',
                'gesdoto' => '&#xE320;',
                'gesdotol' => '&#xE322;',
                'gesl' => '&#xE32C;',
                'gesles' => '&#xE332;',
                'Gfr' => '&#xE482;',
                'gfr' => '&#xE49B;',
                'Gg' => '&#x22D9;',
                'gg' => '&#x226B;',
                'ggg' => '&#x22D9;',
                'gimel' => '&#x2137;',
                'gl' => '&#x2277;',
                'gla' => '&#xE330;',
                'glE' => '&#xE32E;',
                'glj' => '&#xE32F;',
                'gnap' => '&#xE411;',
                'gnapprox' => '&#xE411;',
                'gnE' => '&#x2269;',
                'gne' => '&#x2269;',
                'gneq' => '&#x2269;',
                'gneqq' => '&#x2269;',
                'gnsim' => '&#x22E7;',
                'Gopf' => '&#xE4B4;',
                'grave' => '&#x0300;',
                'GreaterEqual' => '&#x2265;',
                'GreaterEqualLess' => '&#x22DB;',
                'GreaterFullEqual' => '&#x2267;',
                'GreaterLess' => '&#x2277;',
                'GreaterSlantEqual' => '&#xE421;',
                'GreaterTilde' => '&#x2273;',
                'Gscr' => '&#xE4CB;',
                'gscr' => '&#xE4E5;',
                'gsim' => '&#x2273;',
                'gsime' => '&#xE334;',
                'gsiml' => '&#xE336;',
                'Gt' => '&#x226B;',
                'gt' => '&#x003E;',
                'gtcc' => '&#xE356;',
                'gtcir' => '&#xE326;',
                'gtdot' => '&#x22D7;',
                'gtlPar' => '&#xE296;',
                'gtquest' => '&#xE32A;',
                'gtrapprox' => '&#x2273;',
                'gtrarr' => '&#xE35F;',
                'gtrdot' => '&#x22D7;',
                'gtreqless' => '&#x22DB;',
                'gtreqqless' => '&#x22DB;',
                'gtrless' => '&#x2277;',
                'gtrsim' => '&#x2273;',
                'gvertneqq' => '&#xE2A1;',
                'gvnE' => '&#xE2A1;',
                'Hacek' => '&#x030C;',
                'hairsp' => '&#x200A;',
                'half' => '&#x00BD;',
                'hamilt' => '&#x210B;',
                'hArr' => '&#x21D4;',
                'harr' => '&#x2194;',
                'harrcir' => '&#xE240;',
                'harrw' => '&#x21AD;',
                'Hat' => '&#x0302;',
                'hbar' => '&#xE2D5;',
                'hbenzen' => '&#xE44F;',
                'hbenzena' => '&#xE43D;',
                'hbenzenb' => '&#xE43E;',
                'hbenzenc' => '&#xE43F;',
                'hbenzend' => '&#xE440;',
                'hbenzene' => '&#xE441;',
                'hbenzenf' => '&#xE442;',
                'hbenzeng' => '&#xE443;',
                'hbenzenh' => '&#xE444;',
                'hbenzeni' => '&#xE445;',
                'hbenzenj' => '&#xE446;',
                'hbenzenk' => '&#xE447;',
                'hbenzenl' => '&#xE448;',
                'hbenzenm' => '&#xE449;',
                'hbenzenn' => '&#xE44A;',
                'hbenzeno' => '&#xE44B;',
                'hbenzenp' => '&#xE44C;',
                'hbenzenq' => '&#xE44D;',
                'hbenzenr' => '&#xE44E;',
                'hearts' => '&#x2661;',
                'heartsuit' => '&#x2661;',
                'hellip' => '&#x2026;',
                'hercon' => '&#x22B9;',
                'Hfr' => '&#xE483;',
                'hfr' => '&#xE49C;',
                'hksearow' => '&#xE20B;',
                'hkswarow' => '&#xE20A;',
                'hoarr' => '&#xE243;',
                'homtht' => '&#x223B;',
                'hookleftarrow' => '&#x21A9;',
                'hookrightarrow' => '&#x21AA;',
                'Hopf' => '&#xE4B5;',
                'horbar' => '&#x2015;',
                'Hscr' => '&#xE4CC;',
                'hscr' => '&#xE4E6;',
                'hslash' => '&#x210F;',
                'HumpDownHump' => '&#x224E;',
                'HumpEqual' => '&#x224F;',
                'hybull' => '&#x2043;',
                'hyphen' => '&#xE4F8;',
                'iexcl' => '&#x00A1;',
                'iff' => '&#xE365;',
                'Ifr' => '&#xE484;',
                'ifr' => '&#xE49D;',
                'iiiint' => '&#xE378;',
                'iiint' => '&#x222D;',
                'iinfin' => '&#xE372;',
                'iiota' => '&#x2129;',
                'Im' => '&#x2111;',
                'image' => '&#x2111;',
                'imath' => '&#x0131;',
                'imof' => '&#x22B7;',
                'imped' => '&#xE50B;',
                'Implies' => '&#x21D2;',
                'in' => '&#x220A;',
                'incare' => '&#x2105;',
                'infin' => '&#x221E;',
                'infintie' => '&#xE50C;',
                'Int' => '&#x222C;',
                'int' => '&#x222B;',
                'intcal' => '&#x22BA;',
                'Integral' => '&#x222B;',
                'intercal' => '&#x22BA;',
                'Intersection' => '&#x22C2;',
                'intlarhk' => '&#xE39A;',
                'intprod' => '&#xE259;',
                'Iopf' => '&#xE4B6;',
                'iota' => '&#x03B9;',
                'iprod' => '&#xE259;',
                'iquest' => '&#x00BF;',
                'Iscr' => '&#xE4CD;',
                'iscr' => '&#xE4E7;',
                'isin' => '&#x220A;',
                'isindot' => '&#xE39C;',
                'isinE' => '&#xE39E;',
                'isins' => '&#xE3A4;',
                'isinsv' => '&#xE3A2;',
                'isinv' => '&#x2208;',
                'Jfr' => '&#xE485;',
                'jfr' => '&#xE49E;',
                'jmath' => '&#xE2D4;',
                'Jopf' => '&#xE4B7;',
                'Jscr' => '&#xE4CE;',
                'jscr' => '&#xE4E8;',
                'kappa' => '&#x03BA;',
                'kappav' => '&#x03F0;',
                'Kfr' => '&#xE486;',
                'kfr' => '&#xE49F;',
                'Kopf' => '&#xE4B8;',
                'Kscr' => '&#xE4CF;',
                'kscr' => '&#xE4E9;',
                'lAarr' => '&#x21DA;',
                'laemptyv' => '&#xE2EA;',
                'lagran' => '&#x2112;',
                'Lambda' => '&#x039B;',
                'lambda' => '&#x03BB;',
                'Lang' => '&#x300A;',
                'lang' => '&#x3008;',
                'langd' => '&#xE297;',
                'langle' => '&#x3008;',
                'lap' => '&#x2272;',
                'laquo' => '&#x00AB;',
                'Larr' => '&#x219E;',
                'lArr' => '&#x21D0;',
                'larr' => '&#x2190;',
                'larrbfs' => '&#xE220;',
                'larrfs' => '&#xE222;',
                'larrhk' => '&#x21A9;',
                'larrlp' => '&#x21AB;',
                'larrpl' => '&#xE23F;',
                'larrsim' => '&#xE24E;',
                'larrtl' => '&#x21A2;',
                'lat' => '&#xE33A;',
                'lAtail' => '&#xE23D;',
                'latail' => '&#xE23C;',
                'late' => '&#xE33C;',
                'lates' => '&#xE33E;',
                'lBarr' => '&#xE206;',
                'lbarr' => '&#xE402;',
                'lbbrk' => '&#x3014;',
                'lbrace' => '&#x007B;',
                'lbrack' => '&#x005B;',
                'lbrke' => '&#xE299;',
                'lbrksld' => '&#xE29D;',
                'lbrkslu' => '&#xE29B;',
                'lceil' => '&#x2308;',
                'lcub' => '&#x007B;',
                'ldca' => '&#xE21A;',
                'ldquo' => '&#x201C;',
                'ldquor' => '&#x201E;',
                'ldrdhar' => '&#xE22C;',
                'ldrushar' => '&#xE228;',
                'ldsh' => '&#x21B2;',
                'lE' => '&#x2266;',
                'le' => '&#x2264;',
                'LeftAngleBracket' => '&#x3008;',
                'LeftArrow' => '&#x2190;',
                'Leftarrow' => '&#x21D0;',
                'leftarrow' => '&#x2190;',
                'LeftArrowRightArrow' => '&#x21C6;',
                'leftarrowtail' => '&#x21A2;',
                'LeftCeiling' => '&#x2308;',
                'LeftDownVector' => '&#x21C3;',
                'LeftFloor' => '&#x230A;',
                'leftharpoondown' => '&#x21BD;',
                'leftharpoonup' => '&#x21BC;',
                'leftleftarrows' => '&#x21C7;',
                'LeftRightArrow' => '&#x2194;',
                'Leftrightarrow' => '&#x21D4;',
                'leftrightarrow' => '&#x2194;',
                'leftrightarrows' => '&#x21C6;',
                'leftrightharpoons' => '&#x21CB;',
                'leftrightsquigarrow' => '&#x21AD;',
                'LeftTee' => '&#x22A3;',
                'leftthreetimes' => '&#x22CB;',
                'LeftTriangle' => '&#x22B2;',
                'LeftTriangleEqual' => '&#x22B4;',
                'LeftUpVector' => '&#x21BF;',
                'LeftVector' => '&#x21BC;',
                'lEg' => '&#x22DA;',
                'leg' => '&#x22DA;',
                'leq' => '&#x2264;',
                'leqq' => '&#x2266;',
                'leqslant' => '&#xE425;',
                'les' => '&#xE425;',
                'lescc' => '&#xE357;',
                'lesdot' => '&#xE31D;',
                'lesdoto' => '&#xE31F;',
                'lesdotor' => '&#xE321;',
                'lesg' => '&#xE32B;',
                'lesges' => '&#xE331;',
                'lessapprox' => '&#x2272;',
                'lessdot' => '&#x22D6;',
                'lesseqgtr' => '&#x22DA;',
                'lesseqqgtr' => '&#x22DA;',
                'LessEqualGreater' => '&#x22DA;',
                'LessFullEqual' => '&#x2266;',
                'LessGreater' => '&#x2276;',
                'lessgtr' => '&#x2276;',
                'lesssim' => '&#x2272;',
                'LessSlantEqual' => '&#xE425;',
                'LessTilde' => '&#x2272;',
                'lfisht' => '&#xE214;',
                'lfloor' => '&#x230A;',
                'Lfr' => '&#xE487;',
                'lfr' => '&#xE4A0;',
                'lg' => '&#x2276;',
                'lgE' => '&#xE32D;',
                'lHar' => '&#xE225;',
                'lhard' => '&#x21BD;',
                'lharu' => '&#x21BC;',
                'lharul' => '&#xE22E;',
                'lhblk' => '&#x2584;',
                'Ll' => '&#x22D8;',
                'll' => '&#x226A;',
                'llarr' => '&#x21C7;',
                'llcorner' => '&#x231E;',
                'Lleftarrow' => '&#x21DA;',
                'llhard' => '&#xE231;',
                'lltri' => '&#xE2E5;',
                'lmoust' => '&#xE294;',
                'lmoustache' => '&#xE294;',
                'lnap' => '&#xE2A2;',
                'lnapprox' => '&#xE2A2;',
                'lnE' => '&#x2268;',
                'lne' => '&#x2268;',
                'lneq' => '&#x2268;',
                'lneqq' => '&#x2268;',
                'lnsim' => '&#x22E6;',
                'loang' => '&#x3018;',
                'loarr' => '&#xE242;',
                'lobrk' => '&#x301A;',
                'LongLeftArrow' => '&#xE201;',
                'Longleftarrow' => '&#xE200;',
                'longleftarrow' => '&#xE201;',
                'LongLeftRightArrow' => '&#xE203;',
                'Longleftrightarrow' => '&#xE202;',
                'longleftrightarrow' => '&#xE203;',
                'longmapsto' => '&#xE208;',
                'LongRightArrow' => '&#xE205;',
                'Longrightarrow' => '&#xE204;',
                'longrightarrow' => '&#xE205;',
                'looparrowleft' => '&#x21AB;',
                'looparrowright' => '&#x21AC;',
                'lopar' => '&#xE379;',
                'Lopf' => '&#xE4B9;',
                'loplus' => '&#xE25C;',
                'lotimes' => '&#xE25E;',
                'lowast' => '&#x2217;',
                'lowbar' => '&#x005F;',
                'LowerLeftArrow' => '&#x2199;',
                'LowerRightArrow' => '&#x2198;',
                'loz' => '&#x25CA;',
                'lozenge' => '&#x25CA;',
                'lozf' => '&#xE501;',
                'lpar' => '&#x0028;',
                'lparlt' => '&#xE292;',
                'lrarr' => '&#x21C6;',
                'lrcorner' => '&#x231F;',
                'lrhar' => '&#x21CB;',
                'lrhard' => '&#xE22F;',
                'lrtri' => '&#xE2E3;',
                'Lscr' => '&#xE4D0;',
                'lscr' => '&#xE4EA;',
                'Lsh' => '&#x21B0;',
                'lsh' => '&#x21B0;',
                'lsim' => '&#x2272;',
                'lsime' => '&#xE333;',
                'lsimg' => '&#xE335;',
                'lsqb' => '&#x005B;',
                'lsquo' => '&#x2018;',
                'lsquor' => '&#x201A;',
                'Lt' => '&#x226A;',
                'lt' => '&#x003C;',
                'ltcc' => '&#xE355;',
                'ltcir' => '&#xE325;',
                'ltdot' => '&#x22D6;',
                'lthree' => '&#x22CB;',
                'ltimes' => '&#x22C9;',
                'ltlarr' => '&#xE35E;',
                'ltquest' => '&#xE329;',
                'ltri' => '&#x25C3;',
                'ltrie' => '&#x22B4;',
                'ltrif' => '&#x25C2;',
                'ltrPar' => '&#xE295;',
                'lurdshar' => '&#xE229;',
                'luruhar' => '&#xE22B;',
                'lvertneqq' => '&#xE2A4;',
                'lvnE' => '&#xE2A4;',
                'macr' => '&#x0304;',
                'male' => '&#x2642;',
                'malt' => '&#x2720;',
                'maltese' => '&#x2720;',
                'Map' => '&#xE212;',
                'map' => '&#x21A6;',
                'mapsto' => '&#x21A6;',
                'marker' => '&#xE502;',
                'mcomma' => '&#xE31A;',
                'mdash' => '&#x2014;',
                'mDDot' => '&#x223A;',
                'measuredangle' => '&#x2221;',
                'Mfr' => '&#xE488;',
                'mfr' => '&#xE4A1;',
                'mho' => '&#x2127;',
                'micro' => '&#x00B5;',
                'mid' => '&#x2223;',
                'midast' => '&#x2217;',
                'midcir' => '&#xE20F;',
                'middot' => '&#x00B7;',
                'minus' => '&#x2212;',
                'minusb' => '&#x229F;',
                'minusd' => '&#x2238;',
                'minusdu' => '&#xE25B;',
                'MinusPlus' => '&#x2213;',
                'mlcp' => '&#xE30A;',
                'mldr' => '&#xE503;',
                'mnplus' => '&#x2213;',
                'models' => '&#x22A7;',
                'Mopf' => '&#xE4BA;',
                'mp' => '&#x2213;',
                'Mscr' => '&#xE4D1;',
                'mscr' => '&#xE4EB;',
                'mstpos' => '&#x223E;',
                'mu' => '&#x03BC;',
                'multimap' => '&#x22B8;',
                'mumap' => '&#x22B8;',
                'nabla' => '&#x2207;',
                'nang' => '&#xE2D8;',
                'nap' => '&#x2249;',
                'napE' => '&#xE2C7;',
                'napid' => '&#xE2BC;',
                'napprox' => '&#x2249;',
                'natur' => '&#x266E;',
                'natural' => '&#x266E;',
                'nbsp' => '&#x00A0;',
                'ncap' => '&#xE284;',
                'ncong' => '&#x2247;',
                'ncongdot' => '&#xE2C5;',
                'ncup' => '&#xE283;',
                'ndash' => '&#x2013;',
                'ne' => '&#x2260;',
                'nearhk' => '&#xE20D;',
                'neArr' => '&#x21D7;',
                'nearr' => '&#x2197;',
                'nearrow' => '&#x2197;',
                'nedot' => '&#xE38A;',
                'nequiv' => '&#x2262;',
                'nesear' => '&#xE20E;',
                'NestedGreaterGreater' => '&#x226B;',
                'NestedLessLess' => '&#x226A;',
                'nexist' => '&#x2204;',
                'nexists' => '&#x2204;',
                'Nfr' => '&#xE489;',
                'nfr' => '&#xE4A2;',
                'ngE' => '&#x2271;',
                'nge' => '&#xE2A6;',
                'ngeq' => '&#xE2A6;',
                'ngeqq' => '&#x2271;',
                'ngeqslant' => '&#x2271;',
                'nges' => '&#x2271;',
                'nGg' => '&#xE2CE;',
                'ngsim' => '&#x2275;',
                'nGt' => '&#xE2CA;',
                'ngt' => '&#x226F;',
                'ngtr' => '&#x226F;',
                'nGtv' => '&#xE2CC;',
                'nhArr' => '&#x21CE;',
                'nharr' => '&#x21AE;',
                'nhpar' => '&#xE38D;',
                'ni' => '&#x220D;',
                'nis' => '&#xE3A5;',
                'nisd' => '&#xE3A1;',
                'niv' => '&#x220B;',
                'nlArr' => '&#x21CD;',
                'nlarr' => '&#x219A;',
                'nldr' => '&#x2025;',
                'nlE' => '&#x2270;',
                'nle' => '&#xE2A7;',
                'nLeftarrow' => '&#x21CD;',
                'nleftarrow' => '&#x219A;',
                'nLeftrightarrow' => '&#x21CE;',
                'nleftrightarrow' => '&#x21AE;',
                'nleq' => '&#xE2A7;',
                'nleqq' => '&#x2270;',
                'nleqslant' => '&#x2270;',
                'nles' => '&#x2270;',
                'nless' => '&#x226E;',
                'nLl' => '&#xE2CD;',
                'nlsim' => '&#x2274;',
                'nLt' => '&#xE2C9;',
                'nlt' => '&#x226E;',
                'nltri' => '&#x22EA;',
                'nltrie' => '&#x22EC;',
                'nLtv' => '&#xE2CB;',
                'nmid' => '&#x2224;',
                'Nopf' => '&#x2115;',
                'Not' => '&#xE3AC;',
                'not' => '&#x00AC;',
                'NotCongruent' => '&#x2262;',
                'NotDoubleVerticalBar' => '&#x2226;',
                'NotElement' => '&#x2209;',
                'NotEqual' => '&#x2260;',
                'NotExists' => '&#x2204;',
                'NotGreater' => '&#x226F;',
                'NotGreaterEqual' => '&#xE2A6;',
                'NotGreaterFullEqual' => '&#x2270;',
                'NotGreaterGreater' => '&#xE2CC;',
                'NotGreaterLess' => '&#x2279;',
                'NotGreaterSlantEqual' => '&#x2271;',
                'NotGreaterTilde' => '&#x2275;',
                'notin' => '&#x2209;',
                'notindot' => '&#xE39D;',
                'notinE' => '&#xE50D;',
                'notinva' => '&#xE370;',
                'notinvb' => '&#xE37B;',
                'notinvc' => '&#xE37C;',
                'NotLeftTriangle' => '&#x22EA;',
                'NotLeftTriangleEqual' => '&#x22EC;',
                'NotLess' => '&#x226E;',
                'NotLessEqual' => '&#xE2A7;',
                'NotLessFullEqual' => '&#x2270;',
                'NotLessGreater' => '&#x2278;',
                'NotLessLess' => '&#xE2CB;',
                'NotLessSlantEqual' => '&#x2270;',
                'NotLessTilde' => '&#x2274;',
                'notni' => '&#x220C;',
                'notniva' => '&#x220C;',
                'notnivb' => '&#xE37D;',
                'notnivc' => '&#xE37E;',
                'NotPrecedes' => '&#x2280;',
                'NotPrecedesEqual' => '&#xE412;',
                'NotPrecedesSlantEqual' => '&#x22E0;',
                'NotReverseElement' => '&#x220C;',
                'NotRightTriangle' => '&#x22EB;',
                'NotRightTriangleEqual' => '&#x22ED;',
                'NotSquareSubsetEqual' => '&#x22E2;',
                'NotSquareSupersetEqual' => '&#x22E3;',
                'NotSubset' => '&#x2284;',
                'NotSucceeds' => '&#x2281;',
                'NotSucceedsEqual' => '&#xE413;',
                'NotSucceedsSlantEqual' => '&#x22E1;',
                'NotSuperset' => '&#x2285;',
                'NotTilde' => '&#x2241;',
                'NotTildeEqual' => '&#x2244;',
                'NotTildeFullEqual' => '&#x2247;',
                'NotTildeTilde' => '&#x2249;',
                'NotVerticalBar' => '&#x2224;',
                'npar' => '&#x2226;',
                'nparallel' => '&#x2226;',
                'nparsl' => '&#xE389;',
                'npart' => '&#xE390;',
                'npolint' => '&#xE399;',
                'npr' => '&#x2280;',
                'nprcue' => '&#x22E0;',
                'npre' => '&#xE412;',
                'nprec' => '&#x2280;',
                'npreceq' => '&#xE412;',
                'nrArr' => '&#x21CF;',
                'nrarr' => '&#x219B;',
                'nrarrc' => '&#xE21D;',
                'nrarrw' => '&#xE21B;',
                'nRightarrow' => '&#x21CF;',
                'nrightarrow' => '&#x219B;',
                'nrtri' => '&#x22EB;',
                'nrtrie' => '&#x22ED;',
                'nsc' => '&#x2281;',
                'nsccue' => '&#x22E1;',
                'nsce' => '&#xE413;',
                'Nscr' => '&#xE4D2;',
                'nscr' => '&#xE4EC;',
                'nshortmid' => '&#xE2AA;',
                'nshortparallel' => '&#xE2AB;',
                'nsim' => '&#x2241;',
                'nsime' => '&#x2244;',
                'nsimeq' => '&#x2244;',
                'nsmid' => '&#xE2AA;',
                'nspar' => '&#xE2AB;',
                'nsqsube' => '&#x22E2;',
                'nsqsupe' => '&#x22E3;',
                'nsub' => '&#x2284;',
                'nsubE' => '&#x2288;',
                'nsube' => '&#x2288;',
                'nsubset' => '&#x2284;',
                'nsubseteq' => '&#x2288;',
                'nsubseteqq' => '&#x2288;',
                'nsucc' => '&#x2281;',
                'nsucceq' => '&#xE413;',
                'nsup' => '&#x2285;',
                'nsupE' => '&#x2289;',
                'nsupe' => '&#x2289;',
                'nsupset' => '&#x2285;',
                'nsupseteq' => '&#x2289;',
                'nsupseteqq' => '&#x2289;',
                'ntgl' => '&#x2279;',
                'ntlg' => '&#x2278;',
                'ntriangleleft' => '&#x22EA;',
                'ntrianglelefteq' => '&#x22EC;',
                'ntriangleright' => '&#x22EB;',
                'ntrianglerighteq' => '&#x22ED;',
                'ntvgl' => '&#x2279;',
                'ntvlg' => '&#x2278;',
                'nu' => '&#x03BD;',
                'num' => '&#x0023;',
                'numsp' => '&#x2007;',
                'nvap' => '&#xE2C6;',
                'nVDash' => '&#x22AF;',
                'nVdash' => '&#x22AE;',
                'nvDash' => '&#x22AD;',
                'nvdash' => '&#x22AC;',
                'nvge' => '&#x2271;',
                'nvgt' => '&#x226F;',
                'nvhArr*' => '&#x21CE;',
                'nvinfin' => '&#xE38E;',
                'nvlArr' => '&#x21CD;',
                'nvle' => '&#x2270;',
                'nvlt' => '&#x226E;',
                'nvltrie' => '&#xE2D0;',
                'nvrArr' => '&#x21CF;',
                'nvrtrie' => '&#xE2CF;',
                'nvsim' => '&#xE415;',
                'nwarhk' => '&#xE20C;',
                'nwArr' => '&#x21D6;',
                'nwarr' => '&#x2196;',
                'nwarrow' => '&#x2196;',
                'nwnear' => '&#xE211;',
                'oast' => '&#x229B;',
                'ocir' => '&#x229A;',
                'odash' => '&#x229D;',
                'odiv' => '&#xE285;',
                'odot' => '&#x2299;',
                'odsold' => '&#xE286;',
                'ofcir' => '&#xE287;',
                'Ofr' => '&#xE48A;',
                'ofr' => '&#xE4A3;',
                'ogon' => '&#x0328;',
                'ogt' => '&#xE289;',
                'ohbar' => '&#xE260;',
                'ohm' => '&#x2126;',
                'oint' => '&#x222E;',
                'olarr' => '&#x21BA;',
                'olcir' => '&#xE409;',
                'olcross' => '&#xE3A8;',
                'olt' => '&#xE288;',
                'Omega' => '&#x03A9;',
                'omega' => '&#x03C9;',
                'omicron' => '&#x03BE;',
                'omid' => '&#xE40A;',
                'ominus' => '&#x2296;',
                'Oopf' => '&#xE4BC;',
                'opar' => '&#xE28A;',
                'OpenCurlyDoubleQuote' => '&#x201C;',
                'OpenCurlyQuote' => '&#x2018;',
                'operp' => '&#xE28B;',
                'oplus' => '&#x2295;',
                'Or' => '&#xE375;',
                'or' => '&#x2228;',
                'orarr' => '&#x21BB;',
                'ord' => '&#xE393;',
                'order' => '&#x2134;',
                'ordf' => '&#x00AA;',
                'ordm' => '&#x00BA;',
                'origof' => '&#x22B6;',
                'oror' => '&#xE50E;',
                'orslope' => '&#xE3AE;',
                'orv' => '&#xE392;',
                'oS' => '&#xE41D;',
                'Oscr' => '&#xE4D3;',
                'oscr' => '&#xE4ED;',
                'oslash' => '&#x2298;',
                'osol' => '&#x2298;',
                'Otimes' => '&#xE28C;',
                'otimes' => '&#x2297;',
                'otimesas' => '&#xE28D;',
                'ovbar' => '&#xE40B;',
                'OverLine' => '&#x0305;',
                'par' => '&#x2225;',
                'para' => '&#x00B6;',
                'parallel' => '&#x2225;',
                'parsim' => '&#xE2C8;',
                'parsl' => '&#xE382;',
                'part' => '&#x2202;',
                'PartialD' => '&#x2202;',
                'percnt' => '&#x0025;',
                'period' => '&#x002E;',
                'permil' => '&#x2030;',
                'perp' => '&#x22A5;',
                'pertenk' => '&#x2031;',
                'Pfr' => '&#xE48B;',
                'pfr' => '&#xE4A4;',
                'Phi' => '&#x03A6;',
                'phi' => '&#x03C6;',
                'phiv' => '&#x03D5;',
                'phmmat' => '&#x2133;',
                'phone' => '&#x260E;',
                'Pi' => '&#x03A0;',
                'pi' => '&#x03C0;',
                'pitchfork' => '&#x22D4;',
                'piv' => '&#x03D6;',
                'plank' => '&#xE2D5;',
                'plankv' => '&#x210F;',
                'plus' => '&#x002B;',
                'plusacir' => '&#xE26A;',
                'plusb' => '&#x229E;',
                'pluscir' => '&#xE266;',
                'plusdo' => '&#x2214;',
                'plusdu' => '&#xE25A;',
                'pluse' => '&#xE267;',
                'PlusMinus' => '&#x00B1;',
                'plusmn' => '&#x00B1;',
                'plussim' => '&#xE26C;',
                'plustwo' => '&#xE269;',
                'pm' => '&#x00B1;',
                'pointint' => '&#xE376;',
                'Popf' => '&#x2119;',
                'pound' => '&#x00A3;',
                'Pr' => '&#xE35C;',
                'pr' => '&#x227A;',
                'prap' => '&#x227E;',
                'prcue' => '&#x227C;',
                'prE' => '&#x227C;',
                'pre' => '&#x227C;',
                'prec' => '&#x227A;',
                'precapprox' => '&#x227E;',
                'preccurlyeq' => '&#x227C;',
                'Precedes' => '&#x227A;',
                'PrecedesEqual' => '&#x227C;',
                'PrecedesSlantEqual' => '&#x227C;',
                'PrecedesTilde' => '&#x227E;',
                'preceq' => '&#x227C;',
                'precnapprox' => '&#x22E8;',
                'precneqq' => '&#xE2B3;',
                'precnsim' => '&#x22E8;',
                'precsim' => '&#x227E;',
                'Prime' => '&#x2033;',
                'prime' => '&#x2032;',
                'prnap' => '&#x22E8;',
                'prnE' => '&#xE2B3;',
                'prnsim' => '&#x22E8;',
                'profalar' => '&#x232E;',
                'profline' => '&#x2312;',
                'profsurf' => '&#x2313;',
                'prop' => '&#x221D;',
                'Proportion' => '&#x2237;',
                'Proportional' => '&#x221D;',
                'propto' => '&#x221D;',
                'prsim' => '&#x227E;',
                'prurel' => '&#x22B0;',
                'Pscr' => '&#xE4D4;',
                'pscr' => '&#xE4EE;',
                'Psi' => '&#x03A8;',
                'psi' => '&#x03C8;',
                'puncsp' => '&#x2008;',
                'Qfr' => '&#xE48C;',
                'qfr' => '&#xE4A5;',
                'qint' => '&#xE378;',
                'Qopf' => '&#x211A;',
                'qprime' => '&#xE371;',
                'Qscr' => '&#xE4D5;',
                'qscr' => '&#xE4EF;',
                'quatint' => '&#xE377;',
                'quest' => '&#x003F;',
                'questeq' => '&#x225F;',
                'quot' => '&#x0022;',
                'rAarr' => '&#x21DB;',
                'race' => '&#xE40C;',
                'radic' => '&#x221A;',
                'raemptyv' => '&#xE2E9;',
                'Rang' => '&#x300B;',
                'rang' => '&#x3009;',
                'rangd' => '&#xE298;',
                'range' => '&#xE2D7;',
                'rangle' => '&#x3009;',
                'raquo' => '&#x00BB;',
                'Rarr' => '&#x21A0;',
                'rArr' => '&#x21D2;',
                'rarr' => '&#x2192;',
                'rarrap' => '&#xE235;',
                'rarrbfs' => '&#xE221;',
                'rarrc' => '&#xE21C;',
                'rarrfs' => '&#xE223;',
                'rarrhk' => '&#x21AA;',
                'rarrlp' => '&#x21AC;',
                'rarrpl' => '&#xE21E;',
                'rarrsim' => '&#xE24D;',
                'Rarrtl' => '&#xE239;',
                'rarrtl' => '&#x21A3;',
                'rarrw' => '&#x219D;',
                'rAtail' => '&#xE23B;',
                'ratail' => '&#x21A3;',
                'ratio' => '&#x2236;',
                'RBarr' => '&#xE209;',
                'rBarr' => '&#xE207;',
                'rbarr' => '&#xE405;',
                'rbbrk' => '&#x3015;',
                'rbrace' => '&#x007D;',
                'rbrack' => '&#x005D;',
                'rbrke' => '&#xE29A;',
                'rbrksld' => '&#xE29C;',
                'rbrkslu' => '&#xE29E;',
                'rceil' => '&#x2309;',
                'rcub' => '&#x007D;',
                'rdca' => '&#xE219;',
                'rdldhar' => '&#xE22D;',
                'rdquo' => '&#x201D;',
                'rdquor' => '&#x201B;',
                'rdsh' => '&#x21B3;',
                'Re' => '&#x211C;',
                'real' => '&#x211C;',
                'rect' => '&#xE504;',
                'reg' => '&#x00AF;',
                'ReverseElement' => '&#x220B;',
                'ReverseEquilibrium' => '&#x21CB;',
                'ReverseUpEquilibrium' => '&#xE217;',
                'rfisht' => '&#xE215;',
                'rfloor' => '&#x230B;',
                'Rfr' => '&#xE48D;',
                'rfr' => '&#xE4A6;',
                'rHar' => '&#xE224;',
                'rhard' => '&#x21C1;',
                'rharu' => '&#x21C0;',
                'rharul' => '&#xE230;',
                'rho' => '&#x03C1;',
                'rhov' => '&#x03F1;',
                'RightAngleBracket' => '&#x3009;',
                'RightArrow' => '&#x2192;',
                'Rightarrow' => '&#x21D2;',
                'rightarrow' => '&#x2192;',
                'RightArrowLeftArrow' => '&#x21C4;',
                'rightarrowtail' => '&#x21A3;',
                'RightCeiling' => '&#x2309;',
                'RightDownVector' => '&#x21C2;',
                'RightFloor' => '&#x230B;',
                'rightharpoondown' => '&#x21C1;',
                'rightharpoonup' => '&#x21C0;',
                'rightleftarrows' => '&#x21C4;',
                'rightleftharpoons' => '&#x21CC;',
                'rightrightarrows' => '&#x21C9;',
                'rightsquigarrow' => '&#x219D;',
                'RightTee' => '&#x22A2;',
                'RightTeeArrow' => '&#x21A6;',
                'rightthreetimes' => '&#x22CC;',
                'RightTriangle' => '&#x22B3;',
                'RightTriangleEqual' => '&#x22B5;',
                'RightUpVector' => '&#x21BE;',
                'RightVector' => '&#x21C0;',
                'ring' => '&#x030A;',
                'risingdotseq' => '&#x2253;',
                'rlarr' => '&#x21C4;',
                'rlhar' => '&#x21CC;',
                'rmoust' => '&#xE293;',
                'rmoustache' => '&#xE293;',
                'rnmid' => '&#xE2D1;',
                'roang' => '&#x3019;',
                'roarr' => '&#xE241;',
                'robrk' => '&#x301B;',
                'ropar' => '&#xE37A;',
                'Ropf' => '&#x211D;',
                'roplus' => '&#xE25D;',
                'rotimes' => '&#xE40D;',
                'rpar' => '&#x0029;',
                'rpargt' => '&#xE291;',
                'rppolint' => '&#xE397;',
                'rrarr' => '&#x21C9;',
                'Rrightarrow' => '&#x21DB;',
                'Rscr' => '&#xE4D6;',
                'rscr' => '&#x211B;',
                'Rsh' => '&#x21B1;',
                'rsh' => '&#x21B1;',
                'rsqb' => '&#x005D;',
                'rsquo' => '&#x2019;',
                'rsquor' => '&#x201F;',
                'rthree' => '&#x22CC;',
                'rtimes' => '&#x22CA;',
                'rtri' => '&#x25B9;',
                'rtrie' => '&#x22B5;',
                'rtrif' => '&#x25B8;',
                'rtriltri' => '&#xE359;',
                'ruluhar' => '&#xE22A;',
                'rx' => '&#x211E;',
                'Sc' => '&#xE35D;',
                'sc' => '&#x227B;',
                'scap' => '&#x227F;',
                'sccue' => '&#x227D;',
                'scE' => '&#x227E;',
                'sce' => '&#x227D;',
                'scnap' => '&#x22E9;',
                'scnE' => '&#xE2B5;',
                'scnsim' => '&#x22E9;',
                'scpolint' => '&#xE398;',
                'scsim' => '&#x227F;',
                'sdot' => '&#x22C5;',
                'sdotb' => '&#x22A1;',
                'sdote' => '&#xE319;',
                'searhk' => '&#xE20B;',
                'seArr' => '&#x21D8;',
                'searr' => '&#x2198;',
                'searrow' => '&#x2198;',
                'sect' => '&#x00A7;',
                'semi' => '&#x003B;',
                'seswar' => '&#xE406;',
                'setminus' => '&#x2216;',
                'setmn' => '&#x2216;',
                'sext' => '&#xE505;',
                'Sfr' => '&#xE48E;',
                'sfr' => '&#xE4A7;',
                'sfrown' => '&#xE426;',
                'sharp' => '&#x266F;',
                'ShortLeftArrow' => '&#xE233;',
                'shortmid' => '&#xE301;',
                'shortparallel' => '&#xE302;',
                'ShortRightArrow' => '&#xE232;',
                'shy' => '&#x00AD;',
                'Sigma' => '&#x03A3;',
                'sigma' => '&#x03C3;',
                'sigmav' => '&#x03C2;',
                'sim' => '&#x223C;',
                'simdot' => '&#xE38B;',
                'sime' => '&#x2243;',
                'simeq' => '&#x2243;',
                'simg' => '&#xE30C;',
                'simgE' => '&#xE338;',
                'siml' => '&#xE30B;',
                'simlE' => '&#xE337;',
                'simne' => '&#x2246;',
                'simplus' => '&#xE26B;',
                'simrarr' => '&#xE234;',
                'slarr' => '&#xE233;',
                'SmallCircle' => '&#x2218;',
                'smallfrown' => '&#xE426;',
                'smallsetminus' => '&#xE844;',
                'smallsmile' => '&#xE303;',
                'smashp' => '&#xE264;',
                'smeparsl' => '&#xE385;',
                'smid' => '&#xE301;',
                'smile' => '&#x2323;',
                'smt' => '&#xE339;',
                'smte' => '&#xE33B;',
                'smtes' => '&#xE33D;',
                'sol' => '&#x002F;',
                'solb' => '&#xE27F;',
                'solbar' => '&#xE416;',
                'Sopf' => '&#xE4BD;',
                'spades' => '&#x2660;',
                'spadesuit' => '&#x2660;',
                'spar' => '&#xE302;',
                'sqcap' => '&#x2293;',
                'sqcaps' => '&#xE277;',
                'sqcup' => '&#x2294;',
                'sqcups' => '&#xE276;',
                'Sqrt' => '&#x221A;',
                'sqsub' => '&#x228F;',
                'sqsube' => '&#x2291;',
                'sqsubset' => '&#x228F;',
                'sqsubseteq' => '&#x2291;',
                'sqsup' => '&#x2290;',
                'sqsupe' => '&#x2292;',
                'sqsupset' => '&#x2290;',
                'sqsupseteq' => '&#x2292;',
                'squ' => '&#x25A1;',
                'square' => '&#x25A1;',
                'SquareIntersection' => '&#x2293;',
                'SquareSubset' => '&#x228F;',
                'SquareSubsetEqual' => '&#x2291;',
                'SquareSuperset' => '&#x2290;',
                'SquareSupersetEqual' => '&#x2292;',
                'SquareUnion' => '&#x2294;',
                'squarf' => '&#x25A0;',
                'squarfb' => '&#xE507;',
                'squarfbl' => '&#xE506;',
                'squarfbr' => '&#x25EA;',
                'squarfl' => '&#x25E7;',
                'squarfr' => '&#x25E8;',
                'squarft' => '&#xE509;',
                'squarftl' => '&#x25E9;',
                'squarftr' => '&#xE508;',
                'squf' => '&#x25AA;',
                'srarr' => '&#xE232;',
                'Sscr' => '&#xE4D7;',
                'sscr' => '&#xE4F0;',
                'ssetmn' => '&#xE844;',
                'ssmile' => '&#xE303;',
                'sstarf' => '&#x22C6;',
                'Star' => '&#x22C6;',
                'star' => '&#x22C6;',
                'starf' => '&#x2605;',
                'straightepsilon' => '&#x220A;',
                'straightphi' => '&#x03C6;',
                'strns' => '&#xE380;',
                'Sub' => '&#x22D0;',
                'sub' => '&#x2282;',
                'subdot' => '&#xE262;',
                'subE' => '&#x2286;',
                'sube' => '&#x2286;',
                'subedot' => '&#xE34F;',
                'submult' => '&#xE343;',
                'subnE' => '&#x228A;',
                'subne' => '&#x228A;',
                'subplus' => '&#xE341;',
                'subrarr' => '&#xE33F;',
                'Subset' => '&#x22D0;',
                'subset' => '&#x2282;',
                'subseteq' => '&#x2286;',
                'subseteqq' => '&#x2286;',
                'SubsetEqual' => '&#x2286;',
                'subsetneq' => '&#x228A;',
                'subsetneqq' => '&#x228A;',
                'subsim' => '&#xE345;',
                'subsub' => '&#xE349;',
                'subsup' => '&#xE347;',
                'succ' => '&#x227B;',
                'succapprox' => '&#x227F;',
                'succcurlyeq' => '&#x227D;',
                'Succeeds' => '&#x227B;',
                'SucceedsEqual' => '&#x227D;',
                'SucceedsSlantEqual' => '&#x227D;',
                'SucceedsTilde' => '&#x227F;',
                'succeq' => '&#x227D;',
                'succnapprox' => '&#x22E9;',
                'succneqq' => '&#xE2B5;',
                'succnsim' => '&#x22E9;',
                'succsim' => '&#x227F;',
                'SuchThat' => '&#x220D;',
                'Sum' => '&#x2211;',
                'sum' => '&#x2211;',
                'sung' => '&#x2669;',
                'Sup' => '&#x22D1;',
                'sup' => '&#x2283;',
                'sup1' => '&#x00B9;',
                'sup2' => '&#x00B2;',
                'sup3' => '&#x00B3;',
                'supdot' => '&#xE263;',
                'supdsub' => '&#xE34C;',
                'supE' => '&#x2287;',
                'supe' => '&#x2287;',
                'supedot' => '&#xE350;',
                'Superset' => '&#x2283;',
                'SupersetEqual' => '&#x2287;',
                'suphsol' => '&#xE34E;',
                'suphsub' => '&#xE34B;',
                'suplarr' => '&#xE340;',
                'supmult' => '&#xE344;',
                'supnE' => '&#x228B;',
                'supne' => '&#x228B;',
                'supplus' => '&#xE342;',
                'Supset' => '&#x22D1;',
                'supset' => '&#x2283;',
                'supseteq' => '&#x2287;',
                'supseteqq' => '&#x2287;',
                'supsetneq' => '&#x228B;',
                'supsetneqq' => '&#x228B;',
                'supsim' => '&#xE346;',
                'supsub' => '&#xE348;',
                'supsup' => '&#xE34A;',
                'swarhk' => '&#xE20A;',
                'swArr' => '&#x21D9;',
                'swarr' => '&#x2199;',
                'swarrow' => '&#x2199;',
                'swnwar' => '&#xE210;',
                'target' => '&#x2316;',
                'tau' => '&#x03C4;',
                'tbrk' => '&#xE2EF;',
                'tdot' => '&#x20DB;',
                'telrec' => '&#x2315;',
                'Tfr' => '&#xE48F;',
                'tfr' => '&#xE4A8;',
                'there4' => '&#x2234;',
                'Therefore' => '&#x2234;',
                'therefore' => '&#x2234;',
                'Theta' => '&#x0398;',
                'theta' => '&#x03B8;',
                'thetav' => '&#x03D1;',
                'thickapprox' => '&#xE306;',
                'thicksim' => '&#xE429;',
                'thinsp' => '&#x2009;',
                'thkap' => '&#xE306;',
                'thksim' => '&#xE429;',
                'Tilde' => '&#x223C;',
                'tilde' => '&#x0303;',
                'TildeEqual' => '&#x2243;',
                'TildeFullEqual' => '&#x2245;',
                'TildeTilde' => '&#x2248;',
                'times' => '&#x00D7;',
                'timesb' => '&#x22A0;',
                'timesbar' => '&#xE28E;',
                'timesd' => '&#xE26D;',
                'tint' => '&#x222D;',
                'toea' => '&#xE20E;',
                'top' => '&#x22A4;',
                'topbot' => '&#x2336;',
                'topcir' => '&#xE383;',
                'Topf' => '&#xE4BE;',
                'topfork' => '&#xE31C;',
                'tosa' => '&#xE20F;',
                'tprime' => '&#x2034;',
                'trade' => '&#x2122;',
                'triangle' => '&#x25B5;',
                'triangledown' => '&#x25BF;',
                'triangleleft' => '&#x25C3;',
                'trianglelefteq' => '&#x22B4;',
                'triangleq' => '&#x225C;',
                'triangleright' => '&#x25B9;',
                'trianglerighteq' => '&#x22B5;',
                'tridot' => '&#x25EC;',
                'trie' => '&#x225C;',
                'triminus' => '&#xE27C;',
                'TripleDot' => '&#x20DB;',
                'triplus' => '&#xE27B;',
                'trisb' => '&#xE27E;',
                'tritime' => '&#xE27D;',
                'trpezium' => '&#xE2EC;',
                'Tscr' => '&#xE4D8;',
                'tscr' => '&#xE4F1;',
                'twixt' => '&#x226C;',
                'twoheadleftarrow' => '&#x219E;',
                'twoheadrightarrow' => '&#x21A0;',
                'Uarr' => '&#x219F;',
                'uArr' => '&#x21D1;',
                'uarr' => '&#x2191;',
                'Uarrocir' => '&#xE237;',
                'udarr' => '&#x21C5;',
                'udhar' => '&#xE218;',
                'ufisht' => '&#xE24B;',
                'Ufr' => '&#xE490;',
                'ufr' => '&#xE4A9;',
                'uHar' => '&#xE226;',
                'uharl' => '&#x21BF;',
                'uharr' => '&#x21BE;',
                'uhblk' => '&#x2580;',
                'ulcorn' => '&#x231C;',
                'ulcorner' => '&#x231C;',
                'ulcrop' => '&#x230F;',
                'ultri' => '&#xE2E4;',
                'uml' => '&#x0308;',
                'UnderLine' => '&#x0332;',
                'Union' => '&#x22C3;',
                'UnionPlus' => '&#x228E;',
                'Uopf' => '&#xE4BF;',
                'UpArrow' => '&#x2191;',
                'Uparrow' => '&#x21D1;',
                'uparrow' => '&#x2191;',
                'UpArrowDownArrow' => '&#x21C5;',
                'UpDownArrow' => '&#x2195;',
                'Updownarrow' => '&#x21D5;',
                'updownarrow' => '&#x2195;',
                'UpEquilibrium' => '&#xE218;',
                'upharpoonleft' => '&#x21BF;',
                'upharpoonright' => '&#x21BE;',
                'uplus' => '&#x228E;',
                'UpperLeftArrow' => '&#x2196;',
                'UpperRightArrow' => '&#x2197;',
                'Upsi' => '&#x03D2;',
                'upsi' => '&#x03C5;',
                'Upsilon' => '&#x03D2;',
                'upsilon' => '&#x03C5;',
                'UpTee' => '&#x22A5;',
                'upuparrows' => '&#x21C8;',
                'urcorn' => '&#x231D;',
                'urcorner' => '&#x231D;',
                'urcrop' => '&#x230E;',
                'urtri' => '&#xE2E2;',
                'Uscr' => '&#xE4D9;',
                'uscr' => '&#xE4F2;',
                'utdot' => '&#x22F0;',
                'utri' => '&#x25B5;',
                'utrif' => '&#x25B4;',
                'uuarr' => '&#x21C8;',
                'uwangle' => '&#xE3AB;',
                'vangrt' => '&#x22BE;',
                'varepsilon' => '&#x03B5;',
                'varkappa' => '&#x03F0;',
                'varnothing' => '&#x2205;',
                'varphi' => '&#x03D5;',
                'varpi' => '&#x03D6;',
                'varpropto' => '&#x221D;',
                'vArr' => '&#x21D5;',
                'varr' => '&#x2195;',
                'varrho' => '&#x03F1;',
                'varsigma' => '&#x03C2;',
                'varsubsetneq' => '&#xE2B9;',
                'varsubsetneqq' => '&#xE2B8;',
                'varsupsetneq' => '&#xE2BA;',
                'varsupsetneqq' => '&#xE2BB;',
                'vartheta' => '&#x03D1;',
                'vartriangleleft' => '&#x22B2;',
                'vartriangleright' => '&#x22B3;',
                'Vbar' => '&#xE30D;',
                'vBar' => '&#xE310;',
                'vBarv' => '&#xE312;',
                'VDash' => '&#x22AB;',
                'Vdash' => '&#x22A9;',
                'vDash' => '&#x22A8;',
                'vdash' => '&#x22A2;',
                'Vdashl' => '&#xE313;',
                'Vee' => '&#x22C1;',
                'vee' => '&#x2228;',
                'veebar' => '&#x22BB;',
                'veeeq' => '&#x225A;',
                'vellip' => '&#x22EE;',
                'Verbar' => '&#x2016;',
                'verbar' => '&#x007C;',
                'Vert' => '&#x2016;',
                'vert' => '&#x007C;',
                'VerticalBar' => '&#x2223;',
                'VerticalTilde' => '&#x2240;',
                'Vfr' => '&#xE491;',
                'vfr' => '&#xE4AA;',
                'vltri' => '&#x22B2;',
                'vnsub' => '&#x2284;',
                'vnsup' => '&#x2285;',
                'Vopf' => '&#xE4C0;',
                'vprop' => '&#x221D;',
                'vrtri' => '&#x22B3;',
                'Vscr' => '&#xE4DA;',
                'vscr' => '&#xE4F3;',
                'vsubnE' => '&#xE2B8;',
                'vsubne' => '&#xE2B9;',
                'vsupnE' => '&#xE2BB;',
                'vsupne' => '&#xE2BA;',
                'Vvdash' => '&#x22AA;',
                'vzigzag' => '&#xE2EB;',
                'wedbar' => '&#xE265;',
                'Wedge' => '&#x22C0;',
                'wedge' => '&#x2227;',
                'wedgeq' => '&#x2259;',
                'weierp' => '&#x2118;',
                'Wfr' => '&#xE492;',
                'wfr' => '&#xE4AB;',
                'Wopf' => '&#xE4C1;',
                'wp' => '&#x2118;',
                'wr' => '&#x2240;',
                'wreath' => '&#x2240;',
                'Wscr' => '&#xE4DB;',
                'wscr' => '&#xE4F4;',
                'xcap' => '&#x22C2;',
                'xcirc' => '&#x25CB;',
                'xcup' => '&#x22C3;',
                'xdtri' => '&#x25BD;',
                'Xfr' => '&#xE493;',
                'xfr' => '&#xE4AC;',
                'xhArr' => '&#xE202;',
                'xharr' => '&#xE203;',
                'Xi' => '&#x039E;',
                'xi' => '&#x03BE;',
                'xlArr' => '&#xE200;',
                'xlarr' => '&#xE201;',
                'xmap' => '&#xE208;',
                'xnis' => '&#xE3A3;',
                'xodot' => '&#x2299;',
                'Xopf' => '&#xE4C2;',
                'xoplus' => '&#x2295;',
                'xotime' => '&#x2297;',
                'xrArr' => '&#xE204;',
                'xrarr' => '&#xE205;',
                'Xscr' => '&#xE4DC;',
                'xscr' => '&#xE4F5;',
                'xsqcup' => '&#x2294;',
                'xuplus' => '&#x228E;',
                'xutri' => '&#x25B3;',
                'xvee' => '&#x22C1;',
                'xwedge' => '&#x22C0;',
                'yen' => '&#x00A5;',
                'Yfr' => '&#xE494;',
                'yfr' => '&#xE4AD;',
                'Yopf' => '&#xE4C3;',
                'Yscr' => '&#xE4DD;',
                'yscr' => '&#xE4F6;',
                'zeta' => '&#x03B6;',
                'Zfr' => '&#x2124;',
                'zfr' => '&#xE4AE;',
                'zigrarr' => '&#xE244;',
                'Zopf' => '&#xE4C4;',
                'Zscr' => '&#xE4DE;',
                'zscr' => '&#xE4F7;'
                );
                return $charset;
                        
                

        // cas particuliers pour la translitteration
        case 'translit':
                $GLOBALS['CHARSET'][$charset] = array (
                // latin
                128=>'euro', 131=>'f', 140=>'OE', 147=>'\'\'', 148=>'\'\'', 153=>'TM', 156=>'oe', 159=>'Y', 160=>' ',
                161=>'!', 162=>'c', 163=>'L', 164=>'O', 165=>'yen',166=>'|',
                167=>'p',169=>'(c)', 171=>'<<',172=>'-',173=>'-',174=>'(R)',
                176=>'o',177=>'+-',181=>'mu',182=>'p',183=>'.',187=>'>>', 192=>'A',
                193=>'A', 194=>'A', 195=>'A', 196=>'A', 197=>'A', 198=>'AE', 199=>'C',
                200=>'E', 201=>'E', 202=>'E', 203=>'E', 204=>'I', 205=>'I', 206=>'I',
                207=>'I', 209=>'N', 210=>'O', 211=>'O', 212=>'O', 213=>'O', 214=>'O',
                216=>'O', 217=>'U', 218=>'U', 219=>'U', 220=>'U', 223=>'ss', 224=>'a',
                225=>'a', 226=>'a', 227=>'a', 228=>'a', 229=>'a', 230=>'ae', 231=>'c',
                232=>'e', 233=>'e', 234=>'e', 235=>'e', 236=>'i', 237=>'i', 238=>'i',
                239=>'i', 241=>'n', 242=>'o', 243=>'o', 244=>'o', 245=>'o', 246=>'o',
                248=>'o', 249=>'u', 250=>'u', 251=>'u', 252=>'u', 255=>'y',

                // turc
                286=>'G', 287=>'g', 304=>'I', 305=>'i', 350=>'S', 351=>'s',

                // esperanto
                264 => 'Cx',265 => 'cx',
                284 => 'Gx',285 => 'gx',
                292 => 'Hx',293 => 'hx',
                308 => 'Jx',309 => 'jx',
                348 => 'Sx',349 => 'sx',
                364 => 'Ux',365 => 'ux',

                // cyrillique
                1026=>'D%', 1027=>'G%', 8218=>'\'', 1107=>'g%', 8222=>'"', 8230=>'...',
                8224=>'/-', 8225=>'/=',  8364=>'EUR', 8240=>'0/00', 1033=>'LJ',
                8249=>'<', 1034=>'NJ', 1036=>'KJ', 1035=>'Ts', 1039=>'DZ',  1106=>'d%',
                8216=>'`', 8217=>'\'', 8220=>'"', 8221=>'"', 8226=>' o ', 8211=>'-',
                8212=>'--', 8212=>'~',  8482=>'(TM)', 1113=>'lj', 8250=>'>', 1114=>'nj',
                1116=>'kj', 1115=>'ts', 1119=>'dz',  1038=>'V%', 1118=>'v%', 1032=>'J%',
                1168=>'G3', 1025=>'IO',  1028=>'IE', 1031=>'YI', 1030=>'II',
                1110=>'ii', 1169=>'g3', 1105=>'io', 8470=>'No.', 1108=>'ie',
                1112=>'j%', 1029=>'DS', 1109=>'ds', 1111=>'yi', 1040=>'A', 1041=>'B',
                1042=>'V', 1043=>'G', 1044=>'D',  1045=>'E', 1046=>'ZH', 1047=>'Z',
                1048=>'I', 1049=>'J', 1050=>'K', 1051=>'L', 1052=>'M', 1053=>'N',
                1054=>'O', 1055=>'P', 1056=>'R', 1057=>'S', 1058=>'T', 1059=>'U',
                1060=>'F', 1061=>'H', 1062=>'C',  1063=>'CH', 1064=>'SH', 1065=>'SCH',
                1066=>'"', 1067=>'Y', 1068=>'\'', 1069=>'`E', 1070=>'YU',  1071=>'YA',
                1072=>'a', 1073=>'b', 1074=>'v', 1075=>'g', 1076=>'d', 1077=>'e',
                1078=>'zh', 1079=>'z',  1080=>'i', 1081=>'j', 1082=>'k', 1083=>'l',
                1084=>'m', 1085=>'n', 1086=>'o', 1087=>'p', 1088=>'r',  1089=>'s',
                1090=>'t', 1091=>'u', 1092=>'f', 1093=>'h', 1094=>'c', 1095=>'ch',
                1096=>'sh', 1097=>'sch',  1098=>'"', 1099=>'y', 1100=>'\'', 1101=>'`e',
                1102=>'yu', 1103=>'ya',
                
                // vietnamien en translitteration de base
                7843=>"a",7841=>"a",7845=>"a",7847=>"a",7849=>"a",7851=>"a",7853=>"a",
                7855=>"a",7857=>"a",7859=>"a",7861=>"a",7863=>"a",
                7842=>"A",7840=>"A",7844=>"A",7846=>"A",7848=>"A",
                7850=>"A",7852=>"A",7854=>"A",7856=>"A",7858=>"A",7860=>"A",
                7862=>"A",7867=>"e",7869=>"e",7865=>"e",
                7871=>"e",7873=>"e",7875=>"e",7877=>"e",7879=>"e",
                7866=>"E",7868=>"E",7864=>"E",7870=>"E",7872=>"E",7874=>"E",
                7876=>"E",7878=>"E",7881=>"i",7883=>"i",
                7880=>"I",7882=>"I",
                7887=>"o",7885=>"o",7889=>"o",7891=>"o",7893=>"o",
                7895=>"o",7897=>"o",417=>"o",7899=>"o",7901=>"o",7903=>"o",7905=>"o",
                7907=>"o",7886=>"O",7884=>"O",
                7888=>"O",7890=>"O",7892=>"O",7894=>"O",7896=>"O",416=>"O",7898=>"O",
                7900=>"O",7902=>"O",7904=>"O",7906=>"O",7911=>"u",
                361=>"u",7909=>"u",432=>"u",7913=>"u",7915=>"u",7917=>"u",7919=>"u",
                7921=>"u",7910=>"U",360=>"U",7908=>"U",431=>"U",
                7912=>"U",7914=>"U",7916=>"U",7918=>"U",7920=>"U",253=>"y",7923=>"y",
                7927=>"y",7929=>"y",7925=>"y",221=>"Y",7922=>"Y",7926=>"Y",7928=>"Y",
                7924=>"Y",273=>"d"
                
                );
                return $charset;

        // translitteration complexe
        case 'translitcomplexe':
                load_charset('translit');
                $trans = $GLOBALS['CHARSET']['translit'];

                $translit_c = array (
                // vietnamien
                225=>"a'", 224=>"a`",7843=>"a?",227=>"a~",7841=>"a.",
                226=>"a^",7845=>"a^'",7847=>"a^`",7849=>"a^?",7851=>"a^~",7853=>"a^.",259=>"a(",
                7855=>"a('",7857=>"a(`",7859=>"a(?",7861=>"a(~",7863=>"a(.",193=>"A'",192=>"A`",
                7842=>"A?",195=>"A~",7840=>"A.",194=>"A^",7844=>"A^'",7846=>"A^`",7848=>"A^?",
                7850=>"A^~",7852=>"A^.",258=>"A(",7854=>"A('",7856=>"A(`",7858=>"A(?",7860=>"A(~",
                7862=>"A(.",233=>"e'",232=>"e`",7867=>"e?",7869=>"e~",7865=>"e.",234=>"e^",
                7871=>"e^'",7873=>"e^`",7875=>"e^?",7877=>"e^~",7879=>"e^.",201=>"E'",200=>"E`",
                7866=>"E?",7868=>"E~",7864=>"E.",202=>"E^",7870=>"E^'",7872=>"E^`",7874=>"E^?",
                7876=>"E^~",7878=>"E^.",237=>"i'",236=>"i`",7881=>"i?",297=>"i~",7883=>"i.",
                205=>"I'",204=>"I`",7880=>"I?",296=>"I~",7882=>"I.",243=>"o'",242=>"o`",
                7887=>"o?",245=>"o~",7885=>"o.",244=>"o^",7889=>"o^'",7891=>"o^`",7893=>"o^?",
                7895=>"o^~",7897=>"o^.",417=>"o+",7899=>"o+'",7901=>"o+`",7903=>"o+?",7905=>"o+~",
                7907=>"o+.",211=>"O'",210=>"O`",7886=>"O?",213=>"O~",7884=>"O.",212=>"O^",
                7888=>"O^'",7890=>"O^`",7892=>"O^?",7894=>"O^~",7896=>"O^.",416=>"O+",7898=>"O+'",
                7900=>"O+`",7902=>"O+?",7904=>"O+~",7906=>"O+.",250=>"u'",249=>"u`",7911=>"u?",
                361=>"u~",7909=>"u.",432=>"u+",7913=>"u+'",7915=>"u+`",7917=>"u+?",7919=>"u+~",
                7921=>"u+.",218=>"U'",217=>"U`",7910=>"U?",360=>"U~",7908=>"U.",431=>"U+",
                7912=>"U+'",7914=>"U+`",7916=>"U+?",7918=>"U+~",7920=>"U+.",253=>"y'",7923=>"y`",
                7927=>"y?",7929=>"y~",7925=>"y.",221=>"Y'",7922=>"Y`",7926=>"Y?",7928=>"Y~",
                7924=>"Y.",273=>"d-",208=>"D-",

                // allemand
                228=>'ae',246=>'oe',252=>'ue',196=>'Ae',214=>'Oe',220=>'Ue'
                );
                foreach($translit_c as $u=>$t)
                        $trans[$u] = $t;
                $GLOBALS['CHARSET'][$charset] = $trans;
                return $charset;


        default:
                $GLOBALS['CHARSET'][$charset] = array();
                return $charset;
        }
}

//
// Verifier qu'on peut utiliser mb_string
//
function init_mb_string() {
        static $mb;

        // verifier que tout est present (fonctions mb_string pour php >= 4.0.6)
        // et que le charset interne est connu de mb_string
        if (!$mb) {
                if (function_exists('mb_internal_encoding')
                AND function_exists('mb_detect_order')
                AND function_exists('mb_substr')
                AND function_exists('mb_strlen')
                AND function_exists('mb_encode_mimeheader')
                AND function_exists('mb_encode_numericentity')
                AND function_exists('mb_decode_numericentity')
                AND mb_detect_order(lire_meta('charset'))
                ) {
                        mb_internal_encoding('utf-8');
                        $mb = 1;
                } else
                        $mb = -1;
        }

        return ($mb == 1);
}

// Detecter les versions buggees d'iconv
function test_iconv() {
        static $iconv_ok;

        if (!$iconv_ok) {
                if (!function_exists('iconv'))
                        $iconv_ok = -1;
                else {
                        if (utf_32_to_unicode(@iconv('utf-8', 'utf-32', 'chaine de test')) == 'chaine de test')
                                $iconv_ok = 1;
                        else
                                $iconv_ok = -1;
                }
        }
        return ($iconv_ok == 1);
}

// Test de fonctionnement du support UTF-8 dans PCRE
// (contournement bug Debian Woody)
function test_pcre_unicode() {
        static $pcre_ok = 0;

        if (!$pcre_ok) {
                $s = " ".chr(195).chr(169)."t".chr(195).chr(169)." ";
                if (preg_match(',\W\w\w\w\W,u', $s)) $pcre_ok = 1;
                else $pcre_ok = -1;
        }
        return $pcre_ok == 1;
}

// Plages alphanumeriques (incomplet...)
function pcre_lettres_unicode() {
        static $plage_unicode;

        if (!$plage_unicode) {
                if (test_pcre_unicode()) {
                        // cf. http://www.unicode.org/charts/
                        $plage_unicode = '\w' // iso-latin
                                . '\x{100}-\x{24f}' // europeen etendu
                                . '\x{300}-\x{1cff}' // des tas de trucs
                        ;
                }
                else {
                        // fallback a trois sous
                        $plage_unicode = '\w';
                }
        }
        return $plage_unicode;
}

// Plage ponctuation de 0x2000 a 0x206F
// (i.e. de 226-128-128 a 226-129-176)
function plage_punct_unicode() {
        return '\xE2(\x80[\x80-\xBF]|\x81[\x80-\xAF])';
}

//
// Transformer les &eacute; en &#123;
//
function html2unicode($texte) {
        static $trans;
        if (!$trans) {
                global $CHARSET;
                load_charset('html');
                foreach ($CHARSET['html'] as $key => $val) {
                        $trans["&$key;"] = $val;
                }
        }

        return strtr($texte, $trans);
}

//
// Transformer les &eacute; en &#123;
//
function mathml2unicode($texte) {
        static $trans;
        if (!$trans) {
                global $CHARSET;
                load_charset('mathml');
                
                foreach ($CHARSET['mathml'] as $key => $val)
                        $trans["&$key;"] = $val;
        }

        return strtr($texte, $trans);
}


//
// Transforme une chaine en entites unicode &#129;
//
function charset2unicode($texte, $charset='AUTO', $forcer = false) {
        static $trans;

        if ($charset == 'AUTO')
                $charset = lire_meta('charset');

        switch ($charset) {
        case 'utf-8':
                return utf_8_to_unicode($texte);

        case 'iso-8859-1':
                // corriger caracteres non-conformes issus de Windows (CP-1252)
                $faux_latin = array(
                        chr(138) => "&#352;", // Scaron
                        chr(140) => "&#338;", // OElig
                        chr(142) => "&#381;", // Zcaron
                        chr(154) => "&#353;", // scaron
                        chr(156) => "&#339;", // oelig
                        chr(158) => "&#382;" // zcaron
                );
                $texte = strtr($texte, $faux_latin);

                // On commente cet appel tant qu'il reste des spip v<1.5 dans la nature
                // pour que le filtre |entites_unicode donne des backends lisibles sur ces spips.
                if (!$forcer) return $texte;

        default:
                // mbstring presente ?
                if (init_mb_string()) {
                        if ($order = mb_detect_order() # mb_string connait-il $charset?
                        AND mb_detect_order($charset)) {
                                $s = mb_convert_encoding($texte, 'utf-8', $charset);
                                if ($s && $s != $texte) return utf_8_to_unicode($s);
                        }
                        mb_detect_order($order); # remettre comme precedemment
                }

                // Sinon, peut-etre connaissons-nous ce charset ?
                if (!isset($trans[$charset])) {
                        global $CHARSET;
                        load_charset($charset);
                        foreach ($CHARSET[$charset] as $key => $val) {
                                $trans[$charset][chr($key)] = '&#'.$val.';';
                        }
                }
                if (count($trans[$charset]))
                        return strtr($texte, $trans[$charset]);

                // Sinon demander a iconv (malgre le fait qu'il coupe quand un
                // caractere n'appartient pas au charset, mais c'est un probleme
                // surtout en utf-8, gere ci-dessus)
                if (test_iconv()) {
                        $s = iconv($charset, 'utf-32le', $texte);
                        if ($s) return utf_32_to_unicode($s);
                }

                // Au pire ne rien faire
                spip_log("erreur charset $charset non supporte");
                return $texte;
        }
}

//
// Transforme les entites unicode &#129; dans le charset specifie
//
function unicode2charset($texte, $charset='AUTO') {
        static $CHARSET_REVERSE;
        if ($charset == 'AUTO')
                $charset = lire_meta('charset');

        switch($charset) {
        case 'utf-8':
                return unicode_to_utf_8($texte);
                break;

        default:
                $charset = load_charset($charset);

                if (!is_array($CHARSET_REVERSE[$charset])) {
                        $CHARSET_REVERSE[$charset] = array_flip($GLOBALS['CHARSET'][$charset]);
                }

                $trans = array();
                // Construire la table de remplacements
                // 1. Entites decimales (type "&#123;")
                if (preg_match_all(',&#([0-9]+);,', $texte, $regs, PREG_PATTERN_ORDER)) {
                        $entites = array_flip($regs[1]);
                        foreach ($entites as $e => $v) {
                                if ($s = ($e < 128) ? $e : $CHARSET_REVERSE[$charset][intval($e)])
                                        $trans['&#'.$e.';'] = chr($s);
                        }
                }
                // 2. Entites hexadecimales (type "&#xD;")
                if (preg_match_all(',&#x([0-9a-zA-Z]+);,', $texte, $regs, PREG_PATTERN_ORDER)) {
                        $entites = array_flip($regs[1]);
                        foreach ($entites as $e => $v) {
                                $h = hexdec($e);
                                if ($s = ($h < 128) ? $h : $CHARSET_REVERSE[$charset][$h])
                                        $trans['&#x'.$e.';'] = chr($s);
                        }
                }
                $texte = strtr($texte, $trans);
                return $texte;
        }
}


// Importer un texte depuis un charset externe vers le charset du site
// (les caracteres non resolus sont transformes en &#123;)
function importer_charset($texte, $charset = 'AUTO') {
        return unicode2charset(charset2unicode($texte, $charset, true));
}

// UTF-8
function utf_8_to_unicode($source) {

        // mb_string : methode rapide
        if (init_mb_string()) {
                $convmap = array(0x7F, 0xFFFFFF, 0x0, 0xFFFFFF);
                return mb_encode_numericentity($source, $convmap, 'UTF-8');
        }

        // Sinon methode pas a pas
        static $decrement;
        static $shift;

        // Cf. php.net, par Ronen. Adapte pour compatibilite php3
        if (!is_array($decrement)) {
                // array used to figure what number to decrement from character order value
                // according to number of characters used to map unicode to ascii by utf-8
                $decrement[4] = 240;
                $decrement[3] = 224;
                $decrement[2] = 192;
                $decrement[1] = 0;
                // the number of bits to shift each charNum by
                $shift[1][0] = 0;
                $shift[2][0] = 6;
                $shift[2][1] = 0;
                $shift[3][0] = 12;
                $shift[3][1] = 6;
                $shift[3][2] = 0;
                $shift[4][0] = 18;
                $shift[4][1] = 12;
                $shift[4][2] = 6;
                $shift[4][3] = 0;
        }

        $pos = 0;
        $len = strlen ($source);
        $encodedString = '';
        while ($pos < $len) {
                $char = '';
                $ischar = false;
                $asciiPos = ord (substr ($source, $pos, 1));
                if (($asciiPos >= 240) && ($asciiPos <= 255)) {
                        // 4 chars representing one unicode character
                        $thisLetter = substr ($source, $pos, 4);
                        $pos += 4;
                }
                else if (($asciiPos >= 224) && ($asciiPos <= 239)) {
                        // 3 chars representing one unicode character
                        $thisLetter = substr ($source, $pos, 3);
                        $pos += 3;
                }
                else if (($asciiPos >= 192) && ($asciiPos <= 223)) {
                        // 2 chars representing one unicode character
                        $thisLetter = substr ($source, $pos, 2);
                        $pos += 2;
                }
                else {
                        // 1 char (lower ascii)
                        $thisLetter = substr ($source, $pos, 1);
                        $pos += 1;
                        $char = $thisLetter;
                        $ischar = true;
                }

                if ($ischar)
                        $encodedString .= $char;
                else {  // process the string representing the letter to a unicode entity
                        $thisLen = strlen ($thisLetter);
                        $thisPos = 0;
                        $decimalCode = 0;
                        while ($thisPos < $thisLen) {
                                $thisCharOrd = ord (substr ($thisLetter, $thisPos, 1));
                                if ($thisPos == 0) {
                                        $charNum = intval ($thisCharOrd - $decrement[$thisLen]);
                                        $decimalCode += ($charNum << $shift[$thisLen][$thisPos]);
                                } else {
                                        $charNum = intval ($thisCharOrd - 128);
                                        $decimalCode += ($charNum << $shift[$thisLen][$thisPos]);
                                }
                                $thisPos++;
                        }
                        $encodedLetter = "&#". ereg_replace('^0+', '', $decimalCode) . ';';
                        $encodedString .= $encodedLetter;
                }
        }
        return $encodedString;
}

// UTF-32 ne sert plus que si on passe par iconv, c'est-a-dire quand
// mb_string est absente ou ne connait pas notre charset
// mais on l'optimise quand meme par mb_string
// => tout ca sera osolete quand on sera surs d'avoir mb_string
function utf_32_to_unicode($source) {

        // mb_string : methode rapide
        if (init_mb_string()) {
                $convmap = array(0x7F, 0xFFFFFF, 0x0, 0xFFFFFF);
                $source = mb_encode_numericentity($source, $convmap, 'UTF-32LE');
                return str_replace(chr(0), '', $source);
        }

        // Sinon methode lente
        $texte = '';
        while ($source) {
                $words = unpack("V*", substr($source, 0, 1024));
                $source = substr($source, 1024);
                foreach ($words as $word) {
                        if ($word < 128)
                                $texte .= chr($word);
                        // ignorer le BOM - http://www.unicode.org/faq/utf_bom.html
                        else if ($word != 65279)
                                $texte .= '&#'.$word.';';
                }
        }
        return $texte;

}

// Ce bloc provient de php.net, auteur Ronen
function caractere_utf_8($num) {
        if($num<128)
                return chr($num);
        if($num<2048)
                return chr(($num>>6)+192).chr(($num&63)+128);
        if($num<65536)
                return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
        if($num<1114112)
                return chr($num>>18+240).chr((($num>>12)&63)+128).chr(($num>>6)&63+128). chr($num&63+128);
        return '';
}

function unicode_to_utf_8($texte) {
        while (preg_match(',&#0*([0-9]+);,', $texte, $regs)) {
                $s = caractere_utf_8($regs[1]);
                $texte = str_replace($regs[0], $s, $texte);
        }
        return $texte;
}

// convertit les &#264; en \u0108
function unicode_to_javascript($texte) {
        while (preg_match(',&#0*([0-9]+);,', $texte, $regs) AND !$vu[$regs[1]]) {
                $num = $regs[1];
                $vu[$num] = true;
                $s = '\u'.sprintf("%04x", $num);
                $texte = str_replace($regs[0], $s, $texte);
        }
        return $texte;
}

// convertit les %uxxxx (envoyes par javascript)
function javascript_to_unicode ($texte) {
        while (ereg("%u([0-9A-F][0-9A-F][0-9A-F][0-9A-F])", $texte, $regs))
                $texte = str_replace($regs[0],"&#".hexdec($regs[1]).";", $texte);
        return $texte;
}
// convertit les %E9 (envoyes par le browser) en chaine du charset du site (binaire)
function javascript_to_binary ($texte) {
        while (ereg("%([0-9A-F][0-9A-F])", $texte, $regs))
                $texte = str_replace($regs[0],chr(hexdec($regs[1])), $texte);
        return $texte;
}


//
// Translitteration charset => ascii (pour l'indexation)
// Attention les caracteres non reconnus sont renvoyes en utf-8
//
function translitteration($texte, $charset='AUTO', $complexe='') {
        static $trans;
        if ($charset == 'AUTO')
                $charset = lire_meta('charset');

        $table_translit ='translit'.$complexe;

        // 1. Passer le charset et les &eacute en utf-8
        $texte = unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset, true)));

        // 2. Translitterer grace a la table predefinie
        if (!$trans[$complexe]) {
                global $CHARSET;
                load_charset($table_translit);
                foreach ($CHARSET[$table_translit] as $key => $val)
                        $trans[$complexe][caractere_utf_8($key)] = $val;
        }

        return strtr($texte, $trans[$complexe]);
}

function translitteration_complexe($texte) {
        return translitteration($texte,'AUTO','complexe');
}

// Reconnaitre le BOM utf-8 (0xEFBBBF)
function bom_utf8($texte) {
        return (substr($texte, 0,3) == chr(0xEF).chr(0xBB).chr(0xBF));
}

// Transcode une page (probablement attrapee sur le web) en essayant
// par tous les moyens de deviner son charset (y compris headers HTTP)
function transcoder_page($texte, $headers='') {

        // Reconnaitre le BOM utf-8 (0xEFBBBF)
        if (bom_utf8($texte))
                $charset = 'utf-8';
        // charset precise par le contenu (xml)
        else if (preg_match(',<[?]xml[^>]*encoding[^>]*=[^>]*([-_a-z0-9]+?),Uims', $texte, $regs))
                $charset = trim(strtolower($regs[1]));
        // charset precise par le contenu (html)
        else if (preg_match(',<(meta|html|body)[^>]*charset[^>]*=[^>]*([-_a-z0-9]+?),Uims', $texte, $regs))
                $charset = trim(strtolower($regs[2]));
        // charset de la reponse http
        else if (preg_match(',charset=([-_a-z0-9]+),i', $headers, $regs))
                $charset = trim(strtolower($regs[1]));

        // normaliser les noms du shif-jis japonais
        if (preg_match(',^(x|shift)[_-]s?jis$,i', $charset))
                $charset = 'shift-jis';

        if ($charset) {
                spip_log("charset source detecte : $charset");
        } else {
                // valeur par defaut
                $charset = 'iso-8859-1';
                spip_log("pas de charset detecte, on suppose : $charset");
        }

        return importer_charset($texte, $charset);
}

// Initialisation
$GLOBALS['CHARSET'] = Array();

?>