[ Index ] |
|
Code source de SPIP 1.8.3 |
1 <?php 2 3 /***************************************************************************\ 4 * SPIP, Systeme de publication pour l'internet * 5 * * 6 * Copyright (c) 2001-2005 * 7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * 8 * * 9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * 10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * 11 \***************************************************************************/ 12 13 14 // 15 // Ce fichier ne sera execute qu'une fois 16 if (defined("_ECRIRE_INC_CHARSETS")) return; 17 define("_ECRIRE_INC_CHARSETS", "1"); 18 19 20 /* charsets supportes en natif (les autres via mb_string) : 21 utf-8 ; 22 iso-8859-1 ; iso-8859-9 ; iso-8859-15 ; 23 windows-1251 = CP1251 ; 24 */ 25 function load_charset ($charset = 'AUTO', $langue_site = 'AUTO') { 26 if ($charset == 'AUTO') 27 $charset = lire_meta('charset'); 28 if (is_array($GLOBALS['CHARSET'][$charset])) 29 return $charset; 30 31 if ($langue_site == 'AUTO') 32 $langue_site = lire_meta('langue_site'); 33 34 switch (strtolower($charset)) { 35 case 'utf-8': 36 $GLOBALS['CHARSET'][$charset] = array(); 37 return $charset; 38 39 // iso latin 1 40 case 'iso-8859-1': 41 case '': 42 $GLOBALS['CHARSET'][$charset] = array ( 43 128=>128, 129=>129, 130=>130, 131=>131, 132=>132, 133=>133, 134=>134, 135=>135, 44 136=>136, 137=>137, 138=>138, 139=>139, 140=>140, 141=>141, 142=>142, 143=>143, 45 144=>144, 145=>145, 146=>146, 147=>147, 148=>148, 149=>149, 150=>150, 151=>151, 46 152=>152, 153=>153, 154=>154, 155=>155, 156=>156, 157=>157, 158=>158, 159=>159, 47 160=>160, 161=>161, 162=>162, 163=>163, 164=>164, 165=>165, 166=>166, 167=>167, 48 168=>168, 169=>169, 170=>170, 171=>171, 172=>172, 173=>173, 174=>174, 175=>175, 49 176=>176, 177=>177, 178=>178, 179=>179, 180=>180, 181=>181, 182=>182, 183=>183, 50 184=>184, 185=>185, 186=>186, 187=>187, 188=>188, 189=>189, 190=>190, 191=>191, 51 192=>192, 193=>193, 194=>194, 195=>195, 196=>196, 197=>197, 198=>198, 199=>199, 52 200=>200, 201=>201, 202=>202, 203=>203, 204=>204, 205=>205, 206=>206, 207=>207, 53 208=>208, 209=>209, 210=>210, 211=>211, 212=>212, 213=>213, 214=>214, 215=>215, 54 216=>216, 217=>217, 218=>218, 219=>219, 220=>220, 221=>221, 222=>222, 223=>223, 55 224=>224, 225=>225, 226=>226, 227=>227, 228=>228, 229=>229, 230=>230, 231=>231, 56 232=>232, 233=>233, 234=>234, 235=>235, 236=>236, 237=>237, 238=>238, 239=>239, 57 240=>240, 241=>241, 242=>242, 243=>243, 244=>244, 245=>245, 246=>246, 247=>247, 58 248=>248, 249=>249, 250=>250, 251=>251, 252=>252, 253=>253, 254=>254, 255=>255 59 ); 60 return $charset; 61 62 63 // iso latin 9 - Turc <alexis@nds.k12.tr> 64 case 'iso-8859-9': 65 load_charset('iso-8859-1'); 66 $trans = $GLOBALS['CHARSET']['iso-8859-1']; 67 $trans[240]=287; //gbreve 68 $trans[208]=286; //Gbreve 69 $trans[221]=304; //Idot 70 $trans[253]=305; //inodot 71 $trans[254]=351; //scedil 72 $trans[222]=350; //Scedil 73 $GLOBALS['CHARSET'][$charset] = $trans; 74 return $charset; 75 76 77 // iso latin 15 - Gaetan Ryckeboer <gryckeboer@virtual-net.fr> 78 case 'iso-8859-15': 79 load_charset('iso-8859-1'); 80 $trans = $GLOBALS['CHARSET']['iso-8859-1']; 81 $trans[164]=8364; 82 $trans[166]=352; 83 $trans[168]=353; 84 $trans[180]=381; 85 $trans[184]=382; 86 $trans[188]=338; 87 $trans[189]=339; 88 $trans[190]=376; 89 $GLOBALS['CHARSET'][$charset] = $trans; 90 return $charset; 91 92 93 // cyrillic - ref. http://czyborra.com/charsets/cyrillic.html 94 case 'windows-1251': 95 case 'cp1251': 96 $GLOBALS['CHARSET'][$charset] = array ( 97 0x80=>0x0402, 0x81=>0x0403, 0x82=>0x201A, 0x83=>0x0453, 0x84=>0x201E, 98 0x85=>0x2026, 0x86=>0x2020, 0x87=>0x2021, 0x88=>0x20AC, 0x89=>0x2030, 99 0x8A=>0x0409, 0x8B=>0x2039, 0x8C=>0x040A, 0x8D=>0x040C, 0x8E=>0x040B, 100 0x8F=>0x040F, 0x90=>0x0452, 0x91=>0x2018, 0x92=>0x2019, 0x93=>0x201C, 101 0x94=>0x201D, 0x95=>0x2022, 0x96=>0x2013, 0x97=>0x2014, 0x99=>0x2122, 102 0x9A=>0x0459, 0x9B=>0x203A, 0x9C=>0x045A, 0x9D=>0x045C, 0x9E=>0x045B, 103 0x9F=>0x045F, 0xA0=>0x00A0, 0xA1=>0x040E, 0xA2=>0x045E, 0xA3=>0x0408, 104 0xA4=>0x00A4, 0xA5=>0x0490, 0xA6=>0x00A6, 0xA7=>0x00A7, 0xA8=>0x0401, 105 0xA9=>0x00A9, 0xAA=>0x0404, 0xAB=>0x00AB, 0xAC=>0x00AC, 0xAD=>0x00AD, 106 0xAE=>0x00AE, 0xAF=>0x0407, 0xB0=>0x00B0, 0xB1=>0x00B1, 0xB2=>0x0406, 107 0xB3=>0x0456, 0xB4=>0x0491, 0xB5=>0x00B5, 0xB6=>0x00B6, 0xB7=>0x00B7, 108 0xB8=>0x0451, 0xB9=>0x2116, 0xBA=>0x0454, 0xBB=>0x00BB, 0xBC=>0x0458, 109 0xBD=>0x0405, 0xBE=>0x0455, 0xBF=>0x0457, 0xC0=>0x0410, 0xC1=>0x0411, 110 0xC2=>0x0412, 0xC3=>0x0413, 0xC4=>0x0414, 0xC5=>0x0415, 0xC6=>0x0416, 111 0xC7=>0x0417, 0xC8=>0x0418, 0xC9=>0x0419, 0xCA=>0x041A, 0xCB=>0x041B, 112 0xCC=>0x041C, 0xCD=>0x041D, 0xCE=>0x041E, 0xCF=>0x041F, 0xD0=>0x0420, 113 0xD1=>0x0421, 0xD2=>0x0422, 0xD3=>0x0423, 0xD4=>0x0424, 0xD5=>0x0425, 114 0xD6=>0x0426, 0xD7=>0x0427, 0xD8=>0x0428, 0xD9=>0x0429, 0xDA=>0x042A, 115 0xDB=>0x042B, 0xDC=>0x042C, 0xDD=>0x042D, 0xDE=>0x042E, 0xDF=>0x042F, 116 0xE0=>0x0430, 0xE1=>0x0431, 0xE2=>0x0432, 0xE3=>0x0433, 0xE4=>0x0434, 117 0xE5=>0x0435, 0xE6=>0x0436, 0xE7=>0x0437, 0xE8=>0x0438, 0xE9=>0x0439, 118 0xEA=>0x043A, 0xEB=>0x043B, 0xEC=>0x043C, 0xED=>0x043D, 0xEE=>0x043E, 119 0xEF=>0x043F, 0xF0=>0x0440, 0xF1=>0x0441, 0xF2=>0x0442, 0xF3=>0x0443, 120 0xF4=>0x0444, 0xF5=>0x0445, 0xF6=>0x0446, 0xF7=>0x0447, 0xF8=>0x0448, 121 0xF9=>0x0449, 0xFA=>0x044A, 0xFB=>0x044B, 0xFC=>0x044C, 0xFD=>0x044D, 122 0xFE=>0x044E, 0xFF=>0x044F); // fin windows-1251 123 return $charset; 124 125 // arabic - george kandalaft - http://www.microsoft.com/typography/unicode/1256.htm 126 case 'windows-1256': 127 case 'cp1256': 128 $GLOBALS['CHARSET'][$charset] = array ( 129 0x80=>0x20AC, 0x81=>0x067E, 0x82=>0x201A, 0x83=>0x0192, 0x84=>0x201E, 130 0x85=>0x2026, 0x86=>0x2020, 0x87=>0x2021, 0x88=>0x02C6, 0x89=>0x2030, 131 0x8A=>0x0679, 0x8B=>0x2039, 0x8C=>0x0152, 0x8D=>0x0686, 0x8E=>0x0698, 132 0x8F=>0x0688, 0x90=>0x06AF, 0x91=>0x2018, 0x92=>0x2019, 0x93=>0x201C, 133 0x94=>0x201D, 0x95=>0x2022, 0x96=>0x2013, 0x97=>0x2014, 0x98=>0x06A9, 134 0x99=>0x2122, 0x9A=>0x0691, 0x9B=>0x203A, 0x9C=>0x0153, 0x9D=>0x200C, 135 0x9E=>0x200D, 0x9F=>0x06BA, 0xA0=>0x00A0, 0xA1=>0x060C, 0xA2=>0x00A2, 136 0xA3=>0x00A3, 0xA4=>0x00A4, 0xA5=>0x00A5, 0xA6=>0x00A6, 0xA7=>0x00A7, 137 0xA8=>0x00A8, 0xA9=>0x00A9, 0xAA=>0x06BE, 0xAB=>0x00AB, 0xAC=>0x00AC, 138 0xAD=>0x00AD, 0xAE=>0x00AE, 0xAF=>0x00AF, 0xB0=>0x00B0, 0xB1=>0x00B1, 139 0xB2=>0x00B2, 0xB3=>0x00B3, 0xB4=>0x00B4, 0xB5=>0x00B5, 0xB6=>0x00B6, 140 0xB7=>0x00B7, 0xB8=>0x00B8, 0xB9=>0x00B9, 0xBA=>0x061B, 0xBB=>0x00BB, 141 0xBC=>0x00BC, 0xBD=>0x00BD, 0xBE=>0x00BE, 0xBF=>0x061F, 0xC0=>0x06C1, 142 0xC1=>0x0621, 0xC2=>0x0622, 0xC3=>0x0623, 0xC4=>0x0624, 0xC5=>0x0625, 143 0xC6=>0x0626, 0xC7=>0x0627, 0xC8=>0x0628, 0xC9=>0x0629, 0xCA=>0x062A, 144 0xCB=>0x062B, 0xCC=>0x062C, 0xCD=>0x062D, 0xCE=>0x062E, 0xCF=>0x062F, 145 0xD0=>0x0630, 0xD1=>0x0631, 0xD2=>0x0632, 0xD3=>0x0633, 0xD4=>0x0634, 146 0xD5=>0x0635, 0xD6=>0x0636, 0xD7=>0x00D7, 0xD8=>0x0637, 0xD9=>0x0638, 147 0xDA=>0x0639, 0xDB=>0x063A, 0xDC=>0x0640, 0xDD=>0x0641, 0xDE=>0x0642, 148 0xDF=>0x0643, 0xE0=>0x00E0, 0xE1=>0x0644, 0xE2=>0x00E2, 0xE3=>0x0645, 149 0xE4=>0x0646, 0xE5=>0x0647, 0xE6=>0x0648, 0xE7=>0x00E7, 0xE8=>0x00E8, 150 0xE9=>0x00E9, 0xEA=>0x00EA, 0xEB=>0x00EB, 0xEC=>0x0649, 0xED=>0x064A, 151 0xEE=>0x00EE, 0xEF=>0x00EF, 0xF0=>0x064B, 0xF1=>0x064C, 0xF2=>0x064D, 152 0xF3=>0x064E, 0xF4=>0x00F4, 0xF5=>0x064F, 0xF6=>0x0650, 0xF7=>0x00F7, 153 0xF8=>0x0651, 0xF9=>0x00F9, 0xFA=>0x0652, 0xFB=>0x00FB, 0xFC=>0x00FC, 154 0xFD=>0x200E, 0xFE=>0x200F, 0xFF=>0x06D2); // fin windows-1256 155 return $charset; 156 // arabic iso-8859-6 - http://czyborra.com/charsets/iso8859.html#ISO-8859-6 157 case 'iso-8859-6': 158 load_charset('iso-8859-1'); 159 $trans = $GLOBALS['CHARSET']['iso-8859-1']; 160 $mod = Array( 161 0xA0=>0x00A0, 0xA4=>0x00A4, 0xAC=>0x060C, 0xAD=>0x00AD, 0xBB=>0x061B, 162 0xBF=>0x061F, 0xC1=>0x0621, 0xC2=>0x0622, 0xC3=>0x0623, 0xC4=>0x0624, 163 0xC5=>0x0625, 0xC6=>0x0626, 0xC7=>0x0627, 0xC8=>0x0628, 0xC9=>0x0629, 164 0xCA=>0x062A, 0xCB=>0x062B, 0xCC=>0x062C, 0xCD=>0x062D, 0xCE=>0x062E, 165 0xCF=>0x062F, 0xD0=>0x0630, 0xD1=>0x0631, 0xD2=>0x0632, 0xD3=>0x0633, 166 0xD4=>0x0634, 0xD5=>0x0635, 0xD6=>0x0636, 0xD7=>0x0637, 0xD8=>0x0638, 167 0xD9=>0x0639, 0xDA=>0x063A, 0xE0=>0x0640, 0xE1=>0x0641, 0xE2=>0x0642, 168 0xE3=>0x0643, 0xE4=>0x0644, 0xE5=>0x0645, 0xE6=>0x0646, 0xE7=>0x0647, 169 0xE8=>0x0648, 0xE9=>0x0649, 0xEA=>0x064A, 0xEB=>0x064B, 0xEC=>0x064C, 170 0xED=>0x064D, 0xEE=>0x064E, 0xEF=>0x064F, 0xF0=>0x0650, 0xF1=>0x0651, 171 0xF2=>0x0652 172 ); 173 foreach ($mod as $num=>$val) 174 $trans[$num]=$val; 175 $GLOBALS['CHARSET'][$charset] = $trans; 176 return $charset; 177 178 // ------------------------------------------------------------------ 179 180 // cas particulier pour les entites html (a completer eventuellement) 181 case 'html': 182 $GLOBALS['CHARSET'][$charset] = array ( 183 'ldquo'=>'“', 'rdquo'=>'”', 184 'cent'=>'¢', 'pound'=>'£', 'curren'=>'¤', 'yen'=>'¥', 'brvbar'=>'¦', 185 'sect'=>'§', 'uml'=>'¨', 'ordf'=>'ª', 'laquo'=>'«', 'not'=>'¬', 186 'shy'=>'­', 'macr'=>'¯', 'deg'=>'°', 'plusmn'=>'±', 'sup2'=>'²', 187 'sup3'=>'³', 'acute'=>'´', 'micro'=>'µ', 'para'=>'¶', 'middot'=>'·', 188 'cedil'=>'¸', 'sup1'=>'¹', 'ordm'=>'º', 'raquo'=>'»', 'iquest'=>'¿', 189 'Agrave'=>'À', 'Aacute'=>'Á', 'Acirc'=>'Â', 'Atilde'=>'Ã', 'Auml'=>'Ä', 190 'Aring'=>'Å', 'AElig'=>'Æ', 'Ccedil'=>'Ç', 'Egrave'=>'È', 'Eacute'=>'É', 191 'Ecirc'=>'Ê', 'Euml'=>'Ë', 'Igrave'=>'Ì', 'Iacute'=>'Í', 'Icirc'=>'Î', 192 'Iuml'=>'Ï', 'ETH'=>'Ð', 'Ntilde'=>'Ñ', 'Ograve'=>'Ò', 'Oacute'=>'Ó', 193 'Ocirc'=>'Ô', 'Otilde'=>'Õ', 'Ouml'=>'Ö', 'times'=>'×', 'Oslash'=>'Ø', 194 'Ugrave'=>'Ù', 'Uacute'=>'Ú', 'Ucirc'=>'Û', 'Uuml'=>'Ü', 'Yacute'=>'Ý', 195 'THORN'=>'Þ', 'szlig'=>'ß', 'agrave'=>'à', 'aacute'=>'á', 'acirc'=>'â', 196 'atilde'=>'ã', 'auml'=>'ä', 'aring'=>'å', 'aelig'=>'æ', 'ccedil'=>'ç', 197 'egrave'=>'è', 'eacute'=>'é', 'ecirc'=>'ê', 'euml'=>'ë', 'igrave'=>'ì', 198 'iacute'=>'í', 'icirc'=>'î', 'iuml'=>'ï', 'eth'=>'ð', 'ntilde'=>'ñ', 199 'ograve'=>'ò', 'oacute'=>'ó', 'ocirc'=>'ô', 'otilde'=>'õ', 'ouml'=>'ö', 200 'divide'=>'÷', 'oslash'=>'ø', 'ugrave'=>'ù', 'uacute'=>'ú', 201 'ucirc'=>'û', 'uuml'=>'ü', 'yacute'=>'ý', 'thorn'=>'þ', 202 'nbsp' => " ", 'copy' => "(c)", 'reg' => "(r)", 'frac14' => "1/4", 203 'frac12' => "1/2", 'frac34' => "3/4", 'amp' => '&', 'quot' => '"', 204 'apos' => "'", 'lt' => '<', 'gt' => '>', 205 'mdash' => '—', 'ndash' => '–' 206 ); 207 return $charset; 208 209 case 'mathml': 210 $GLOBALS['CHARSET'][$charset] = array ( 211 'ac' => '', 212 'acd' => '', 213 'acE' => '&E#290;', 214 'acute' => '́', 215 'Afr' => '', 216 'afr' => '', 217 'aleph' => 'ℵ', 218 'alpha' => 'α', 219 'amalg' => '', 220 'amp' => '&', 221 'And' => '∧', 222 'and' => '∧', 223 'andand' => '', 224 'andd' => '', 225 'andslope' => '', 226 'andv' => '', 227 'ang' => '∠', 228 'ange' => '', 229 'angle' => '∠', 230 'angmsd' => '∡', 231 'angmsdaa' => '', 232 'angmsdab' => '', 233 'angmsdac' => '', 234 'angmsdad' => '', 235 'angmsdae' => '', 236 'angmsdaf' => '', 237 'angmsdag' => '', 238 'angmsdah' => '', 239 'angrt' => '∟', 240 'angrtvb' => '', 241 'angrtvbd' => '', 242 'angsph' => '∢', 243 'angst' => 'Å', 244 'angzarr' => '', 245 'Aopf' => '', 246 'ap' => '≈', 247 'apacir' => '', 248 'apE' => '', 249 'ape' => '≊', 250 'apid' => '≋', 251 'apos' => ''', 252 'approx' => '≈', 253 'approxeq' => '≊', 254 'Ascr' => '', 255 'ascr' => '', 256 'ast' => '∗', 257 'asymp' => '≍', 258 'awconint' => '∳', 259 'awint' => '', 260 'backcong' => '≌', 261 'backepsilon' => '', 262 'backprime' => '‵', 263 'backsim' => '∽', 264 'backsimeq' => '⋍', 265 'Backslash' => '∖', 266 'Barv' => '', 267 'barvee' => '⊽', 268 'Barwed' => '⌆', 269 'barwed' => '⊼', 270 'barwedge' => '⊼', 271 'bbrk' => '', 272 'bbrktbrk' => '', 273 'bcong' => '≌', 274 'becaus' => '∵', 275 'Because' => '∵', 276 'because' => '∵', 277 'bemptyv' => '', 278 'benzen' => '', 279 'benzena' => '', 280 'benzenb' => '', 281 'benzenc' => '', 282 'benzend' => '', 283 'benzene' => '', 284 'benzenf' => '', 285 'benzeng' => '', 286 'benzenh' => '', 287 'benzeni' => '', 288 'benzenj' => '', 289 'benzenk' => '', 290 'benzenl' => '', 291 'benzenm' => '', 292 'benzenn' => '', 293 'benzeno' => '', 294 'benzenp' => '', 295 'benzenq' => '', 296 'benzenr' => '', 297 'bepsi' => '', 298 'bernou' => 'ℬ', 299 'beta' => 'β', 300 'beth' => 'ℶ', 301 'between' => '≬', 302 'Bfr' => '', 303 'bfr' => '', 304 'bigcap' => '⋂', 305 'bigcirc' => '○', 306 'bigcup' => '⋃', 307 'bigodot' => '⊙', 308 'bigoplus' => '⊕', 309 'bigotimes' => '⊗', 310 'bigsqcup' => '⊔', 311 'bigstar' => '★', 312 'bigtriangledown' => '▽', 313 'bigtriangleup' => '△', 314 'biguplus' => '⊎', 315 'bigvee' => '⋁', 316 'bigwedge' => '⋀', 317 'bkarow' => '', 318 'blacklozenge' => '', 319 'blacksquare' => '■', 320 'blacktriangle' => '▴', 321 'blacktriangledown' => '▾', 322 'blacktriangleleft' => '◂', 323 'blacktriangleright' => '▸', 324 'blank' => '', 325 'blk12' => '▒', 326 'blk14' => '░', 327 'blk34' => '▓', 328 'block' => '█', 329 'bne' => '', 330 'bnequiv' => '', 331 'bNot' => '', 332 'bnot' => '⌐', 333 'Bopf' => '', 334 'bot' => '⊥', 335 'bottom' => '⊥', 336 'bowtie' => '⋈', 337 'boxbox' => '', 338 'boxminus' => '⊟', 339 'boxplus' => '⊞', 340 'boxtimes' => '⊠', 341 'bprime' => '‵', 342 'Breve' => '̆', 343 'breve' => '̆', 344 'brvbar' => '¦', 345 'Bscr' => '', 346 'bscr' => '', 347 'bsemi' => '', 348 'bsim' => '∽', 349 'bsime' => '⋍', 350 'bsol' => '\', 351 'bsolb' => '', 352 'bsolhsub' => '', 353 'bull' => '•', 354 'bullet' => '•', 355 'bump' => '≎', 356 'bumpe' => '≏', 357 'Bumpeq' => '≎', 358 'bumpeq' => '≏', 359 'Cap' => '⋒', 360 'cap' => '∩', 361 'capand' => '', 362 'capbrcup' => '', 363 'capcap' => '', 364 'capcup' => '', 365 'capdot' => '', 366 'caps' => '', 367 'caret' => '‸', 368 'caron' => '̌', 369 'ccaps' => '', 370 'Cconint' => '∰', 371 'ccups' => '', 372 'ccupssm' => '', 373 'cdot' => '⋅', 374 'cedil' => '̧', 375 'Cedilla' => '̧', 376 'cemptyv' => '', 377 'cent' => '¢', 378 'CenterDot' => '·', 379 'centerdot' => '·', 380 'Cfr' => '', 381 'cfr' => '', 382 'check' => '✓', 383 'checkmark' => '✓', 384 'chi' => 'χ', 385 'cir' => '∘', 386 'circ' => '∘', 387 'circeq' => '≗', 388 'circle' => '', 389 'circlearrowleft' => '↺', 390 'circlearrowright' => '↻', 391 'circledast' => '⊛', 392 'circledcirc' => '⊚', 393 'circleddash' => '⊝', 394 'CircleDot' => '⊙', 395 'circledR' => '¯', 396 'circledS' => '', 397 'circlef' => '●', 398 'circlefb' => '◒', 399 'circlefl' => '◐', 400 'circlefr' => '◑', 401 'circleft' => '◓', 402 'CircleMinus' => '⊖', 403 'CirclePlus' => '⊕', 404 'CircleTimes' => '⊗', 405 'cirE' => '', 406 'cire' => '≗', 407 'cirfnint' => '', 408 'cirmid' => '', 409 'cirscir' => '', 410 'ClockwiseContourIntegral' => '∲', 411 'CloseCurlyDoubleQuote' => '”', 412 'CloseCurlyQuote' => '’', 413 'clubs' => '♣', 414 'clubsuit' => '♣', 415 'Colon' => '∷', 416 'colon' => ':', 417 'Colone' => '', 418 'colone' => '≔', 419 'coloneq' => '≔', 420 'comma' => ',', 421 'commat' => '@', 422 'comp' => '∁', 423 'compfn' => '∘', 424 'complement' => '∁', 425 'cong' => '≅', 426 'congdot' => '', 427 'Congruent' => '≡', 428 'Conint' => '∯', 429 'conint' => '∮', 430 'ContourIntegral' => '∮', 431 'Copf' => 'ℂ', 432 'coprod' => '∐', 433 'Coproduct' => '∐', 434 'copy' => '©', 435 'copysr' => '℗', 436 'CounterClockwiseContourIntegral' => '∳', 437 'cross' => '☒', 438 'Cscr' => '', 439 'cscr' => '', 440 'csub' => '', 441 'csube' => '', 442 'csup' => '', 443 'csupe' => '', 444 'ctdot' => '⋯', 445 'cudarrl' => '', 446 'cudarrr' => '', 447 'cuepr' => '⋞', 448 'cuesc' => '⋟', 449 'cularr' => '↶', 450 'cularrp' => '', 451 'Cup' => '⌣', 452 'cup' => '∪', 453 'cupbrcap' => '', 454 'CupCap' => '≍', 455 'cupcap' => '', 456 'cupcup' => '', 457 'cupdot' => '⊍', 458 'cupor' => '', 459 'cups' => '', 460 'curarr' => '↷', 461 'curarrm' => '', 462 'curlyeqprec' => '⋞', 463 'curlyeqsucc' => '⋟', 464 'curlyvee' => '⋎', 465 'curlywedge' => '⋏', 466 'curren' => '¤', 467 'curvearrowleft' => '↶', 468 'curvearrowright' => '↷', 469 'cuvee' => '⋎', 470 'cuwed' => '⋏', 471 'cwconint' => '∲', 472 'cwint' => '∱', 473 'cylcty' => '⌭', 474 'Dagger' => '‡', 475 'dagger' => '†', 476 'daleth' => 'ℸ', 477 'Darr' => '↡', 478 'dArr' => '⇓', 479 'darr' => '↓', 480 'dash' => '‐', 481 'Dashv' => '', 482 'dashv' => '⊣', 483 'dbkarow' => '', 484 'dblac' => '̋', 485 'ddagger' => '‡', 486 'ddarr' => '⇊', 487 'DDotrahd' => '', 488 'ddotseq' => '', 489 'deg' => '°', 490 'Del' => '∇', 491 'Delta' => 'Δ', 492 'delta' => 'δ', 493 'demptyv' => '', 494 'dfisht' => '', 495 'Dfr' => '', 496 'dfr' => '', 497 'dHar' => '', 498 'dharl' => '⇃', 499 'dharr' => '⇂', 500 'DiacriticalAcute' => '́', 501 'DiacriticalDot' => '̇', 502 'DiacriticalDoubleAcute' => '̋', 503 'DiacriticalGrave' => '̀', 504 'DiacriticalLeftArrow' => '⃖', 505 'DiacriticalLeftRightArrow' => '⃡', 506 'DiacriticalLeftRightVector' => '', 507 'DiacriticalLeftVector' => '⃐', 508 'DiacriticalRightArrow' => '⃗', 509 'DiacriticalRightVector' => '⃑', 510 'DiacriticalTilde' => '̃', 511 'diam' => '⋄', 512 'diamond' => '⋄', 513 'diamondf' => '', 514 'diamondsuit' => '♢', 515 'diamonfb' => '', 516 'diamonfl' => '', 517 'diamonfr' => '', 518 'diamonft' => '', 519 'diams' => '♢', 520 'die' => '̈', 521 'digamma' => 'Ϝ', 522 'disin' => '', 523 'div' => '÷', 524 'divide' => '÷', 525 'divideontimes' => '⋇', 526 'divonx' => '⋇', 527 'dlcorn' => '⌞', 528 'dlcrop' => '⌍', 529 'dollar' => '$', 530 'Dopf' => '', 531 'Dot' => '̈', 532 'dot' => '̇', 533 'DotDot' => '⃜', 534 'doteq' => '≐', 535 'doteqdot' => '≑', 536 'DotEqual' => '≐', 537 'dotminus' => '∸', 538 'dotplus' => '∔', 539 'dotsquare' => '⊡', 540 'doublebarwedge' => '⌆', 541 'DoubleContourIntegral' => '∯', 542 'DoubleDot' => '̈', 543 'DoubleDownArrow' => '⇓', 544 'DoubleLeftArrow' => '⇐', 545 'DoubleLeftRightArrow' => '⇔', 546 'DoubleLongLeftArrow' => '', 547 'DoubleLongLeftRightArrow' => '', 548 'DoubleLongRightArrow' => '', 549 'DoubleRightArrow' => '⇒', 550 'DoubleRightTee' => '⊨', 551 'DoubleUpArrow' => '⇑', 552 'DoubleUpDownArrow' => '⇕', 553 'DoubleVerticalBar' => '∥', 554 'DownArrow' => '↓', 555 'Downarrow' => '⇓', 556 'downarrow' => '↓', 557 'DownArrowUpArrow' => '', 558 'downdownarrows' => '⇊', 559 'downharpoonleft' => '⇃', 560 'downharpoonright' => '⇂', 561 'DownLeftVector' => '↽', 562 'DownRightVector' => '⇁', 563 'DownTee' => '⊤', 564 'drbkarow' => '', 565 'drcorn' => '⌟', 566 'drcrop' => '⌌', 567 'Dscr' => '', 568 'dscr' => '', 569 'dsol' => '', 570 'dtdot' => '⋱', 571 'dtri' => '▿', 572 'dtrif' => '▾', 573 'duarr' => '', 574 'duhar' => '', 575 'dwangle' => '', 576 'dzigrarr' => '⇝', 577 'easter' => '≛', 578 'ecir' => '≖', 579 'ecolon' => '≕', 580 'eDDot' => '', 581 'eDot' => '≑', 582 'efDot' => '≒', 583 'Efr' => '', 584 'efr' => '', 585 'eg' => '', 586 'egs' => '⋝', 587 'egsdot' => '', 588 'el' => '', 589 'Element' => '∈', 590 'elinters' => '', 591 'ell' => 'ℓ', 592 'els' => '⋜', 593 'elsdot' => '', 594 'empty' => '', 595 'emptyset' => '', 596 'emptyv' => '∅', 597 'emsp' => ' ', 598 'emsp13' => ' ', 599 'emsp14' => ' ', 600 'ensp' => ' ', 601 'Eopf' => '', 602 'epar' => '⋕', 603 'eparsl' => '', 604 'eplus' => '', 605 'epsi' => '∊', 606 'epsiv' => 'ε', 607 'eqcirc' => '≖', 608 'eqcolon' => '≕', 609 'eqsim' => '≂', 610 'eqslantgtr' => '⋝', 611 'eqslantless' => '⋜', 612 'equals' => '=', 613 'EqualTilde' => '≂', 614 'equest' => '≟', 615 'Equilibrium' => '⇌', 616 'equiv' => '≡', 617 'equivDD' => '', 618 'eqvparsl' => '', 619 'erarr' => '', 620 'erDot' => '≓', 621 'Escr' => '', 622 'escr' => '', 623 'esdot' => '≐', 624 'Esim' => '', 625 'esim' => '≂', 626 'eta' => 'η', 627 'excl' => '!', 628 'exist' => '∃', 629 'Exists' => '∃', 630 'fallingdotseq' => '≒', 631 'female' => '♀', 632 'ffilig' => 'ffi', 633 'fflig' => 'ff', 634 'ffllig' => 'ffl', 635 'Ffr' => '', 636 'ffr' => '', 637 'filig' => 'fi', 638 'fjlig' => '', 639 'flat' => '♭', 640 'fllig' => 'fl', 641 'fltns' => '', 642 'Fopf' => '', 643 'ForAll' => '∀', 644 'forall' => '∀', 645 'fork' => '⋔', 646 'forkv' => '', 647 'fpartint' => '', 648 'frac12' => '½', 649 'frac13' => '⅓', 650 'frac14' => '¼', 651 'frac15' => '⅕', 652 'frac16' => '⅙', 653 'frac18' => '⅛', 654 'frac23' => '≔', 655 'frac25' => '⅖', 656 'frac34' => '¾', 657 'frac35' => '⅗', 658 'frac38' => '⅜', 659 'frac45' => '⅘', 660 'frac56' => '⅚', 661 'frac58' => '⅝', 662 'frac78' => '⅞', 663 'frown' => '⌢', 664 'Fscr' => '', 665 'fscr' => '', 666 'Gamma' => 'Γ', 667 'gamma' => 'γ', 668 'Gammad' => 'Ϝ', 669 'gammad' => 'Ϝ', 670 'gap' => '≳', 671 'gE' => '≧', 672 'ge' => '≥', 673 'gEl' => '⋛', 674 'gel' => '⋛', 675 'geq' => '≥', 676 'geqq' => '≧', 677 'geqslant' => '', 678 'ges' => '', 679 'gescc' => '', 680 'gesdot' => '', 681 'gesdoto' => '', 682 'gesdotol' => '', 683 'gesl' => '', 684 'gesles' => '', 685 'Gfr' => '', 686 'gfr' => '', 687 'Gg' => '⋙', 688 'gg' => '≫', 689 'ggg' => '⋙', 690 'gimel' => 'ℷ', 691 'gl' => '≷', 692 'gla' => '', 693 'glE' => '', 694 'glj' => '', 695 'gnap' => '', 696 'gnapprox' => '', 697 'gnE' => '≩', 698 'gne' => '≩', 699 'gneq' => '≩', 700 'gneqq' => '≩', 701 'gnsim' => '⋧', 702 'Gopf' => '', 703 'grave' => '̀', 704 'GreaterEqual' => '≥', 705 'GreaterEqualLess' => '⋛', 706 'GreaterFullEqual' => '≧', 707 'GreaterLess' => '≷', 708 'GreaterSlantEqual' => '', 709 'GreaterTilde' => '≳', 710 'Gscr' => '', 711 'gscr' => '', 712 'gsim' => '≳', 713 'gsime' => '', 714 'gsiml' => '', 715 'Gt' => '≫', 716 'gt' => '>', 717 'gtcc' => '', 718 'gtcir' => '', 719 'gtdot' => '⋗', 720 'gtlPar' => '', 721 'gtquest' => '', 722 'gtrapprox' => '≳', 723 'gtrarr' => '', 724 'gtrdot' => '⋗', 725 'gtreqless' => '⋛', 726 'gtreqqless' => '⋛', 727 'gtrless' => '≷', 728 'gtrsim' => '≳', 729 'gvertneqq' => '', 730 'gvnE' => '', 731 'Hacek' => '̌', 732 'hairsp' => ' ', 733 'half' => '½', 734 'hamilt' => 'ℋ', 735 'hArr' => '⇔', 736 'harr' => '↔', 737 'harrcir' => '', 738 'harrw' => '↭', 739 'Hat' => '̂', 740 'hbar' => '', 741 'hbenzen' => '', 742 'hbenzena' => '', 743 'hbenzenb' => '', 744 'hbenzenc' => '', 745 'hbenzend' => '', 746 'hbenzene' => '', 747 'hbenzenf' => '', 748 'hbenzeng' => '', 749 'hbenzenh' => '', 750 'hbenzeni' => '', 751 'hbenzenj' => '', 752 'hbenzenk' => '', 753 'hbenzenl' => '', 754 'hbenzenm' => '', 755 'hbenzenn' => '', 756 'hbenzeno' => '', 757 'hbenzenp' => '', 758 'hbenzenq' => '', 759 'hbenzenr' => '', 760 'hearts' => '♡', 761 'heartsuit' => '♡', 762 'hellip' => '…', 763 'hercon' => '⊹', 764 'Hfr' => '', 765 'hfr' => '', 766 'hksearow' => '', 767 'hkswarow' => '', 768 'hoarr' => '', 769 'homtht' => '∻', 770 'hookleftarrow' => '↩', 771 'hookrightarrow' => '↪', 772 'Hopf' => '', 773 'horbar' => '―', 774 'Hscr' => '', 775 'hscr' => '', 776 'hslash' => 'ℏ', 777 'HumpDownHump' => '≎', 778 'HumpEqual' => '≏', 779 'hybull' => '⁃', 780 'hyphen' => '', 781 'iexcl' => '¡', 782 'iff' => '', 783 'Ifr' => '', 784 'ifr' => '', 785 'iiiint' => '', 786 'iiint' => '∭', 787 'iinfin' => '', 788 'iiota' => '℩', 789 'Im' => 'ℑ', 790 'image' => 'ℑ', 791 'imath' => 'ı', 792 'imof' => '⊷', 793 'imped' => '', 794 'Implies' => '⇒', 795 'in' => '∊', 796 'incare' => '℅', 797 'infin' => '∞', 798 'infintie' => '', 799 'Int' => '∬', 800 'int' => '∫', 801 'intcal' => '⊺', 802 'Integral' => '∫', 803 'intercal' => '⊺', 804 'Intersection' => '⋂', 805 'intlarhk' => '', 806 'intprod' => '', 807 'Iopf' => '', 808 'iota' => 'ι', 809 'iprod' => '', 810 'iquest' => '¿', 811 'Iscr' => '', 812 'iscr' => '', 813 'isin' => '∊', 814 'isindot' => '', 815 'isinE' => '', 816 'isins' => '', 817 'isinsv' => '', 818 'isinv' => '∈', 819 'Jfr' => '', 820 'jfr' => '', 821 'jmath' => '', 822 'Jopf' => '', 823 'Jscr' => '', 824 'jscr' => '', 825 'kappa' => 'κ', 826 'kappav' => 'ϰ', 827 'Kfr' => '', 828 'kfr' => '', 829 'Kopf' => '', 830 'Kscr' => '', 831 'kscr' => '', 832 'lAarr' => '⇚', 833 'laemptyv' => '', 834 'lagran' => 'ℒ', 835 'Lambda' => 'Λ', 836 'lambda' => 'λ', 837 'Lang' => '《', 838 'lang' => '〈', 839 'langd' => '', 840 'langle' => '〈', 841 'lap' => '≲', 842 'laquo' => '«', 843 'Larr' => '↞', 844 'lArr' => '⇐', 845 'larr' => '←', 846 'larrbfs' => '', 847 'larrfs' => '', 848 'larrhk' => '↩', 849 'larrlp' => '↫', 850 'larrpl' => '', 851 'larrsim' => '', 852 'larrtl' => '↢', 853 'lat' => '', 854 'lAtail' => '', 855 'latail' => '', 856 'late' => '', 857 'lates' => '', 858 'lBarr' => '', 859 'lbarr' => '', 860 'lbbrk' => '〔', 861 'lbrace' => '{', 862 'lbrack' => '[', 863 'lbrke' => '', 864 'lbrksld' => '', 865 'lbrkslu' => '', 866 'lceil' => '⌈', 867 'lcub' => '{', 868 'ldca' => '', 869 'ldquo' => '“', 870 'ldquor' => '„', 871 'ldrdhar' => '', 872 'ldrushar' => '', 873 'ldsh' => '↲', 874 'lE' => '≦', 875 'le' => '≤', 876 'LeftAngleBracket' => '〈', 877 'LeftArrow' => '←', 878 'Leftarrow' => '⇐', 879 'leftarrow' => '←', 880 'LeftArrowRightArrow' => '⇆', 881 'leftarrowtail' => '↢', 882 'LeftCeiling' => '⌈', 883 'LeftDownVector' => '⇃', 884 'LeftFloor' => '⌊', 885 'leftharpoondown' => '↽', 886 'leftharpoonup' => '↼', 887 'leftleftarrows' => '⇇', 888 'LeftRightArrow' => '↔', 889 'Leftrightarrow' => '⇔', 890 'leftrightarrow' => '↔', 891 'leftrightarrows' => '⇆', 892 'leftrightharpoons' => '⇋', 893 'leftrightsquigarrow' => '↭', 894 'LeftTee' => '⊣', 895 'leftthreetimes' => '⋋', 896 'LeftTriangle' => '⊲', 897 'LeftTriangleEqual' => '⊴', 898 'LeftUpVector' => '↿', 899 'LeftVector' => '↼', 900 'lEg' => '⋚', 901 'leg' => '⋚', 902 'leq' => '≤', 903 'leqq' => '≦', 904 'leqslant' => '', 905 'les' => '', 906 'lescc' => '', 907 'lesdot' => '', 908 'lesdoto' => '', 909 'lesdotor' => '', 910 'lesg' => '', 911 'lesges' => '', 912 'lessapprox' => '≲', 913 'lessdot' => '⋖', 914 'lesseqgtr' => '⋚', 915 'lesseqqgtr' => '⋚', 916 'LessEqualGreater' => '⋚', 917 'LessFullEqual' => '≦', 918 'LessGreater' => '≶', 919 'lessgtr' => '≶', 920 'lesssim' => '≲', 921 'LessSlantEqual' => '', 922 'LessTilde' => '≲', 923 'lfisht' => '', 924 'lfloor' => '⌊', 925 'Lfr' => '', 926 'lfr' => '', 927 'lg' => '≶', 928 'lgE' => '', 929 'lHar' => '', 930 'lhard' => '↽', 931 'lharu' => '↼', 932 'lharul' => '', 933 'lhblk' => '▄', 934 'Ll' => '⋘', 935 'll' => '≪', 936 'llarr' => '⇇', 937 'llcorner' => '⌞', 938 'Lleftarrow' => '⇚', 939 'llhard' => '', 940 'lltri' => '', 941 'lmoust' => '', 942 'lmoustache' => '', 943 'lnap' => '', 944 'lnapprox' => '', 945 'lnE' => '≨', 946 'lne' => '≨', 947 'lneq' => '≨', 948 'lneqq' => '≨', 949 'lnsim' => '⋦', 950 'loang' => '〘', 951 'loarr' => '', 952 'lobrk' => '〚', 953 'LongLeftArrow' => '', 954 'Longleftarrow' => '', 955 'longleftarrow' => '', 956 'LongLeftRightArrow' => '', 957 'Longleftrightarrow' => '', 958 'longleftrightarrow' => '', 959 'longmapsto' => '', 960 'LongRightArrow' => '', 961 'Longrightarrow' => '', 962 'longrightarrow' => '', 963 'looparrowleft' => '↫', 964 'looparrowright' => '↬', 965 'lopar' => '', 966 'Lopf' => '', 967 'loplus' => '', 968 'lotimes' => '', 969 'lowast' => '∗', 970 'lowbar' => '_', 971 'LowerLeftArrow' => '↙', 972 'LowerRightArrow' => '↘', 973 'loz' => '◊', 974 'lozenge' => '◊', 975 'lozf' => '', 976 'lpar' => '(', 977 'lparlt' => '', 978 'lrarr' => '⇆', 979 'lrcorner' => '⌟', 980 'lrhar' => '⇋', 981 'lrhard' => '', 982 'lrtri' => '', 983 'Lscr' => '', 984 'lscr' => '', 985 'Lsh' => '↰', 986 'lsh' => '↰', 987 'lsim' => '≲', 988 'lsime' => '', 989 'lsimg' => '', 990 'lsqb' => '[', 991 'lsquo' => '‘', 992 'lsquor' => '‚', 993 'Lt' => '≪', 994 'lt' => '<', 995 'ltcc' => '', 996 'ltcir' => '', 997 'ltdot' => '⋖', 998 'lthree' => '⋋', 999 'ltimes' => '⋉', 1000 'ltlarr' => '', 1001 'ltquest' => '', 1002 'ltri' => '◃', 1003 'ltrie' => '⊴', 1004 'ltrif' => '◂', 1005 'ltrPar' => '', 1006 'lurdshar' => '', 1007 'luruhar' => '', 1008 'lvertneqq' => '', 1009 'lvnE' => '', 1010 'macr' => '̄', 1011 'male' => '♂', 1012 'malt' => '✠', 1013 'maltese' => '✠', 1014 'Map' => '', 1015 'map' => '↦', 1016 'mapsto' => '↦', 1017 'marker' => '', 1018 'mcomma' => '', 1019 'mdash' => '—', 1020 'mDDot' => '∺', 1021 'measuredangle' => '∡', 1022 'Mfr' => '', 1023 'mfr' => '', 1024 'mho' => '℧', 1025 'micro' => 'µ', 1026 'mid' => '∣', 1027 'midast' => '∗', 1028 'midcir' => '', 1029 'middot' => '·', 1030 'minus' => '−', 1031 'minusb' => '⊟', 1032 'minusd' => '∸', 1033 'minusdu' => '', 1034 'MinusPlus' => '∓', 1035 'mlcp' => '', 1036 'mldr' => '', 1037 'mnplus' => '∓', 1038 'models' => '⊧', 1039 'Mopf' => '', 1040 'mp' => '∓', 1041 'Mscr' => '', 1042 'mscr' => '', 1043 'mstpos' => '∾', 1044 'mu' => 'μ', 1045 'multimap' => '⊸', 1046 'mumap' => '⊸', 1047 'nabla' => '∇', 1048 'nang' => '', 1049 'nap' => '≉', 1050 'napE' => '', 1051 'napid' => '', 1052 'napprox' => '≉', 1053 'natur' => '♮', 1054 'natural' => '♮', 1055 'nbsp' => ' ', 1056 'ncap' => '', 1057 'ncong' => '≇', 1058 'ncongdot' => '', 1059 'ncup' => '', 1060 'ndash' => '–', 1061 'ne' => '≠', 1062 'nearhk' => '', 1063 'neArr' => '⇗', 1064 'nearr' => '↗', 1065 'nearrow' => '↗', 1066 'nedot' => '', 1067 'nequiv' => '≢', 1068 'nesear' => '', 1069 'NestedGreaterGreater' => '≫', 1070 'NestedLessLess' => '≪', 1071 'nexist' => '∄', 1072 'nexists' => '∄', 1073 'Nfr' => '', 1074 'nfr' => '', 1075 'ngE' => '≱', 1076 'nge' => '', 1077 'ngeq' => '', 1078 'ngeqq' => '≱', 1079 'ngeqslant' => '≱', 1080 'nges' => '≱', 1081 'nGg' => '', 1082 'ngsim' => '≵', 1083 'nGt' => '', 1084 'ngt' => '≯', 1085 'ngtr' => '≯', 1086 'nGtv' => '', 1087 'nhArr' => '⇎', 1088 'nharr' => '↮', 1089 'nhpar' => '', 1090 'ni' => '∍', 1091 'nis' => '', 1092 'nisd' => '', 1093 'niv' => '∋', 1094 'nlArr' => '⇍', 1095 'nlarr' => '↚', 1096 'nldr' => '‥', 1097 'nlE' => '≰', 1098 'nle' => '', 1099 'nLeftarrow' => '⇍', 1100 'nleftarrow' => '↚', 1101 'nLeftrightarrow' => '⇎', 1102 'nleftrightarrow' => '↮', 1103 'nleq' => '', 1104 'nleqq' => '≰', 1105 'nleqslant' => '≰', 1106 'nles' => '≰', 1107 'nless' => '≮', 1108 'nLl' => '', 1109 'nlsim' => '≴', 1110 'nLt' => '', 1111 'nlt' => '≮', 1112 'nltri' => '⋪', 1113 'nltrie' => '⋬', 1114 'nLtv' => '', 1115 'nmid' => '∤', 1116 'Nopf' => 'ℕ', 1117 'Not' => '', 1118 'not' => '¬', 1119 'NotCongruent' => '≢', 1120 'NotDoubleVerticalBar' => '∦', 1121 'NotElement' => '∉', 1122 'NotEqual' => '≠', 1123 'NotExists' => '∄', 1124 'NotGreater' => '≯', 1125 'NotGreaterEqual' => '', 1126 'NotGreaterFullEqual' => '≰', 1127 'NotGreaterGreater' => '', 1128 'NotGreaterLess' => '≹', 1129 'NotGreaterSlantEqual' => '≱', 1130 'NotGreaterTilde' => '≵', 1131 'notin' => '∉', 1132 'notindot' => '', 1133 'notinE' => '', 1134 'notinva' => '', 1135 'notinvb' => '', 1136 'notinvc' => '', 1137 'NotLeftTriangle' => '⋪', 1138 'NotLeftTriangleEqual' => '⋬', 1139 'NotLess' => '≮', 1140 'NotLessEqual' => '', 1141 'NotLessFullEqual' => '≰', 1142 'NotLessGreater' => '≸', 1143 'NotLessLess' => '', 1144 'NotLessSlantEqual' => '≰', 1145 'NotLessTilde' => '≴', 1146 'notni' => '∌', 1147 'notniva' => '∌', 1148 'notnivb' => '', 1149 'notnivc' => '', 1150 'NotPrecedes' => '⊀', 1151 'NotPrecedesEqual' => '', 1152 'NotPrecedesSlantEqual' => '⋠', 1153 'NotReverseElement' => '∌', 1154 'NotRightTriangle' => '⋫', 1155 'NotRightTriangleEqual' => '⋭', 1156 'NotSquareSubsetEqual' => '⋢', 1157 'NotSquareSupersetEqual' => '⋣', 1158 'NotSubset' => '⊄', 1159 'NotSucceeds' => '⊁', 1160 'NotSucceedsEqual' => '', 1161 'NotSucceedsSlantEqual' => '⋡', 1162 'NotSuperset' => '⊅', 1163 'NotTilde' => '≁', 1164 'NotTildeEqual' => '≄', 1165 'NotTildeFullEqual' => '≇', 1166 'NotTildeTilde' => '≉', 1167 'NotVerticalBar' => '∤', 1168 'npar' => '∦', 1169 'nparallel' => '∦', 1170 'nparsl' => '', 1171 'npart' => '', 1172 'npolint' => '', 1173 'npr' => '⊀', 1174 'nprcue' => '⋠', 1175 'npre' => '', 1176 'nprec' => '⊀', 1177 'npreceq' => '', 1178 'nrArr' => '⇏', 1179 'nrarr' => '↛', 1180 'nrarrc' => '', 1181 'nrarrw' => '', 1182 'nRightarrow' => '⇏', 1183 'nrightarrow' => '↛', 1184 'nrtri' => '⋫', 1185 'nrtrie' => '⋭', 1186 'nsc' => '⊁', 1187 'nsccue' => '⋡', 1188 'nsce' => '', 1189 'Nscr' => '', 1190 'nscr' => '', 1191 'nshortmid' => '', 1192 'nshortparallel' => '', 1193 'nsim' => '≁', 1194 'nsime' => '≄', 1195 'nsimeq' => '≄', 1196 'nsmid' => '', 1197 'nspar' => '', 1198 'nsqsube' => '⋢', 1199 'nsqsupe' => '⋣', 1200 'nsub' => '⊄', 1201 'nsubE' => '⊈', 1202 'nsube' => '⊈', 1203 'nsubset' => '⊄', 1204 'nsubseteq' => '⊈', 1205 'nsubseteqq' => '⊈', 1206 'nsucc' => '⊁', 1207 'nsucceq' => '', 1208 'nsup' => '⊅', 1209 'nsupE' => '⊉', 1210 'nsupe' => '⊉', 1211 'nsupset' => '⊅', 1212 'nsupseteq' => '⊉', 1213 'nsupseteqq' => '⊉', 1214 'ntgl' => '≹', 1215 'ntlg' => '≸', 1216 'ntriangleleft' => '⋪', 1217 'ntrianglelefteq' => '⋬', 1218 'ntriangleright' => '⋫', 1219 'ntrianglerighteq' => '⋭', 1220 'ntvgl' => '≹', 1221 'ntvlg' => '≸', 1222 'nu' => 'ν', 1223 'num' => '#', 1224 'numsp' => ' ', 1225 'nvap' => '', 1226 'nVDash' => '⊯', 1227 'nVdash' => '⊮', 1228 'nvDash' => '⊭', 1229 'nvdash' => '⊬', 1230 'nvge' => '≱', 1231 'nvgt' => '≯', 1232 'nvhArr*' => '⇎', 1233 'nvinfin' => '', 1234 'nvlArr' => '⇍', 1235 'nvle' => '≰', 1236 'nvlt' => '≮', 1237 'nvltrie' => '', 1238 'nvrArr' => '⇏', 1239 'nvrtrie' => '', 1240 'nvsim' => '', 1241 'nwarhk' => '', 1242 'nwArr' => '⇖', 1243 'nwarr' => '↖', 1244 'nwarrow' => '↖', 1245 'nwnear' => '', 1246 'oast' => '⊛', 1247 'ocir' => '⊚', 1248 'odash' => '⊝', 1249 'odiv' => '', 1250 'odot' => '⊙', 1251 'odsold' => '', 1252 'ofcir' => '', 1253 'Ofr' => '', 1254 'ofr' => '', 1255 'ogon' => '̨', 1256 'ogt' => '', 1257 'ohbar' => '', 1258 'ohm' => 'Ω', 1259 'oint' => '∮', 1260 'olarr' => '↺', 1261 'olcir' => '', 1262 'olcross' => '', 1263 'olt' => '', 1264 'Omega' => 'Ω', 1265 'omega' => 'ω', 1266 'omicron' => 'ξ', 1267 'omid' => '', 1268 'ominus' => '⊖', 1269 'Oopf' => '', 1270 'opar' => '', 1271 'OpenCurlyDoubleQuote' => '“', 1272 'OpenCurlyQuote' => '‘', 1273 'operp' => '', 1274 'oplus' => '⊕', 1275 'Or' => '', 1276 'or' => '∨', 1277 'orarr' => '↻', 1278 'ord' => '', 1279 'order' => 'ℴ', 1280 'ordf' => 'ª', 1281 'ordm' => 'º', 1282 'origof' => '⊶', 1283 'oror' => '', 1284 'orslope' => '', 1285 'orv' => '', 1286 'oS' => '', 1287 'Oscr' => '', 1288 'oscr' => '', 1289 'oslash' => '⊘', 1290 'osol' => '⊘', 1291 'Otimes' => '', 1292 'otimes' => '⊗', 1293 'otimesas' => '', 1294 'ovbar' => '', 1295 'OverLine' => '̅', 1296 'par' => '∥', 1297 'para' => '¶', 1298 'parallel' => '∥', 1299 'parsim' => '', 1300 'parsl' => '', 1301 'part' => '∂', 1302 'PartialD' => '∂', 1303 'percnt' => '%', 1304 'period' => '.', 1305 'permil' => '‰', 1306 'perp' => '⊥', 1307 'pertenk' => '‱', 1308 'Pfr' => '', 1309 'pfr' => '', 1310 'Phi' => 'Φ', 1311 'phi' => 'φ', 1312 'phiv' => 'ϕ', 1313 'phmmat' => 'ℳ', 1314 'phone' => '☎', 1315 'Pi' => 'Π', 1316 'pi' => 'π', 1317 'pitchfork' => '⋔', 1318 'piv' => 'ϖ', 1319 'plank' => '', 1320 'plankv' => 'ℏ', 1321 'plus' => '+', 1322 'plusacir' => '', 1323 'plusb' => '⊞', 1324 'pluscir' => '', 1325 'plusdo' => '∔', 1326 'plusdu' => '', 1327 'pluse' => '', 1328 'PlusMinus' => '±', 1329 'plusmn' => '±', 1330 'plussim' => '', 1331 'plustwo' => '', 1332 'pm' => '±', 1333 'pointint' => '', 1334 'Popf' => 'ℙ', 1335 'pound' => '£', 1336 'Pr' => '', 1337 'pr' => '≺', 1338 'prap' => '≾', 1339 'prcue' => '≼', 1340 'prE' => '≼', 1341 'pre' => '≼', 1342 'prec' => '≺', 1343 'precapprox' => '≾', 1344 'preccurlyeq' => '≼', 1345 'Precedes' => '≺', 1346 'PrecedesEqual' => '≼', 1347 'PrecedesSlantEqual' => '≼', 1348 'PrecedesTilde' => '≾', 1349 'preceq' => '≼', 1350 'precnapprox' => '⋨', 1351 'precneqq' => '', 1352 'precnsim' => '⋨', 1353 'precsim' => '≾', 1354 'Prime' => '″', 1355 'prime' => '′', 1356 'prnap' => '⋨', 1357 'prnE' => '', 1358 'prnsim' => '⋨', 1359 'profalar' => '⌮', 1360 'profline' => '⌒', 1361 'profsurf' => '⌓', 1362 'prop' => '∝', 1363 'Proportion' => '∷', 1364 'Proportional' => '∝', 1365 'propto' => '∝', 1366 'prsim' => '≾', 1367 'prurel' => '⊰', 1368 'Pscr' => '', 1369 'pscr' => '', 1370 'Psi' => 'Ψ', 1371 'psi' => 'ψ', 1372 'puncsp' => ' ', 1373 'Qfr' => '', 1374 'qfr' => '', 1375 'qint' => '', 1376 'Qopf' => 'ℚ', 1377 'qprime' => '', 1378 'Qscr' => '', 1379 'qscr' => '', 1380 'quatint' => '', 1381 'quest' => '?', 1382 'questeq' => '≟', 1383 'quot' => '"', 1384 'rAarr' => '⇛', 1385 'race' => '', 1386 'radic' => '√', 1387 'raemptyv' => '', 1388 'Rang' => '》', 1389 'rang' => '〉', 1390 'rangd' => '', 1391 'range' => '', 1392 'rangle' => '〉', 1393 'raquo' => '»', 1394 'Rarr' => '↠', 1395 'rArr' => '⇒', 1396 'rarr' => '→', 1397 'rarrap' => '', 1398 'rarrbfs' => '', 1399 'rarrc' => '', 1400 'rarrfs' => '', 1401 'rarrhk' => '↪', 1402 'rarrlp' => '↬', 1403 'rarrpl' => '', 1404 'rarrsim' => '', 1405 'Rarrtl' => '', 1406 'rarrtl' => '↣', 1407 'rarrw' => '↝', 1408 'rAtail' => '', 1409 'ratail' => '↣', 1410 'ratio' => '∶', 1411 'RBarr' => '', 1412 'rBarr' => '', 1413 'rbarr' => '', 1414 'rbbrk' => '〕', 1415 'rbrace' => '}', 1416 'rbrack' => ']', 1417 'rbrke' => '', 1418 'rbrksld' => '', 1419 'rbrkslu' => '', 1420 'rceil' => '⌉', 1421 'rcub' => '}', 1422 'rdca' => '', 1423 'rdldhar' => '', 1424 'rdquo' => '”', 1425 'rdquor' => '‛', 1426 'rdsh' => '↳', 1427 'Re' => 'ℜ', 1428 'real' => 'ℜ', 1429 'rect' => '', 1430 'reg' => '¯', 1431 'ReverseElement' => '∋', 1432 'ReverseEquilibrium' => '⇋', 1433 'ReverseUpEquilibrium' => '', 1434 'rfisht' => '', 1435 'rfloor' => '⌋', 1436 'Rfr' => '', 1437 'rfr' => '', 1438 'rHar' => '', 1439 'rhard' => '⇁', 1440 'rharu' => '⇀', 1441 'rharul' => '', 1442 'rho' => 'ρ', 1443 'rhov' => 'ϱ', 1444 'RightAngleBracket' => '〉', 1445 'RightArrow' => '→', 1446 'Rightarrow' => '⇒', 1447 'rightarrow' => '→', 1448 'RightArrowLeftArrow' => '⇄', 1449 'rightarrowtail' => '↣', 1450 'RightCeiling' => '⌉', 1451 'RightDownVector' => '⇂', 1452 'RightFloor' => '⌋', 1453 'rightharpoondown' => '⇁', 1454 'rightharpoonup' => '⇀', 1455 'rightleftarrows' => '⇄', 1456 'rightleftharpoons' => '⇌', 1457 'rightrightarrows' => '⇉', 1458 'rightsquigarrow' => '↝', 1459 'RightTee' => '⊢', 1460 'RightTeeArrow' => '↦', 1461 'rightthreetimes' => '⋌', 1462 'RightTriangle' => '⊳', 1463 'RightTriangleEqual' => '⊵', 1464 'RightUpVector' => '↾', 1465 'RightVector' => '⇀', 1466 'ring' => '̊', 1467 'risingdotseq' => '≓', 1468 'rlarr' => '⇄', 1469 'rlhar' => '⇌', 1470 'rmoust' => '', 1471 'rmoustache' => '', 1472 'rnmid' => '', 1473 'roang' => '〙', 1474 'roarr' => '', 1475 'robrk' => '〛', 1476 'ropar' => '', 1477 'Ropf' => 'ℝ', 1478 'roplus' => '', 1479 'rotimes' => '', 1480 'rpar' => ')', 1481 'rpargt' => '', 1482 'rppolint' => '', 1483 'rrarr' => '⇉', 1484 'Rrightarrow' => '⇛', 1485 'Rscr' => '', 1486 'rscr' => 'ℛ', 1487 'Rsh' => '↱', 1488 'rsh' => '↱', 1489 'rsqb' => ']', 1490 'rsquo' => '’', 1491 'rsquor' => '‟', 1492 'rthree' => '⋌', 1493 'rtimes' => '⋊', 1494 'rtri' => '▹', 1495 'rtrie' => '⊵', 1496 'rtrif' => '▸', 1497 'rtriltri' => '', 1498 'ruluhar' => '', 1499 'rx' => '℞', 1500 'Sc' => '', 1501 'sc' => '≻', 1502 'scap' => '≿', 1503 'sccue' => '≽', 1504 'scE' => '≾', 1505 'sce' => '≽', 1506 'scnap' => '⋩', 1507 'scnE' => '', 1508 'scnsim' => '⋩', 1509 'scpolint' => '', 1510 'scsim' => '≿', 1511 'sdot' => '⋅', 1512 'sdotb' => '⊡', 1513 'sdote' => '', 1514 'searhk' => '', 1515 'seArr' => '⇘', 1516 'searr' => '↘', 1517 'searrow' => '↘', 1518 'sect' => '§', 1519 'semi' => ';', 1520 'seswar' => '', 1521 'setminus' => '∖', 1522 'setmn' => '∖', 1523 'sext' => '', 1524 'Sfr' => '', 1525 'sfr' => '', 1526 'sfrown' => '', 1527 'sharp' => '♯', 1528 'ShortLeftArrow' => '', 1529 'shortmid' => '', 1530 'shortparallel' => '', 1531 'ShortRightArrow' => '', 1532 'shy' => '­', 1533 'Sigma' => 'Σ', 1534 'sigma' => 'σ', 1535 'sigmav' => 'ς', 1536 'sim' => '∼', 1537 'simdot' => '', 1538 'sime' => '≃', 1539 'simeq' => '≃', 1540 'simg' => '', 1541 'simgE' => '', 1542 'siml' => '', 1543 'simlE' => '', 1544 'simne' => '≆', 1545 'simplus' => '', 1546 'simrarr' => '', 1547 'slarr' => '', 1548 'SmallCircle' => '∘', 1549 'smallfrown' => '', 1550 'smallsetminus' => '', 1551 'smallsmile' => '', 1552 'smashp' => '', 1553 'smeparsl' => '', 1554 'smid' => '', 1555 'smile' => '⌣', 1556 'smt' => '', 1557 'smte' => '', 1558 'smtes' => '', 1559 'sol' => '/', 1560 'solb' => '', 1561 'solbar' => '', 1562 'Sopf' => '', 1563 'spades' => '♠', 1564 'spadesuit' => '♠', 1565 'spar' => '', 1566 'sqcap' => '⊓', 1567 'sqcaps' => '', 1568 'sqcup' => '⊔', 1569 'sqcups' => '', 1570 'Sqrt' => '√', 1571 'sqsub' => '⊏', 1572 'sqsube' => '⊑', 1573 'sqsubset' => '⊏', 1574 'sqsubseteq' => '⊑', 1575 'sqsup' => '⊐', 1576 'sqsupe' => '⊒', 1577 'sqsupset' => '⊐', 1578 'sqsupseteq' => '⊒', 1579 'squ' => '□', 1580 'square' => '□', 1581 'SquareIntersection' => '⊓', 1582 'SquareSubset' => '⊏', 1583 'SquareSubsetEqual' => '⊑', 1584 'SquareSuperset' => '⊐', 1585 'SquareSupersetEqual' => '⊒', 1586 'SquareUnion' => '⊔', 1587 'squarf' => '■', 1588 'squarfb' => '', 1589 'squarfbl' => '', 1590 'squarfbr' => '◪', 1591 'squarfl' => '◧', 1592 'squarfr' => '◨', 1593 'squarft' => '', 1594 'squarftl' => '◩', 1595 'squarftr' => '', 1596 'squf' => '▪', 1597 'srarr' => '', 1598 'Sscr' => '', 1599 'sscr' => '', 1600 'ssetmn' => '', 1601 'ssmile' => '', 1602 'sstarf' => '⋆', 1603 'Star' => '⋆', 1604 'star' => '⋆', 1605 'starf' => '★', 1606 'straightepsilon' => '∊', 1607 'straightphi' => 'φ', 1608 'strns' => '', 1609 'Sub' => '⋐', 1610 'sub' => '⊂', 1611 'subdot' => '', 1612 'subE' => '⊆', 1613 'sube' => '⊆', 1614 'subedot' => '', 1615 'submult' => '', 1616 'subnE' => '⊊', 1617 'subne' => '⊊', 1618 'subplus' => '', 1619 'subrarr' => '', 1620 'Subset' => '⋐', 1621 'subset' => '⊂', 1622 'subseteq' => '⊆', 1623 'subseteqq' => '⊆', 1624 'SubsetEqual' => '⊆', 1625 'subsetneq' => '⊊', 1626 'subsetneqq' => '⊊', 1627 'subsim' => '', 1628 'subsub' => '', 1629 'subsup' => '', 1630 'succ' => '≻', 1631 'succapprox' => '≿', 1632 'succcurlyeq' => '≽', 1633 'Succeeds' => '≻', 1634 'SucceedsEqual' => '≽', 1635 'SucceedsSlantEqual' => '≽', 1636 'SucceedsTilde' => '≿', 1637 'succeq' => '≽', 1638 'succnapprox' => '⋩', 1639 'succneqq' => '', 1640 'succnsim' => '⋩', 1641 'succsim' => '≿', 1642 'SuchThat' => '∍', 1643 'Sum' => '∑', 1644 'sum' => '∑', 1645 'sung' => '♩', 1646 'Sup' => '⋑', 1647 'sup' => '⊃', 1648 'sup1' => '¹', 1649 'sup2' => '²', 1650 'sup3' => '³', 1651 'supdot' => '', 1652 'supdsub' => '', 1653 'supE' => '⊇', 1654 'supe' => '⊇', 1655 'supedot' => '', 1656 'Superset' => '⊃', 1657 'SupersetEqual' => '⊇', 1658 'suphsol' => '', 1659 'suphsub' => '', 1660 'suplarr' => '', 1661 'supmult' => '', 1662 'supnE' => '⊋', 1663 'supne' => '⊋', 1664 'supplus' => '', 1665 'Supset' => '⋑', 1666 'supset' => '⊃', 1667 'supseteq' => '⊇', 1668 'supseteqq' => '⊇', 1669 'supsetneq' => '⊋', 1670 'supsetneqq' => '⊋', 1671 'supsim' => '', 1672 'supsub' => '', 1673 'supsup' => '', 1674 'swarhk' => '', 1675 'swArr' => '⇙', 1676 'swarr' => '↙', 1677 'swarrow' => '↙', 1678 'swnwar' => '', 1679 'target' => '⌖', 1680 'tau' => 'τ', 1681 'tbrk' => '', 1682 'tdot' => '⃛', 1683 'telrec' => '⌕', 1684 'Tfr' => '', 1685 'tfr' => '', 1686 'there4' => '∴', 1687 'Therefore' => '∴', 1688 'therefore' => '∴', 1689 'Theta' => 'Θ', 1690 'theta' => 'θ', 1691 'thetav' => 'ϑ', 1692 'thickapprox' => '', 1693 'thicksim' => '', 1694 'thinsp' => ' ', 1695 'thkap' => '', 1696 'thksim' => '', 1697 'Tilde' => '∼', 1698 'tilde' => '̃', 1699 'TildeEqual' => '≃', 1700 'TildeFullEqual' => '≅', 1701 'TildeTilde' => '≈', 1702 'times' => '×', 1703 'timesb' => '⊠', 1704 'timesbar' => '', 1705 'timesd' => '', 1706 'tint' => '∭', 1707 'toea' => '', 1708 'top' => '⊤', 1709 'topbot' => '⌶', 1710 'topcir' => '', 1711 'Topf' => '', 1712 'topfork' => '', 1713 'tosa' => '', 1714 'tprime' => '‴', 1715 'trade' => '™', 1716 'triangle' => '▵', 1717 'triangledown' => '▿', 1718 'triangleleft' => '◃', 1719 'trianglelefteq' => '⊴', 1720 'triangleq' => '≜', 1721 'triangleright' => '▹', 1722 'trianglerighteq' => '⊵', 1723 'tridot' => '◬', 1724 'trie' => '≜', 1725 'triminus' => '', 1726 'TripleDot' => '⃛', 1727 'triplus' => '', 1728 'trisb' => '', 1729 'tritime' => '', 1730 'trpezium' => '', 1731 'Tscr' => '', 1732 'tscr' => '', 1733 'twixt' => '≬', 1734 'twoheadleftarrow' => '↞', 1735 'twoheadrightarrow' => '↠', 1736 'Uarr' => '↟', 1737 'uArr' => '⇑', 1738 'uarr' => '↑', 1739 'Uarrocir' => '', 1740 'udarr' => '⇅', 1741 'udhar' => '', 1742 'ufisht' => '', 1743 'Ufr' => '', 1744 'ufr' => '', 1745 'uHar' => '', 1746 'uharl' => '↿', 1747 'uharr' => '↾', 1748 'uhblk' => '▀', 1749 'ulcorn' => '⌜', 1750 'ulcorner' => '⌜', 1751 'ulcrop' => '⌏', 1752 'ultri' => '', 1753 'uml' => '̈', 1754 'UnderLine' => '̲', 1755 'Union' => '⋃', 1756 'UnionPlus' => '⊎', 1757 'Uopf' => '', 1758 'UpArrow' => '↑', 1759 'Uparrow' => '⇑', 1760 'uparrow' => '↑', 1761 'UpArrowDownArrow' => '⇅', 1762 'UpDownArrow' => '↕', 1763 'Updownarrow' => '⇕', 1764 'updownarrow' => '↕', 1765 'UpEquilibrium' => '', 1766 'upharpoonleft' => '↿', 1767 'upharpoonright' => '↾', 1768 'uplus' => '⊎', 1769 'UpperLeftArrow' => '↖', 1770 'UpperRightArrow' => '↗', 1771 'Upsi' => 'ϒ', 1772 'upsi' => 'υ', 1773 'Upsilon' => 'ϒ', 1774 'upsilon' => 'υ', 1775 'UpTee' => '⊥', 1776 'upuparrows' => '⇈', 1777 'urcorn' => '⌝', 1778 'urcorner' => '⌝', 1779 'urcrop' => '⌎', 1780 'urtri' => '', 1781 'Uscr' => '', 1782 'uscr' => '', 1783 'utdot' => '⋰', 1784 'utri' => '▵', 1785 'utrif' => '▴', 1786 'uuarr' => '⇈', 1787 'uwangle' => '', 1788 'vangrt' => '⊾', 1789 'varepsilon' => 'ε', 1790 'varkappa' => 'ϰ', 1791 'varnothing' => '∅', 1792 'varphi' => 'ϕ', 1793 'varpi' => 'ϖ', 1794 'varpropto' => '∝', 1795 'vArr' => '⇕', 1796 'varr' => '↕', 1797 'varrho' => 'ϱ', 1798 'varsigma' => 'ς', 1799 'varsubsetneq' => '', 1800 'varsubsetneqq' => '', 1801 'varsupsetneq' => '', 1802 'varsupsetneqq' => '', 1803 'vartheta' => 'ϑ', 1804 'vartriangleleft' => '⊲', 1805 'vartriangleright' => '⊳', 1806 'Vbar' => '', 1807 'vBar' => '', 1808 'vBarv' => '', 1809 'VDash' => '⊫', 1810 'Vdash' => '⊩', 1811 'vDash' => '⊨', 1812 'vdash' => '⊢', 1813 'Vdashl' => '', 1814 'Vee' => '⋁', 1815 'vee' => '∨', 1816 'veebar' => '⊻', 1817 'veeeq' => '≚', 1818 'vellip' => '⋮', 1819 'Verbar' => '‖', 1820 'verbar' => '|', 1821 'Vert' => '‖', 1822 'vert' => '|', 1823 'VerticalBar' => '∣', 1824 'VerticalTilde' => '≀', 1825 'Vfr' => '', 1826 'vfr' => '', 1827 'vltri' => '⊲', 1828 'vnsub' => '⊄', 1829 'vnsup' => '⊅', 1830 'Vopf' => '', 1831 'vprop' => '∝', 1832 'vrtri' => '⊳', 1833 'Vscr' => '', 1834 'vscr' => '', 1835 'vsubnE' => '', 1836 'vsubne' => '', 1837 'vsupnE' => '', 1838 'vsupne' => '', 1839 'Vvdash' => '⊪', 1840 'vzigzag' => '', 1841 'wedbar' => '', 1842 'Wedge' => '⋀', 1843 'wedge' => '∧', 1844 'wedgeq' => '≙', 1845 'weierp' => '℘', 1846 'Wfr' => '', 1847 'wfr' => '', 1848 'Wopf' => '', 1849 'wp' => '℘', 1850 'wr' => '≀', 1851 'wreath' => '≀', 1852 'Wscr' => '', 1853 'wscr' => '', 1854 'xcap' => '⋂', 1855 'xcirc' => '○', 1856 'xcup' => '⋃', 1857 'xdtri' => '▽', 1858 'Xfr' => '', 1859 'xfr' => '', 1860 'xhArr' => '', 1861 'xharr' => '', 1862 'Xi' => 'Ξ', 1863 'xi' => 'ξ', 1864 'xlArr' => '', 1865 'xlarr' => '', 1866 'xmap' => '', 1867 'xnis' => '', 1868 'xodot' => '⊙', 1869 'Xopf' => '', 1870 'xoplus' => '⊕', 1871 'xotime' => '⊗', 1872 'xrArr' => '', 1873 'xrarr' => '', 1874 'Xscr' => '', 1875 'xscr' => '', 1876 'xsqcup' => '⊔', 1877 'xuplus' => '⊎', 1878 'xutri' => '△', 1879 'xvee' => '⋁', 1880 'xwedge' => '⋀', 1881 'yen' => '¥', 1882 'Yfr' => '', 1883 'yfr' => '', 1884 'Yopf' => '', 1885 'Yscr' => '', 1886 'yscr' => '', 1887 'zeta' => 'ζ', 1888 'Zfr' => 'ℤ', 1889 'zfr' => '', 1890 'zigrarr' => '', 1891 'Zopf' => '', 1892 'Zscr' => '', 1893 'zscr' => '' 1894 ); 1895 return $charset; 1896 1897 1898 1899 // cas particuliers pour la translitteration 1900 case 'translit': 1901 $GLOBALS['CHARSET'][$charset] = array ( 1902 // latin 1903 128=>'euro', 131=>'f', 140=>'OE', 147=>'\'\'', 148=>'\'\'', 153=>'TM', 156=>'oe', 159=>'Y', 160=>' ', 1904 161=>'!', 162=>'c', 163=>'L', 164=>'O', 165=>'yen',166=>'|', 1905 167=>'p',169=>'(c)', 171=>'<<',172=>'-',173=>'-',174=>'(R)', 1906 176=>'o',177=>'+-',181=>'mu',182=>'p',183=>'.',187=>'>>', 192=>'A', 1907 193=>'A', 194=>'A', 195=>'A', 196=>'A', 197=>'A', 198=>'AE', 199=>'C', 1908 200=>'E', 201=>'E', 202=>'E', 203=>'E', 204=>'I', 205=>'I', 206=>'I', 1909 207=>'I', 209=>'N', 210=>'O', 211=>'O', 212=>'O', 213=>'O', 214=>'O', 1910 216=>'O', 217=>'U', 218=>'U', 219=>'U', 220=>'U', 223=>'ss', 224=>'a', 1911 225=>'a', 226=>'a', 227=>'a', 228=>'a', 229=>'a', 230=>'ae', 231=>'c', 1912 232=>'e', 233=>'e', 234=>'e', 235=>'e', 236=>'i', 237=>'i', 238=>'i', 1913 239=>'i', 241=>'n', 242=>'o', 243=>'o', 244=>'o', 245=>'o', 246=>'o', 1914 248=>'o', 249=>'u', 250=>'u', 251=>'u', 252=>'u', 255=>'y', 1915 1916 // turc 1917 286=>'G', 287=>'g', 304=>'I', 305=>'i', 350=>'S', 351=>'s', 1918 1919 // esperanto 1920 264 => 'Cx',265 => 'cx', 1921 284 => 'Gx',285 => 'gx', 1922 292 => 'Hx',293 => 'hx', 1923 308 => 'Jx',309 => 'jx', 1924 348 => 'Sx',349 => 'sx', 1925 364 => 'Ux',365 => 'ux', 1926 1927 // cyrillique 1928 1026=>'D%', 1027=>'G%', 8218=>'\'', 1107=>'g%', 8222=>'"', 8230=>'...', 1929 8224=>'/-', 8225=>'/=', 8364=>'EUR', 8240=>'0/00', 1033=>'LJ', 1930 8249=>'<', 1034=>'NJ', 1036=>'KJ', 1035=>'Ts', 1039=>'DZ', 1106=>'d%', 1931 8216=>'`', 8217=>'\'', 8220=>'"', 8221=>'"', 8226=>' o ', 8211=>'-', 1932 8212=>'--', 8212=>'~', 8482=>'(TM)', 1113=>'lj', 8250=>'>', 1114=>'nj', 1933 1116=>'kj', 1115=>'ts', 1119=>'dz', 1038=>'V%', 1118=>'v%', 1032=>'J%', 1934 1168=>'G3', 1025=>'IO', 1028=>'IE', 1031=>'YI', 1030=>'II', 1935 1110=>'ii', 1169=>'g3', 1105=>'io', 8470=>'No.', 1108=>'ie', 1936 1112=>'j%', 1029=>'DS', 1109=>'ds', 1111=>'yi', 1040=>'A', 1041=>'B', 1937 1042=>'V', 1043=>'G', 1044=>'D', 1045=>'E', 1046=>'ZH', 1047=>'Z', 1938 1048=>'I', 1049=>'J', 1050=>'K', 1051=>'L', 1052=>'M', 1053=>'N', 1939 1054=>'O', 1055=>'P', 1056=>'R', 1057=>'S', 1058=>'T', 1059=>'U', 1940 1060=>'F', 1061=>'H', 1062=>'C', 1063=>'CH', 1064=>'SH', 1065=>'SCH', 1941 1066=>'"', 1067=>'Y', 1068=>'\'', 1069=>'`E', 1070=>'YU', 1071=>'YA', 1942 1072=>'a', 1073=>'b', 1074=>'v', 1075=>'g', 1076=>'d', 1077=>'e', 1943 1078=>'zh', 1079=>'z', 1080=>'i', 1081=>'j', 1082=>'k', 1083=>'l', 1944 1084=>'m', 1085=>'n', 1086=>'o', 1087=>'p', 1088=>'r', 1089=>'s', 1945 1090=>'t', 1091=>'u', 1092=>'f', 1093=>'h', 1094=>'c', 1095=>'ch', 1946 1096=>'sh', 1097=>'sch', 1098=>'"', 1099=>'y', 1100=>'\'', 1101=>'`e', 1947 1102=>'yu', 1103=>'ya', 1948 1949 // vietnamien en translitteration de base 1950 7843=>"a",7841=>"a",7845=>"a",7847=>"a",7849=>"a",7851=>"a",7853=>"a", 1951 7855=>"a",7857=>"a",7859=>"a",7861=>"a",7863=>"a", 1952 7842=>"A",7840=>"A",7844=>"A",7846=>"A",7848=>"A", 1953 7850=>"A",7852=>"A",7854=>"A",7856=>"A",7858=>"A",7860=>"A", 1954 7862=>"A",7867=>"e",7869=>"e",7865=>"e", 1955 7871=>"e",7873=>"e",7875=>"e",7877=>"e",7879=>"e", 1956 7866=>"E",7868=>"E",7864=>"E",7870=>"E",7872=>"E",7874=>"E", 1957 7876=>"E",7878=>"E",7881=>"i",7883=>"i", 1958 7880=>"I",7882=>"I", 1959 7887=>"o",7885=>"o",7889=>"o",7891=>"o",7893=>"o", 1960 7895=>"o",7897=>"o",417=>"o",7899=>"o",7901=>"o",7903=>"o",7905=>"o", 1961 7907=>"o",7886=>"O",7884=>"O", 1962 7888=>"O",7890=>"O",7892=>"O",7894=>"O",7896=>"O",416=>"O",7898=>"O", 1963 7900=>"O",7902=>"O",7904=>"O",7906=>"O",7911=>"u", 1964 361=>"u",7909=>"u",432=>"u",7913=>"u",7915=>"u",7917=>"u",7919=>"u", 1965 7921=>"u",7910=>"U",360=>"U",7908=>"U",431=>"U", 1966 7912=>"U",7914=>"U",7916=>"U",7918=>"U",7920=>"U",253=>"y",7923=>"y", 1967 7927=>"y",7929=>"y",7925=>"y",221=>"Y",7922=>"Y",7926=>"Y",7928=>"Y", 1968 7924=>"Y",273=>"d" 1969 1970 ); 1971 return $charset; 1972 1973 // translitteration complexe 1974 case 'translitcomplexe': 1975 load_charset('translit'); 1976 $trans = $GLOBALS['CHARSET']['translit']; 1977 1978 $translit_c = array ( 1979 // vietnamien 1980 225=>"a'", 224=>"a`",7843=>"a?",227=>"a~",7841=>"a.", 1981 226=>"a^",7845=>"a^'",7847=>"a^`",7849=>"a^?",7851=>"a^~",7853=>"a^.",259=>"a(", 1982 7855=>"a('",7857=>"a(`",7859=>"a(?",7861=>"a(~",7863=>"a(.",193=>"A'",192=>"A`", 1983 7842=>"A?",195=>"A~",7840=>"A.",194=>"A^",7844=>"A^'",7846=>"A^`",7848=>"A^?", 1984 7850=>"A^~",7852=>"A^.",258=>"A(",7854=>"A('",7856=>"A(`",7858=>"A(?",7860=>"A(~", 1985 7862=>"A(.",233=>"e'",232=>"e`",7867=>"e?",7869=>"e~",7865=>"e.",234=>"e^", 1986 7871=>"e^'",7873=>"e^`",7875=>"e^?",7877=>"e^~",7879=>"e^.",201=>"E'",200=>"E`", 1987 7866=>"E?",7868=>"E~",7864=>"E.",202=>"E^",7870=>"E^'",7872=>"E^`",7874=>"E^?", 1988 7876=>"E^~",7878=>"E^.",237=>"i'",236=>"i`",7881=>"i?",297=>"i~",7883=>"i.", 1989 205=>"I'",204=>"I`",7880=>"I?",296=>"I~",7882=>"I.",243=>"o'",242=>"o`", 1990 7887=>"o?",245=>"o~",7885=>"o.",244=>"o^",7889=>"o^'",7891=>"o^`",7893=>"o^?", 1991 7895=>"o^~",7897=>"o^.",417=>"o+",7899=>"o+'",7901=>"o+`",7903=>"o+?",7905=>"o+~", 1992 7907=>"o+.",211=>"O'",210=>"O`",7886=>"O?",213=>"O~",7884=>"O.",212=>"O^", 1993 7888=>"O^'",7890=>"O^`",7892=>"O^?",7894=>"O^~",7896=>"O^.",416=>"O+",7898=>"O+'", 1994 7900=>"O+`",7902=>"O+?",7904=>"O+~",7906=>"O+.",250=>"u'",249=>"u`",7911=>"u?", 1995 361=>"u~",7909=>"u.",432=>"u+",7913=>"u+'",7915=>"u+`",7917=>"u+?",7919=>"u+~", 1996 7921=>"u+.",218=>"U'",217=>"U`",7910=>"U?",360=>"U~",7908=>"U.",431=>"U+", 1997 7912=>"U+'",7914=>"U+`",7916=>"U+?",7918=>"U+~",7920=>"U+.",253=>"y'",7923=>"y`", 1998 7927=>"y?",7929=>"y~",7925=>"y.",221=>"Y'",7922=>"Y`",7926=>"Y?",7928=>"Y~", 1999 7924=>"Y.",273=>"d-",208=>"D-", 2000 2001 // allemand 2002 228=>'ae',246=>'oe',252=>'ue',196=>'Ae',214=>'Oe',220=>'Ue' 2003 ); 2004 foreach($translit_c as $u=>$t) 2005 $trans[$u] = $t; 2006 $GLOBALS['CHARSET'][$charset] = $trans; 2007 return $charset; 2008 2009 2010 default: 2011 $GLOBALS['CHARSET'][$charset] = array(); 2012 return $charset; 2013 } 2014 } 2015 2016 // 2017 // Verifier qu'on peut utiliser mb_string 2018 // 2019 function init_mb_string() { 2020 static $mb; 2021 2022 // verifier que tout est present (fonctions mb_string pour php >= 4.0.6) 2023 // et que le charset interne est connu de mb_string 2024 if (!$mb) { 2025 if (function_exists('mb_internal_encoding') 2026 AND function_exists('mb_detect_order') 2027 AND function_exists('mb_substr') 2028 AND function_exists('mb_strlen') 2029 AND function_exists('mb_encode_mimeheader') 2030 AND function_exists('mb_encode_numericentity') 2031 AND function_exists('mb_decode_numericentity') 2032 AND mb_detect_order(lire_meta('charset')) 2033 ) { 2034 mb_internal_encoding('utf-8'); 2035 $mb = 1; 2036 } else 2037 $mb = -1; 2038 } 2039 2040 return ($mb == 1); 2041 } 2042 2043 // Detecter les versions buggees d'iconv 2044 function test_iconv() { 2045 static $iconv_ok; 2046 2047 if (!$iconv_ok) { 2048 if (!function_exists('iconv')) 2049 $iconv_ok = -1; 2050 else { 2051 if (utf_32_to_unicode(@iconv('utf-8', 'utf-32', 'chaine de test')) == 'chaine de test') 2052 $iconv_ok = 1; 2053 else 2054 $iconv_ok = -1; 2055 } 2056 } 2057 return ($iconv_ok == 1); 2058 } 2059 2060 // Test de fonctionnement du support UTF-8 dans PCRE 2061 // (contournement bug Debian Woody) 2062 function test_pcre_unicode() { 2063 static $pcre_ok = 0; 2064 2065 if (!$pcre_ok) { 2066 $s = " ".chr(195).chr(169)."t".chr(195).chr(169)." "; 2067 if (preg_match(',\W\w\w\w\W,u', $s)) $pcre_ok = 1; 2068 else $pcre_ok = -1; 2069 } 2070 return $pcre_ok == 1; 2071 } 2072 2073 // Plages alphanumeriques (incomplet...) 2074 function pcre_lettres_unicode() { 2075 static $plage_unicode; 2076 2077 if (!$plage_unicode) { 2078 if (test_pcre_unicode()) { 2079 // cf. http://www.unicode.org/charts/ 2080 $plage_unicode = '\w' // iso-latin 2081 . '\x{100}-\x{24f}' // europeen etendu 2082 . '\x{300}-\x{1cff}' // des tas de trucs 2083 ; 2084 } 2085 else { 2086 // fallback a trois sous 2087 $plage_unicode = '\w'; 2088 } 2089 } 2090 return $plage_unicode; 2091 } 2092 2093 // Plage ponctuation de 0x2000 a 0x206F 2094 // (i.e. de 226-128-128 a 226-129-176) 2095 function plage_punct_unicode() { 2096 return '\xE2(\x80[\x80-\xBF]|\x81[\x80-\xAF])'; 2097 } 2098 2099 // 2100 // Transformer les é en { 2101 // 2102 function html2unicode($texte) { 2103 static $trans; 2104 if (!$trans) { 2105 global $CHARSET; 2106 load_charset('html'); 2107 foreach ($CHARSET['html'] as $key => $val) { 2108 $trans["&$key;"] = $val; 2109 } 2110 } 2111 2112 return strtr($texte, $trans); 2113 } 2114 2115 // 2116 // Transformer les é en { 2117 // 2118 function mathml2unicode($texte) { 2119 static $trans; 2120 if (!$trans) { 2121 global $CHARSET; 2122 load_charset('mathml'); 2123 2124 foreach ($CHARSET['mathml'] as $key => $val) 2125 $trans["&$key;"] = $val; 2126 } 2127 2128 return strtr($texte, $trans); 2129 } 2130 2131 2132 // 2133 // Transforme une chaine en entites unicode  2134 // 2135 function charset2unicode($texte, $charset='AUTO', $forcer = false) { 2136 static $trans; 2137 2138 if ($charset == 'AUTO') 2139 $charset = lire_meta('charset'); 2140 2141 $charset = strtolower($charset); 2142 2143 switch ($charset) { 2144 case 'utf-8': 2145 return utf_8_to_unicode($texte); 2146 2147 case 'iso-8859-1': 2148 // corriger caracteres non-conformes issus de Windows (CP-1252) 2149 $faux_latin = array( 2150 chr(138) => "Š", // Scaron 2151 chr(140) => "Œ", // OElig 2152 chr(142) => "Ž", // Zcaron 2153 chr(154) => "š", // scaron 2154 chr(156) => "œ", // oelig 2155 chr(158) => "ž" // zcaron 2156 ); 2157 $texte = strtr($texte, $faux_latin); 2158 2159 // On commente cet appel tant qu'il reste des spip v<1.5 dans la nature 2160 // pour que le filtre |entites_unicode donne des backends lisibles sur ces spips. 2161 if (!$forcer) return $texte; 2162 2163 default: 2164 // mbstring presente ? 2165 if (init_mb_string()) { 2166 if ($order = mb_detect_order() # mb_string connait-il $charset? 2167 AND mb_detect_order($charset)) { 2168 $s = mb_convert_encoding($texte, 'utf-8', $charset); 2169 if ($s && $s != $texte) return utf_8_to_unicode($s); 2170 } 2171 mb_detect_order($order); # remettre comme precedemment 2172 } 2173 2174 // Sinon, peut-etre connaissons-nous ce charset ? 2175 if (!isset($trans[$charset])) { 2176 global $CHARSET; 2177 load_charset($charset); 2178 foreach ($CHARSET[$charset] as $key => $val) { 2179 $trans[$charset][chr($key)] = '&#'.$val.';'; 2180 } 2181 } 2182 if (count($trans[$charset])) 2183 return strtr($texte, $trans[$charset]); 2184 2185 // Sinon demander a iconv (malgre le fait qu'il coupe quand un 2186 // caractere n'appartient pas au charset, mais c'est un probleme 2187 // surtout en utf-8, gere ci-dessus) 2188 if (test_iconv()) { 2189 $s = iconv($charset, 'utf-32le', $texte); 2190 if ($s) return utf_32_to_unicode($s); 2191 } 2192 2193 // Au pire ne rien faire 2194 spip_log("erreur charset $charset non supporte"); 2195 return $texte; 2196 } 2197 } 2198 2199 // 2200 // Transforme les entites unicode  dans le charset specifie 2201 // 2202 function unicode2charset($texte, $charset='AUTO') { 2203 static $CHARSET_REVERSE; 2204 if ($charset == 'AUTO') 2205 $charset = lire_meta('charset'); 2206 2207 switch($charset) { 2208 case 'utf-8': 2209 return unicode_to_utf_8($texte); 2210 break; 2211 2212 default: 2213 $charset = load_charset($charset); 2214 2215 if (!is_array($CHARSET_REVERSE[$charset])) { 2216 $CHARSET_REVERSE[$charset] = array_flip($GLOBALS['CHARSET'][$charset]); 2217 } 2218 2219 $trans = array(); 2220 // Construire la table de remplacements 2221 // 1. Entites decimales (type "{") 2222 if (preg_match_all(',&#([0-9]+);,', $texte, $regs, PREG_PATTERN_ORDER)) { 2223 $entites = array_flip($regs[1]); 2224 foreach ($entites as $e => $v) { 2225 if ($s = ($e < 128) ? $e : $CHARSET_REVERSE[$charset][intval($e)]) 2226 $trans['&#'.$e.';'] = chr($s); 2227 } 2228 } 2229 // 2. Entites hexadecimales (type "
") 2230 if (preg_match_all(',&#x([0-9a-zA-Z]+);,', $texte, $regs, PREG_PATTERN_ORDER)) { 2231 $entites = array_flip($regs[1]); 2232 foreach ($entites as $e => $v) { 2233 $h = hexdec($e); 2234 if ($s = ($h < 128) ? $h : $CHARSET_REVERSE[$charset][$h]) 2235 $trans['&#x'.$e.';'] = chr($s); 2236 } 2237 } 2238 $texte = strtr($texte, $trans); 2239 return $texte; 2240 } 2241 } 2242 2243 2244 // Importer un texte depuis un charset externe vers le charset du site 2245 // (les caracteres non resolus sont transformes en {) 2246 function importer_charset($texte, $charset = 'AUTO') { 2247 return unicode2charset(charset2unicode($texte, $charset, true)); 2248 } 2249 2250 // UTF-8 2251 function utf_8_to_unicode($source) { 2252 2253 // mb_string : methode rapide 2254 if (init_mb_string()) { 2255 $convmap = array(0x7F, 0xFFFFFF, 0x0, 0xFFFFFF); 2256 return mb_encode_numericentity($source, $convmap, 'UTF-8'); 2257 } 2258 2259 // Sinon methode pas a pas 2260 static $decrement; 2261 static $shift; 2262 2263 // Cf. php.net, par Ronen. Adapte pour compatibilite php3 2264 if (!is_array($decrement)) { 2265 // array used to figure what number to decrement from character order value 2266 // according to number of characters used to map unicode to ascii by utf-8 2267 $decrement[4] = 240; 2268 $decrement[3] = 224; 2269 $decrement[2] = 192; 2270 $decrement[1] = 0; 2271 // the number of bits to shift each charNum by 2272 $shift[1][0] = 0; 2273 $shift[2][0] = 6; 2274 $shift[2][1] = 0; 2275 $shift[3][0] = 12; 2276 $shift[3][1] = 6; 2277 $shift[3][2] = 0; 2278 $shift[4][0] = 18; 2279 $shift[4][1] = 12; 2280 $shift[4][2] = 6; 2281 $shift[4][3] = 0; 2282 } 2283 2284 $pos = 0; 2285 $len = strlen ($source); 2286 $encodedString = ''; 2287 while ($pos < $len) { 2288 $char = ''; 2289 $ischar = false; 2290 $asciiPos = ord (substr ($source, $pos, 1)); 2291 if (($asciiPos >= 240) && ($asciiPos <= 255)) { 2292 // 4 chars representing one unicode character 2293 $thisLetter = substr ($source, $pos, 4); 2294 $pos += 4; 2295 } 2296 else if (($asciiPos >= 224) && ($asciiPos <= 239)) { 2297 // 3 chars representing one unicode character 2298 $thisLetter = substr ($source, $pos, 3); 2299 $pos += 3; 2300 } 2301 else if (($asciiPos >= 192) && ($asciiPos <= 223)) { 2302 // 2 chars representing one unicode character 2303 $thisLetter = substr ($source, $pos, 2); 2304 $pos += 2; 2305 } 2306 else { 2307 // 1 char (lower ascii) 2308 $thisLetter = substr ($source, $pos, 1); 2309 $pos += 1; 2310 $char = $thisLetter; 2311 $ischar = true; 2312 } 2313 2314 if ($ischar) 2315 $encodedString .= $char; 2316 else { // process the string representing the letter to a unicode entity 2317 $thisLen = strlen ($thisLetter); 2318 $thisPos = 0; 2319 $decimalCode = 0; 2320 while ($thisPos < $thisLen) { 2321 $thisCharOrd = ord (substr ($thisLetter, $thisPos, 1)); 2322 if ($thisPos == 0) { 2323 $charNum = intval ($thisCharOrd - $decrement[$thisLen]); 2324 $decimalCode += ($charNum << $shift[$thisLen][$thisPos]); 2325 } else { 2326 $charNum = intval ($thisCharOrd - 128); 2327 $decimalCode += ($charNum << $shift[$thisLen][$thisPos]); 2328 } 2329 $thisPos++; 2330 } 2331 $encodedLetter = "&#". ereg_replace('^0+', '', $decimalCode) . ';'; 2332 $encodedString .= $encodedLetter; 2333 } 2334 } 2335 return $encodedString; 2336 } 2337 2338 // UTF-32 ne sert plus que si on passe par iconv, c'est-a-dire quand 2339 // mb_string est absente ou ne connait pas notre charset 2340 // mais on l'optimise quand meme par mb_string 2341 // => tout ca sera osolete quand on sera surs d'avoir mb_string 2342 function utf_32_to_unicode($source) { 2343 2344 // mb_string : methode rapide 2345 if (init_mb_string()) { 2346 $convmap = array(0x7F, 0xFFFFFF, 0x0, 0xFFFFFF); 2347 $source = mb_encode_numericentity($source, $convmap, 'UTF-32LE'); 2348 return str_replace(chr(0), '', $source); 2349 } 2350 2351 // Sinon methode lente 2352 $texte = ''; 2353 while ($source) { 2354 $words = unpack("V*", substr($source, 0, 1024)); 2355 $source = substr($source, 1024); 2356 foreach ($words as $word) { 2357 if ($word < 128) 2358 $texte .= chr($word); 2359 // ignorer le BOM - http://www.unicode.org/faq/utf_bom.html 2360 else if ($word != 65279) 2361 $texte .= '&#'.$word.';'; 2362 } 2363 } 2364 return $texte; 2365 2366 } 2367 2368 // Ce bloc provient de php.net, auteur Ronen 2369 function caractere_utf_8($num) { 2370 if($num<128) 2371 return chr($num); 2372 if($num<2048) 2373 return chr(($num>>6)+192).chr(($num&63)+128); 2374 if($num<65536) 2375 return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128); 2376 if($num<1114112) 2377 return chr($num>>18+240).chr((($num>>12)&63)+128).chr(($num>>6)&63+128). chr($num&63+128); 2378 return ''; 2379 } 2380 2381 function unicode_to_utf_8($texte) { 2382 while (preg_match(',�*([0-9]+);,', $texte, $regs)) { 2383 $s = caractere_utf_8($regs[1]); 2384 $texte = str_replace($regs[0], $s, $texte); 2385 } 2386 return $texte; 2387 } 2388 2389 // convertit les Ĉ en \u0108 2390 function unicode_to_javascript($texte) { 2391 while (preg_match(',�*([0-9]+);,', $texte, $regs) AND !$vu[$regs[1]]) { 2392 $num = $regs[1]; 2393 $vu[$num] = true; 2394 $s = '\u'.sprintf("%04x", $num); 2395 $texte = str_replace($regs[0], $s, $texte); 2396 } 2397 return $texte; 2398 } 2399 2400 // convertit les %uxxxx (envoyes par javascript) 2401 function javascript_to_unicode ($texte) { 2402 while (ereg("%u([0-9A-F][0-9A-F][0-9A-F][0-9A-F])", $texte, $regs)) 2403 $texte = str_replace($regs[0],"&#".hexdec($regs[1]).";", $texte); 2404 return $texte; 2405 } 2406 // convertit les %E9 (envoyes par le browser) en chaine du charset du site (binaire) 2407 function javascript_to_binary ($texte) { 2408 while (ereg("%([0-9A-F][0-9A-F])", $texte, $regs)) 2409 $texte = str_replace($regs[0],chr(hexdec($regs[1])), $texte); 2410 return $texte; 2411 } 2412 2413 2414 // 2415 // Translitteration charset => ascii (pour l'indexation) 2416 // Attention les caracteres non reconnus sont renvoyes en utf-8 2417 // 2418 function translitteration($texte, $charset='AUTO', $complexe='') { 2419 static $trans; 2420 if ($charset == 'AUTO') 2421 $charset = lire_meta('charset'); 2422 2423 $table_translit ='translit'.$complexe; 2424 2425 // 1. Passer le charset et les é en utf-8 2426 $texte = unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset, true))); 2427 2428 // 2. Translitterer grace a la table predefinie 2429 if (!$trans[$complexe]) { 2430 global $CHARSET; 2431 load_charset($table_translit); 2432 foreach ($CHARSET[$table_translit] as $key => $val) 2433 $trans[$complexe][caractere_utf_8($key)] = $val; 2434 } 2435 2436 return strtr($texte, $trans[$complexe]); 2437 } 2438 2439 function translitteration_complexe($texte) { 2440 return translitteration($texte,'AUTO','complexe'); 2441 } 2442 2443 // Reconnaitre le BOM utf-8 (0xEFBBBF) 2444 function bom_utf8($texte) { 2445 return (substr($texte, 0,3) == chr(0xEF).chr(0xBB).chr(0xBF)); 2446 } 2447 2448 // Transcode une page (probablement attrapee sur le web) en essayant 2449 // par tous les moyens de deviner son charset (y compris headers HTTP) 2450 function transcoder_page($texte, $headers='') { 2451 2452 // Reconnaitre le BOM utf-8 (0xEFBBBF) 2453 if (bom_utf8($texte)) 2454 $charset = 'utf-8'; 2455 // charset precise par le contenu (xml) 2456 else if (preg_match(',<[?]xml[^>]*encoding[^>]*=[^>]*([-_a-z0-9]+?),Uims', $texte, $regs)) 2457 $charset = trim(strtolower($regs[1])); 2458 // charset precise par le contenu (html) 2459 else if (preg_match(',<(meta|html|body)[^>]*charset[^>]*=[^>]*([-_a-z0-9]+?),Uims', $texte, $regs)) 2460 $charset = trim(strtolower($regs[2])); 2461 // charset de la reponse http 2462 else if (preg_match(',charset=([-_a-z0-9]+),i', $headers, $regs)) 2463 $charset = trim(strtolower($regs[1])); 2464 2465 // normaliser les noms du shif-jis japonais 2466 if (preg_match(',^(x|shift)[_-]s?jis$,i', $charset)) 2467 $charset = 'shift-jis'; 2468 2469 if ($charset) { 2470 spip_log("charset source detecte : $charset"); 2471 } else { 2472 // valeur par defaut 2473 $charset = 'iso-8859-1'; 2474 spip_log("pas de charset detecte, on suppose : $charset"); 2475 } 2476 2477 return importer_charset($texte, $charset); 2478 } 2479 2480 // Initialisation 2481 $GLOBALS['CHARSET'] = Array(); 2482 2483 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Thu Feb 22 22:27:47 2007 | par Balluche grâce à PHPXref 0.7 |