Subversion Repositories Sites.tela-botanica.org

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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