Fixed dates in copyright. added koi8-r and koi8-u decoding. fixed ereg in
[squirrelmail.git] / functions / i18n.php
CommitLineData
59177427 1<?php
1fd97780 2
35586184 3/**
4 * i18n.php
5 *
76911253 6 * Copyright (c) 1999-2003 The SquirrelMail Project Team
35586184 7 * Licensed under the GNU GPL. For full terms see the file COPYING.
8 *
9 * This file contains variuos functions that are needed to do
10 * internationalization of SquirrelMail.
11 *
12 * Internally the output character set is used. Other characters are
13 * encoded using Unicode entities according to HTML 4.0.
14 *
15 * $Id$
16 */
17
961ca3d8 18require_once(SM_PATH . 'functions/global.php');
19
a2a7852b 20/* Decodes a string to the internal encoding from the given charset */
21function charset_decode ($charset, $string) {
6fbd125b 22 global $languages, $squirrelmail_language;
a2a7852b 23
3714db45 24 if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
25 function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
6fbd125b 26 $string = $languages[$squirrelmail_language]['XTRA_CODE']('decode', $string);
27 }
b05c8961 28
a2a7852b 29 /* All HTML special characters are 7 bit and can be replaced first */
cef054e4 30
098ea084 31 $string = htmlspecialchars ($string);
a2a7852b 32
33 $charset = strtolower($charset);
34
94965562 35 set_my_charset() ;
36
a2a7852b 37 if (ereg('iso-8859-([[:digit:]]+)', $charset, $res)) {
38 if ($res[1] == '1') {
39 $ret = charset_decode_iso_8859_1 ($string);
40 } else if ($res[1] == '2') {
41 $ret = charset_decode_iso_8859_2 ($string);
3a66bed2 42 } else if ($res[1] == '3') {
43 include_once(SM_PATH . 'functions/decode/iso8859-3.php');
44 $ret = charset_decode_iso8859_3 ($string);
9be313d5 45 } else if ($res[1] == '4') {
3a66bed2 46 include_once(SM_PATH . 'functions/decode/iso8859-4.php');
47 $ret = charset_decode_iso8859_4 ($string);
94965562 48 } else if ($res[1] == '5') {
3a66bed2 49 include_once(SM_PATH . 'functions/decode/iso8859-5.php');
50 $ret = charset_decode_iso8859_5 ($string);
ef82d2d5 51 } else if ($res[1] == '6') {
52 $ret = charset_decode_iso_8859_6 ($string);
a2a7852b 53 } else if ($res[1] == '7') {
54 $ret = charset_decode_iso_8859_7 ($string);
3a66bed2 55 } else if ($res[1] == '8') {
56 include_once(SM_PATH . 'functions/decode/iso8859-8.php');
57 $ret = charset_decode_iso8859_8 ($string);
3ab35042 58 } else if ($res[1] == '9') {
59 $ret = charset_decode_iso_8859_9 ($string);
3a66bed2 60 } else if ($res[1] == '10') {
61 include_once(SM_PATH . 'functions/decode/iso8859-10.php');
62 $ret = charset_decode_iso8859_10 ($string);
63 } else if ($res[1] == '11') {
64 include_once(SM_PATH . 'functions/decode/iso8859-11.php');
65 $ret = charset_decode_iso8859_11 ($string);
9be313d5 66 } else if ($res[1] == '13') {
3a66bed2 67 include_once(SM_PATH . 'functions/decode/iso8859-13.php');
68 $ret = charset_decode_iso8859_13 ($string);
69 } else if ($res[1] == '14') {
70 include_once(SM_PATH . 'functions/decode/iso8859-14.php');
71 $ret = charset_decode_iso8859_14 ($string);
a2a7852b 72 } else if ($res[1] == '15') {
73 $ret = charset_decode_iso_8859_15 ($string);
3a66bed2 74 } else if ($res[1] == '16') {
75 include_once(SM_PATH . 'functions/decode/iso8859-16.php');
76 $ret = charset_decode_iso8859_16 ($string);
a2a7852b 77 } else {
78 $ret = charset_decode_iso_8859_default ($string);
79 }
80 } else if ($charset == 'ns_4551-1') {
81 $ret = charset_decode_ns_4551_1 ($string);
82 } else if ($charset == 'koi8-r') {
83 $ret = charset_decode_koi8r ($string);
1c0e847f 84 } else if ($charset == 'koi8-u') {
85 $ret = charset_decode_koi8u ($string);
a2a7852b 86 } else if ($charset == 'windows-1251') {
ecd877a8 87 $ret = charset_decode_windows_1251 ($string);
3ab35042 88 } else if ($charset == 'windows-1253') {
89 $ret = charset_decode_windows_1253 ($string);
90 } else if ($charset == 'windows-1254') {
91 $ret = charset_decode_windows_1254 ($string);
c48a8ca7 92 } else if ($charset == 'windows-1255') {
93 $ret = charset_decode_windows_1255 ($string);
94 } else if ($charset == 'windows-1256') {
95 $ret = charset_decode_windows_1256 ($string);
c37a12f8 96 } else if ($charset == 'windows-1257') {
3a66bed2 97 include_once(SM_PATH . 'functions/decode/cp1257.php');
98 $ret = charset_decode_cp1257 ($string);
3ab35042 99 } else if ($charset == 'utf-8') {
100 $ret = charset_decode_utf8 ($string);
a2a7852b 101 } else {
102 $ret = $string;
103 }
104 return( $ret );
105}
106
107/*
108 iso-8859-1 is the same as Latin 1 and is normally used
109 in western europe.
110 */
111function charset_decode_iso_8859_1 ($string) {
112 global $default_charset;
13e0c649 113
a2a7852b 114 if (strtolower($default_charset) <> 'iso-8859-1') {
115 /* Only do the slow convert if there are 8-bit characters */
116 if (ereg("[\200-\377]", $string)) {
066c374f 117 $string = str_replace("\201", '&#129;', $string);
118 $string = str_replace("\202", '&#130;', $string);
119 $string = str_replace("\203", '&#131;', $string);
120 $string = str_replace("\204", '&#132;', $string);
121 $string = str_replace("\205", '&#133;', $string);
122 $string = str_replace("\206", '&#134;', $string);
123 $string = str_replace("\207", '&#135;', $string);
124 $string = str_replace("\210", '&#136;', $string);
125 $string = str_replace("\211", '&#137;', $string);
126 $string = str_replace("\212", '&#138;', $string);
127 $string = str_replace("\213", '&#139;', $string);
128 $string = str_replace("\214", '&#140;', $string);
129 $string = str_replace("\215", '&#141;', $string);
130 $string = str_replace("\216", '&#142;', $string);
131 $string = str_replace("\217", '&#143;', $string);
132 $string = str_replace("\220", '&#144;', $string);
133 $string = str_replace("\221", '&#145;', $string);
134 $string = str_replace("\222", '&#146;', $string);
135 $string = str_replace("\223", '&#147;', $string);
136 $string = str_replace("\224", '&#148;', $string);
137 $string = str_replace("\225", '&#149;', $string);
138 $string = str_replace("\226", '&#150;', $string);
139 $string = str_replace("\227", '&#151;', $string);
140 $string = str_replace("\230", '&#152;', $string);
141 $string = str_replace("\231", '&#153;', $string);
142 $string = str_replace("\232", '&#154;', $string);
143 $string = str_replace("\233", '&#155;', $string);
144 $string = str_replace("\234", '&#156;', $string);
145 $string = str_replace("\235", '&#157;', $string);
146 $string = str_replace("\236", '&#158;', $string);
147 $string = str_replace("\237", '&#159;', $string);
148 $string = str_replace("\240", '&#160;', $string);
149 $string = str_replace("\241", '&#161;', $string);
150 $string = str_replace("\242", '&#162;', $string);
151 $string = str_replace("\243", '&#163;', $string);
152 $string = str_replace("\244", '&#164;', $string);
153 $string = str_replace("\245", '&#165;', $string);
154 $string = str_replace("\246", '&#166;', $string);
155 $string = str_replace("\247", '&#167;', $string);
156 $string = str_replace("\250", '&#168;', $string);
157 $string = str_replace("\251", '&#169;', $string);
158 $string = str_replace("\252", '&#170;', $string);
159 $string = str_replace("\253", '&#171;', $string);
160 $string = str_replace("\254", '&#172;', $string);
161 $string = str_replace("\255", '&#173;', $string);
162 $string = str_replace("\256", '&#174;', $string);
163 $string = str_replace("\257", '&#175;', $string);
164 $string = str_replace("\260", '&#176;', $string);
165 $string = str_replace("\261", '&#177;', $string);
166 $string = str_replace("\262", '&#178;', $string);
167 $string = str_replace("\263", '&#179;', $string);
168 $string = str_replace("\264", '&#180;', $string);
169 $string = str_replace("\265", '&#181;', $string);
170 $string = str_replace("\266", '&#182;', $string);
171 $string = str_replace("\267", '&#183;', $string);
172 $string = str_replace("\270", '&#184;', $string);
173 $string = str_replace("\271", '&#185;', $string);
174 $string = str_replace("\272", '&#186;', $string);
175 $string = str_replace("\273", '&#187;', $string);
176 $string = str_replace("\274", '&#188;', $string);
177 $string = str_replace("\275", '&#189;', $string);
178 $string = str_replace("\276", '&#190;', $string);
179 $string = str_replace("\277", '&#191;', $string);
180 $string = str_replace("\300", '&#192;', $string);
181 $string = str_replace("\301", '&#193;', $string);
182 $string = str_replace("\302", '&#194;', $string);
183 $string = str_replace("\303", '&#195;', $string);
184 $string = str_replace("\304", '&#196;', $string);
185 $string = str_replace("\305", '&#197;', $string);
186 $string = str_replace("\306", '&#198;', $string);
187 $string = str_replace("\307", '&#199;', $string);
188 $string = str_replace("\310", '&#200;', $string);
189 $string = str_replace("\311", '&#201;', $string);
190 $string = str_replace("\312", '&#202;', $string);
191 $string = str_replace("\313", '&#203;', $string);
192 $string = str_replace("\314", '&#204;', $string);
193 $string = str_replace("\315", '&#205;', $string);
194 $string = str_replace("\316", '&#206;', $string);
195 $string = str_replace("\317", '&#207;', $string);
196 $string = str_replace("\320", '&#208;', $string);
197 $string = str_replace("\321", '&#209;', $string);
198 $string = str_replace("\322", '&#210;', $string);
199 $string = str_replace("\323", '&#211;', $string);
200 $string = str_replace("\324", '&#212;', $string);
201 $string = str_replace("\325", '&#213;', $string);
202 $string = str_replace("\326", '&#214;', $string);
203 $string = str_replace("\327", '&#215;', $string);
204 $string = str_replace("\330", '&#216;', $string);
205 $string = str_replace("\331", '&#217;', $string);
206 $string = str_replace("\332", '&#218;', $string);
207 $string = str_replace("\333", '&#219;', $string);
208 $string = str_replace("\334", '&#220;', $string);
209 $string = str_replace("\335", '&#221;', $string);
210 $string = str_replace("\336", '&#222;', $string);
211 $string = str_replace("\337", '&#223;', $string);
212 $string = str_replace("\340", '&#224;', $string);
213 $string = str_replace("\341", '&#225;', $string);
214 $string = str_replace("\342", '&#226;', $string);
215 $string = str_replace("\343", '&#227;', $string);
216 $string = str_replace("\344", '&#228;', $string);
217 $string = str_replace("\345", '&#229;', $string);
218 $string = str_replace("\346", '&#230;', $string);
219 $string = str_replace("\347", '&#231;', $string);
220 $string = str_replace("\350", '&#232;', $string);
221 $string = str_replace("\351", '&#233;', $string);
222 $string = str_replace("\352", '&#234;', $string);
223 $string = str_replace("\353", '&#235;', $string);
224 $string = str_replace("\354", '&#236;', $string);
225 $string = str_replace("\355", '&#237;', $string);
226 $string = str_replace("\356", '&#238;', $string);
227 $string = str_replace("\357", '&#239;', $string);
228 $string = str_replace("\360", '&#240;', $string);
229 $string = str_replace("\361", '&#241;', $string);
230 $string = str_replace("\362", '&#242;', $string);
231 $string = str_replace("\363", '&#243;', $string);
232 $string = str_replace("\364", '&#244;', $string);
233 $string = str_replace("\365", '&#245;', $string);
234 $string = str_replace("\366", '&#246;', $string);
235 $string = str_replace("\367", '&#247;', $string);
236 $string = str_replace("\370", '&#248;', $string);
237 $string = str_replace("\371", '&#249;', $string);
238 $string = str_replace("\372", '&#250;', $string);
239 $string = str_replace("\373", '&#251;', $string);
240 $string = str_replace("\374", '&#252;', $string);
241 $string = str_replace("\375", '&#253;', $string);
242 $string = str_replace("\376", '&#254;', $string);
243 $string = str_replace("\377", '&#255;', $string);
a2a7852b 244 }
245 }
246
247 return ($string);
248}
249
250/* iso-8859-2 is used for some eastern European languages */
251function charset_decode_iso_8859_2 ($string) {
252 global $default_charset;
253
254 if (strtolower($default_charset) == 'iso-8859-2')
255 return $string;
256
257 /* Only do the slow convert if there are 8-bit characters */
258 if (! ereg("[\200-\377]", $string))
259 return $string;
260
261 /* NO-BREAK SPACE */
262 $string = str_replace("\240", '&#160;', $string);
263 /* LATIN CAPITAL LETTER A WITH OGONEK */
264 $string = str_replace("\241", '&#260;', $string);
265 /* BREVE */
266 $string = str_replace("\242", '&#728;', $string);
267 // LATIN CAPITAL LETTER L WITH STROKE
268 $string = str_replace("\243", '&#321;', $string);
269 // CURRENCY SIGN
270 $string = str_replace("\244", '&#164;', $string);
271 // LATIN CAPITAL LETTER L WITH CARON
272 $string = str_replace("\245", '&#317;', $string);
273 // LATIN CAPITAL LETTER S WITH ACUTE
274 $string = str_replace("\246", '&#346;', $string);
275 // SECTION SIGN
276 $string = str_replace("\247", '&#167;', $string);
277 // DIAERESIS
278 $string = str_replace("\250", '&#168;', $string);
279 // LATIN CAPITAL LETTER S WITH CARON
280 $string = str_replace("\251", '&#352;', $string);
281 // LATIN CAPITAL LETTER S WITH CEDILLA
282 $string = str_replace("\252", '&#350;', $string);
283 // LATIN CAPITAL LETTER T WITH CARON
284 $string = str_replace("\253", '&#356;', $string);
285 // LATIN CAPITAL LETTER Z WITH ACUTE
286 $string = str_replace("\254", '&#377;', $string);
287 // SOFT HYPHEN
288 $string = str_replace("\255", '&#173;', $string);
289 // LATIN CAPITAL LETTER Z WITH CARON
290 $string = str_replace("\256", '&#381;', $string);
291 // LATIN CAPITAL LETTER Z WITH DOT ABOVE
292 $string = str_replace("\257", '&#379;', $string);
293 // DEGREE SIGN
294 $string = str_replace("\260", '&#176;', $string);
295 // LATIN SMALL LETTER A WITH OGONEK
296 $string = str_replace("\261", '&#261;', $string);
297 // OGONEK
298 $string = str_replace("\262", '&#731;', $string);
299 // LATIN SMALL LETTER L WITH STROKE
300 $string = str_replace("\263", '&#322;', $string);
301 // ACUTE ACCENT
302 $string = str_replace("\264", '&#180;', $string);
303 // LATIN SMALL LETTER L WITH CARON
304 $string = str_replace("\265", '&#318;', $string);
305 // LATIN SMALL LETTER S WITH ACUTE
306 $string = str_replace("\266", '&#347;', $string);
307 // CARON
308 $string = str_replace("\267", '&#711;', $string);
309 // CEDILLA
310 $string = str_replace("\270", '&#184;', $string);
311 // LATIN SMALL LETTER S WITH CARON
312 $string = str_replace("\271", '&#353;', $string);
313 // LATIN SMALL LETTER S WITH CEDILLA
314 $string = str_replace("\272", '&#351;', $string);
315 // LATIN SMALL LETTER T WITH CARON
316 $string = str_replace("\273", '&#357;', $string);
317 // LATIN SMALL LETTER Z WITH ACUTE
318 $string = str_replace("\274", '&#378;', $string);
319 // DOUBLE ACUTE ACCENT
320 $string = str_replace("\275", '&#733;', $string);
321 // LATIN SMALL LETTER Z WITH CARON
322 $string = str_replace("\276", '&#382;', $string);
323 // LATIN SMALL LETTER Z WITH DOT ABOVE
324 $string = str_replace("\277", '&#380;', $string);
325 // LATIN CAPITAL LETTER R WITH ACUTE
326 $string = str_replace("\300", '&#340;', $string);
327 // LATIN CAPITAL LETTER A WITH ACUTE
328 $string = str_replace("\301", '&#193;', $string);
329 // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
330 $string = str_replace("\302", '&#194;', $string);
331 // LATIN CAPITAL LETTER A WITH BREVE
332 $string = str_replace("\303", '&#258;', $string);
333 // LATIN CAPITAL LETTER A WITH DIAERESIS
334 $string = str_replace("\304", '&#196;', $string);
335 // LATIN CAPITAL LETTER L WITH ACUTE
336 $string = str_replace("\305", '&#313;', $string);
337 // LATIN CAPITAL LETTER C WITH ACUTE
338 $string = str_replace("\306", '&#262;', $string);
339 // LATIN CAPITAL LETTER C WITH CEDILLA
340 $string = str_replace("\307", '&#199;', $string);
341 // LATIN CAPITAL LETTER C WITH CARON
342 $string = str_replace("\310", '&#268;', $string);
343 // LATIN CAPITAL LETTER E WITH ACUTE
344 $string = str_replace("\311", '&#201;', $string);
345 // LATIN CAPITAL LETTER E WITH OGONEK
346 $string = str_replace("\312", '&#280;', $string);
347 // LATIN CAPITAL LETTER E WITH DIAERESIS
348 $string = str_replace("\313", '&#203;', $string);
349 // LATIN CAPITAL LETTER E WITH CARON
350 $string = str_replace("\314", '&#282;', $string);
351 // LATIN CAPITAL LETTER I WITH ACUTE
352 $string = str_replace("\315", '&#205;', $string);
353 // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
354 $string = str_replace("\316", '&#206;', $string);
355 // LATIN CAPITAL LETTER D WITH CARON
356 $string = str_replace("\317", '&#270;', $string);
357 // LATIN CAPITAL LETTER D WITH STROKE
358 $string = str_replace("\320", '&#272;', $string);
359 // LATIN CAPITAL LETTER N WITH ACUTE
360 $string = str_replace("\321", '&#323;', $string);
361 // LATIN CAPITAL LETTER N WITH CARON
362 $string = str_replace("\322", '&#327;', $string);
363 // LATIN CAPITAL LETTER O WITH ACUTE
364 $string = str_replace("\323", '&#211;', $string);
365 // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
366 $string = str_replace("\324", '&#212;', $string);
367 // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
368 $string = str_replace("\325", '&#336;', $string);
369 // LATIN CAPITAL LETTER O WITH DIAERESIS
370 $string = str_replace("\326", '&#214;', $string);
371 // MULTIPLICATION SIGN
372 $string = str_replace("\327", '&#215;', $string);
373 // LATIN CAPITAL LETTER R WITH CARON
374 $string = str_replace("\330", '&#344;', $string);
375 // LATIN CAPITAL LETTER U WITH RING ABOVE
376 $string = str_replace("\331", '&#366;', $string);
377 // LATIN CAPITAL LETTER U WITH ACUTE
378 $string = str_replace("\332", '&#218;', $string);
379 // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
380 $string = str_replace("\333", '&#368;', $string);
381 // LATIN CAPITAL LETTER U WITH DIAERESIS
382 $string = str_replace("\334", '&#220;', $string);
383 // LATIN CAPITAL LETTER Y WITH ACUTE
384 $string = str_replace("\335", '&#221;', $string);
385 // LATIN CAPITAL LETTER T WITH CEDILLA
386 $string = str_replace("\336", '&#354;', $string);
387 // LATIN SMALL LETTER SHARP S
388 $string = str_replace("\337", '&#223;', $string);
389 // LATIN SMALL LETTER R WITH ACUTE
390 $string = str_replace("\340", '&#341;', $string);
391 // LATIN SMALL LETTER A WITH ACUTE
392 $string = str_replace("\341", '&#225;', $string);
393 // LATIN SMALL LETTER A WITH CIRCUMFLEX
394 $string = str_replace("\342", '&#226;', $string);
395 // LATIN SMALL LETTER A WITH BREVE
396 $string = str_replace("\343", '&#259;', $string);
397 // LATIN SMALL LETTER A WITH DIAERESIS
398 $string = str_replace("\344", '&#228;', $string);
399 // LATIN SMALL LETTER L WITH ACUTE
400 $string = str_replace("\345", '&#314;', $string);
401 // LATIN SMALL LETTER C WITH ACUTE
402 $string = str_replace("\346", '&#263;', $string);
403 // LATIN SMALL LETTER C WITH CEDILLA
404 $string = str_replace("\347", '&#231;', $string);
405 // LATIN SMALL LETTER C WITH CARON
406 $string = str_replace("\350", '&#269;', $string);
407 // LATIN SMALL LETTER E WITH ACUTE
408 $string = str_replace("\351", '&#233;', $string);
409 // LATIN SMALL LETTER E WITH OGONEK
410 $string = str_replace("\352", '&#281;', $string);
411 // LATIN SMALL LETTER E WITH DIAERESIS
412 $string = str_replace("\353", '&#235;', $string);
413 // LATIN SMALL LETTER E WITH CARON
414 $string = str_replace("\354", '&#283;', $string);
415 // LATIN SMALL LETTER I WITH ACUTE
416 $string = str_replace("\355", '&#237;', $string);
417 // LATIN SMALL LETTER I WITH CIRCUMFLEX
418 $string = str_replace("\356", '&#238;', $string);
419 // LATIN SMALL LETTER D WITH CARON
420 $string = str_replace("\357", '&#271;', $string);
421 // LATIN SMALL LETTER D WITH STROKE
422 $string = str_replace("\360", '&#273;', $string);
423 // LATIN SMALL LETTER N WITH ACUTE
424 $string = str_replace("\361", '&#324;', $string);
425 // LATIN SMALL LETTER N WITH CARON
426 $string = str_replace("\362", '&#328;', $string);
427 // LATIN SMALL LETTER O WITH ACUTE
428 $string = str_replace("\363", '&#243;', $string);
429 // LATIN SMALL LETTER O WITH CIRCUMFLEX
430 $string = str_replace("\364", '&#244;', $string);
431 // LATIN SMALL LETTER O WITH DOUBLE ACUTE
432 $string = str_replace("\365", '&#337;', $string);
433 // LATIN SMALL LETTER O WITH DIAERESIS
434 $string = str_replace("\366", '&#246;', $string);
435 // DIVISION SIGN
436 $string = str_replace("\367", '&#247;', $string);
437 // LATIN SMALL LETTER R WITH CARON
438 $string = str_replace("\370", '&#345;', $string);
439 // LATIN SMALL LETTER U WITH RING ABOVE
440 $string = str_replace("\371", '&#367;', $string);
441 // LATIN SMALL LETTER U WITH ACUTE
442 $string = str_replace("\372", '&#250;', $string);
443 // LATIN SMALL LETTER U WITH DOUBLE ACUTE
444 $string = str_replace("\373", '&#369;', $string);
445 // LATIN SMALL LETTER U WITH DIAERESIS
446 $string = str_replace("\374", '&#252;', $string);
447 // LATIN SMALL LETTER Y WITH ACUTE
448 $string = str_replace("\375", '&#253;', $string);
449 // LATIN SMALL LETTER T WITH CEDILLA
450 $string = str_replace("\376", '&#355;', $string);
451 // DOT ABOVE
452 $string = str_replace("\377", '&#729;', $string);
453
454 return $string;
455}
456
9be313d5 457/*
c37a12f8 458 ISO/IEC 8859-4:1998 Latin Alphabet No. 4
9be313d5 459*/
460
461function charset_decode_iso_8859_4 ($string) {
94965562 462 global $default_charset;
9be313d5 463
c37a12f8 464 if (strtolower($default_charset) == 'iso-8859-4')
465 return $string;
c37a12f8 466
467 /* Only do the slow convert if there are 8-bit characters */
468 if (! ereg("[\200-\377]", $string))
469 return $string;
470
c37a12f8 471 $string = str_replace ("\241", '&#260;', $string);
c37a12f8 472 $string = str_replace ("\242", '&#312;', $string);
c37a12f8 473 $string = str_replace ("\243", '&#342;', $string);
c37a12f8 474 $string = str_replace ("\245", '&#296;', $string);
c37a12f8 475 $string = str_replace ("\246", '&#315;', $string);
c37a12f8 476 $string = str_replace ("\251", '&#352;', $string);
c37a12f8 477 $string = str_replace ("\252", '&#274;', $string);
c37a12f8 478 $string = str_replace ("\253", '&#290;', $string);
c37a12f8 479 $string = str_replace ("\254", '&#358;', $string);
c37a12f8 480 $string = str_replace ("\256", '&#381;', $string);
c37a12f8 481 $string = str_replace ("\261", '&#261;', $string);
c37a12f8 482 $string = str_replace ("\262", '&#731;', $string);
c37a12f8 483 $string = str_replace ("\263", '&#343;', $string);
c37a12f8 484 $string = str_replace ("\265", '&#297;', $string);
c37a12f8 485 $string = str_replace ("\266", '&#316;', $string);
c37a12f8 486 $string = str_replace ("\267", '&#711;', $string);
c37a12f8 487 $string = str_replace ("\271", '&#353;', $string);
c37a12f8 488 $string = str_replace ("\272", '&#275;', $string);
c37a12f8 489 $string = str_replace ("\273", '&#291;', $string);
c37a12f8 490 $string = str_replace ("\274", '&#359;', $string);
c37a12f8 491 $string = str_replace ("\275", '&#330;', $string);
c37a12f8 492 $string = str_replace ("\276", '&#382;', $string);
c37a12f8 493 $string = str_replace ("\277", '&#331;', $string);
c37a12f8 494 $string = str_replace ("\300", '&#256;', $string);
c37a12f8 495 $string = str_replace ("\307", '&#302;', $string);
c37a12f8 496 $string = str_replace ("\310", '&#268;', $string);
c37a12f8 497 $string = str_replace ("\312", '&#280;', $string);
c37a12f8 498 $string = str_replace ("\314", '&#278;', $string);
c37a12f8 499 $string = str_replace ("\317", '&#298;', $string);
c37a12f8 500 $string = str_replace ("\320", '&#272;', $string);
c37a12f8 501 $string = str_replace ("\321", '&#325;', $string);
c37a12f8 502 $string = str_replace ("\322", '&#332;', $string);
c37a12f8 503 $string = str_replace ("\323", '&#310;', $string);
c37a12f8 504 $string = str_replace ("\331", '&#370;', $string);
c37a12f8 505 $string = str_replace ("\335", '&#360;', $string);
c37a12f8 506 $string = str_replace ("\336", '&#362;', $string);
c37a12f8 507 $string = str_replace ("\340", '&#257;', $string);
c37a12f8 508 $string = str_replace ("\347", '&#303;', $string);
c37a12f8 509 $string = str_replace ("\350", '&#269;', $string);
c37a12f8 510 $string = str_replace ("\352", '&#281;', $string);
c37a12f8 511 $string = str_replace ("\354", '&#279;', $string);
c37a12f8 512 $string = str_replace ("\357", '&#299;', $string);
c37a12f8 513 $string = str_replace ("\360", '&#273;', $string);
c37a12f8 514 $string = str_replace ("\361", '&#326;', $string);
c37a12f8 515 $string = str_replace ("\362", '&#333;', $string);
c37a12f8 516 $string = str_replace ("\363", '&#311;', $string);
c37a12f8 517 $string = str_replace ("\371", '&#371;', $string);
c37a12f8 518 $string = str_replace ("\375", '&#361;', $string);
c37a12f8 519 $string = str_replace ("\376", '&#363;', $string);
c37a12f8 520 $string = str_replace ("\377", '&#729;', $string);
521
522 // rest of charset is the same as ISO-8859-1
9be313d5 523 return (charset_decode_iso_8859_1($string));
524}
525
1c0e847f 526/* ISO-8859-5 is Cyrillic */
527function charset_decode_iso_8859_5 ($string) {
528 global $default_charset;
529
530 if (strtolower($default_charset) == 'iso-8859-5') {
531 return $string;
532 }
533
534 /* Only do the slow convert if there are 8-bit characters */
535 if (! ereg("[\200-\377]", $string))
536 return $string;
537
538 // NO-BREAK SPACE
539 $string = str_replace("\240", '&#160;', $string);
540 // 161-172 -> 1025-1036 (+864)
541 $string = preg_replace("/([\241-\254])/e","'&#' . (ord('\\1')+864) . ';'",$string);
542 // SOFT HYPHEN
543 $string = str_replace("\255", '&#173;', $string);
544 // 174-239 -> 1038-1103 (+864)
545 $string = preg_replace("/([\256-\357])/e","'&#' . (ord('\\1')+864) . ';'",$string);
546 // NUMERO SIGN
547 $string = str_replace("\360", '&#8470;', $string);
548 // 241-252 -> 1105-1116 (+864)
549 $string = preg_replace("/([\361-\374])/e","'&#' . (ord('\\1')+864) . ';'",$string);
550 // SECTION SIGN
551 $string = str_replace("\375", '&#167;', $string);
552 // CYRILLIC SMALL LETTER SHORT U (Byelorussian)
553 $string = str_replace("\376", '&#1118;', $string);
554 // CYRILLIC SMALL LETTER DZHE
555 $string = str_replace("\377", '&#1119;', $string);
556
557 return $string;
558}
559
ef82d2d5 560/*
561 ISO/IEC 8859-6:1999 Latin/Arabic Alphabet
562*/
563function charset_decode_iso_8859_6 ($string) {
564 global $default_charset;
565
566 if (strtolower($default_charset) == 'iso-8859-6')
567 return $string;
568
569 /* Only do the slow convert if there are 8-bit characters */
570 if (! ereg("[\200-\377]", $string))
571 return $string;
572
573 $string = str_replace ("\240", '&#160;', $string);
574 $string = str_replace ("\244", '&#164;', $string);
575 $string = str_replace ("\254", '&#1548;', $string);
576 $string = str_replace ("\255", '&#173;', $string);
577 $string = str_replace ("\273", '&#1563;', $string);
578 $string = str_replace ("\277", '&#1567;', $string);
579 // 193-218 -> 1569-1594 (+1376)
580 $string = preg_replace("/([\301-\332])/e","'&#' . (ord('\\1')+1376).';'",$string);
581 // 224-242 -> 1600-1618 (+1376)
582 $string = preg_replace("/([\340-\362])/e","'&#' . (ord('\\1')+1376).';'",$string);
583
584 return ($string);
585}
586
a2a7852b 587/* iso-8859-7 is Greek. */
588function charset_decode_iso_8859_7 ($string) {
589 global $default_charset;
590
591 if (strtolower($default_charset) == 'iso-8859-7') {
592 return $string;
593 }
594
595 /* Only do the slow convert if there are 8-bit characters */
596 if (!ereg("[\200-\377]", $string)) {
597 return $string;
598 }
599
600 /* Some diverse characters in the beginning */
601 $string = str_replace("\240", '&#160;', $string);
602 $string = str_replace("\241", '&#8216;', $string);
603 $string = str_replace("\242", '&#8217;', $string);
604 $string = str_replace("\243", '&#163;', $string);
605 $string = str_replace("\246", '&#166;', $string);
606 $string = str_replace("\247", '&#167;', $string);
607 $string = str_replace("\250", '&#168;', $string);
608 $string = str_replace("\251", '&#169;', $string);
609 $string = str_replace("\253", '&#171;', $string);
610 $string = str_replace("\254", '&#172;', $string);
611 $string = str_replace("\255", '&#173;', $string);
612 $string = str_replace("\257", '&#8213;', $string);
613 $string = str_replace("\260", '&#176;', $string);
614 $string = str_replace("\261", '&#177;', $string);
615 $string = str_replace("\262", '&#178;', $string);
616 $string = str_replace("\263", '&#179;', $string);
617
618 /* Horizontal bar (parentheki pavla) */
619 $string = str_replace ("\257", '&#8213;', $string);
620
621 /*
622 * ISO-8859-7 characters from 11/04 (0xB4) to 11/06 (0xB6)
623 * These are Unicode 900-902
624 */
b85a4575 625 $string = preg_replace("/([\264-\266])/e","'&#' . (ord('\\1')+720);",$string);
49c17806 626
a2a7852b 627 /* 11/07 (0xB7) Middle dot is the same in iso-8859-1 */
628 $string = str_replace("\267", '&#183;', $string);
629
630 /*
631 * ISO-8859-7 characters from 11/08 (0xB8) to 11/10 (0xBA)
632 * These are Unicode 900-902
633 */
b85a4575 634 $string = preg_replace("/([\270-\272])/e","'&#' . (ord('\\1')+720);",$string);
a2a7852b 635
636 /*
637 * 11/11 (0xBB) Right angle quotation mark is the same as in
638 * iso-8859-1
639 */
640 $string = str_replace("\273", '&#187;', $string);
641
642 /* And now the rest of the charset */
b85a4575 643 $string = preg_replace("/([\274-\376])/e","'&#'.(ord('\\1')+720);",$string);
a2a7852b 644
645 return $string;
646}
647
3ab35042 648/*
cd21d1aa 649 ISOIEC 8859-9:1999 Latin Alphabet No. 5
961ca3d8 650
3ab35042 651*/
652function charset_decode_iso_8859_9 ($string) {
94965562 653 global $default_charset;
3ab35042 654
655 if (strtolower($default_charset) == 'iso-8859-9')
656 return $string;
3ab35042 657
658 /* Only do the slow convert if there are 8-bit characters */
659 if (! ereg("[\200-\377]", $string))
660 return $string;
661
662 // latin capital letter g with breve 208->286
663 $string = str_replace("\320", '&#286;', $string);
664 // latin capital letter i with dot above 221->304
665 $string = str_replace("\335", '&#304;', $string);
666 // latin capital letter s with cedilla 222->350
667 $string = str_replace("\336", '&#350;', $string);
668 // latin small letter g with breve 240->287
669 $string = str_replace("\360", '&#287;', $string);
670 // latin small letter dotless i 253->305
671 $string = str_replace("\375", '&#305;', $string);
672 // latin small letter s with cedilla 254->351
673 $string = str_replace("\376", '&#351;', $string);
674
675 // rest of charset is the same as ISO-8859-1
676 return (charset_decode_iso_8859_1($string));
677}
678
679
9be313d5 680/*
c37a12f8 681 ISO/IEC 8859-13:1998 Latin Alphabet No. 7 (Baltic Rim)
9be313d5 682*/
9be313d5 683function charset_decode_iso_8859_13 ($string) {
94965562 684 global $default_charset;
c37a12f8 685
686 if (strtolower($default_charset) == 'iso-8859-13')
687 return $string;
c37a12f8 688
689 /* Only do the slow convert if there are 8-bit characters */
690 if (! ereg("[\200-\377]", $string))
691 return $string;
9be313d5 692
c37a12f8 693 $string = str_replace ("\241", '&#8221;', $string);
c37a12f8 694 $string = str_replace ("\245", '&#8222;', $string);
c37a12f8 695 $string = str_replace ("\250", '&#216;', $string);
c37a12f8 696 $string = str_replace ("\252", '&#342;', $string);
c37a12f8 697 $string = str_replace ("\257", '&#198;', $string);
c37a12f8 698 $string = str_replace ("\264", '&#8220;', $string);
c37a12f8 699 $string = str_replace ("\270", '&#248;', $string);
c37a12f8 700 $string = str_replace ("\272", '&#343;', $string);
c37a12f8 701 $string = str_replace ("\277", '&#230;', $string);
c37a12f8 702 $string = str_replace ("\300", '&#260;', $string);
c37a12f8 703 $string = str_replace ("\301", '&#302;', $string);
c37a12f8 704 $string = str_replace ("\302", '&#256;', $string);
c37a12f8 705 $string = str_replace ("\303", '&#262;', $string);
c37a12f8 706 $string = str_replace ("\306", '&#280;', $string);
c37a12f8 707 $string = str_replace ("\307", '&#274;', $string);
c37a12f8 708 $string = str_replace ("\310", '&#268;', $string);
c37a12f8 709 $string = str_replace ("\312", '&#377;', $string);
c37a12f8 710 $string = str_replace ("\313", '&#278;', $string);
c37a12f8 711 $string = str_replace ("\314", '&#290;', $string);
c37a12f8 712 $string = str_replace ("\315", '&#310;', $string);
c37a12f8 713 $string = str_replace ("\316", '&#298;', $string);
c37a12f8 714 $string = str_replace ("\317", '&#315;', $string);
c37a12f8 715 $string = str_replace ("\320", '&#352;', $string);
c37a12f8 716 $string = str_replace ("\321", '&#323;', $string);
c37a12f8 717 $string = str_replace ("\322", '&#325;', $string);
c37a12f8 718 $string = str_replace ("\324", '&#332;', $string);
c37a12f8 719 $string = str_replace ("\330", '&#370;', $string);
c37a12f8 720 $string = str_replace ("\331", '&#321;', $string);
c37a12f8 721 $string = str_replace ("\332", '&#346;', $string);
c37a12f8 722 $string = str_replace ("\333", '&#362;', $string);
c37a12f8 723 $string = str_replace ("\335", '&#379;', $string);
c37a12f8 724 $string = str_replace ("\336", '&#381;', $string);
c37a12f8 725 $string = str_replace ("\340", '&#261;', $string);
c37a12f8 726 $string = str_replace ("\341", '&#303;', $string);
c37a12f8 727 $string = str_replace ("\342", '&#257;', $string);
c37a12f8 728 $string = str_replace ("\343", '&#263;', $string);
c37a12f8 729 $string = str_replace ("\346", '&#281;', $string);
c37a12f8 730 $string = str_replace ("\347", '&#275;', $string);
c37a12f8 731 $string = str_replace ("\350", '&#269;', $string);
c37a12f8 732 $string = str_replace ("\352", '&#378;', $string);
c37a12f8 733 $string = str_replace ("\353", '&#279;', $string);
c37a12f8 734 $string = str_replace ("\354", '&#291;', $string);
c37a12f8 735 $string = str_replace ("\355", '&#311;', $string);
c37a12f8 736 $string = str_replace ("\356", '&#299;', $string);
c37a12f8 737 $string = str_replace ("\357", '&#316;', $string);
c37a12f8 738 $string = str_replace ("\360", '&#353;', $string);
c37a12f8 739 $string = str_replace ("\361", '&#324;', $string);
c37a12f8 740 $string = str_replace ("\362", '&#326;', $string);
c37a12f8 741 $string = str_replace ("\364", '&#333;', $string);
c37a12f8 742 $string = str_replace ("\370", '&#371;', $string);
c37a12f8 743 $string = str_replace ("\371", '&#322;', $string);
c37a12f8 744 $string = str_replace ("\372", '&#347;', $string);
c37a12f8 745 $string = str_replace ("\373", '&#363;', $string);
c37a12f8 746 $string = str_replace ("\375", '&#380;', $string);
c37a12f8 747 $string = str_replace ("\376", '&#382;', $string);
c37a12f8 748 $string = str_replace ("\377", '&#8217;', $string);
749
750 // rest of charset is the same as ISO-8859-1
9be313d5 751 return (charset_decode_iso_8859_1($string));
752}
753
a2a7852b 754/*
755 * iso-8859-15 is Latin 9 and has very much the same use as Latin 1
756 * but has the Euro symbol and some characters needed for French.
757 */
758function charset_decode_iso_8859_15 ($string) {
759 // Euro sign
760 $string = str_replace ("\244", '&#8364;', $string);
761 // Latin capital letter S with caron
84556805 762 $string = str_replace ("\246", '&#352;', $string);
a2a7852b 763 // Latin small letter s with caron
764 $string = str_replace ("\250", '&#353;', $string);
765 // Latin capital letter Z with caron
766 $string = str_replace ("\264", '&#381;', $string);
767 // Latin small letter z with caron
768 $string = str_replace ("\270", '&#382;', $string);
769 // Latin capital ligature OE
770 $string = str_replace ("\274", '&#338;', $string);
771 // Latin small ligature oe
772 $string = str_replace ("\275", '&#339;', $string);
773 // Latin capital letter Y with diaeresis
774 $string = str_replace ("\276", '&#376;', $string);
775
776 return (charset_decode_iso_8859_1($string));
777}
778
a2a7852b 779
780/* Remove all 8 bit characters from all other ISO-8859 character sets */
781function charset_decode_iso_8859_default ($string) {
782 return (strtr($string, "\240\241\242\243\244\245\246\247".
1fd97780 783 "\250\251\252\253\254\255\256\257".
784 "\260\261\262\263\264\265\266\267".
785 "\270\271\272\273\274\275\276\277".
786 "\300\301\302\303\304\305\306\307".
787 "\310\311\312\313\314\315\316\317".
788 "\320\321\322\323\324\325\326\327".
789 "\330\331\332\333\334\335\336\337".
790 "\340\341\342\343\344\345\346\347".
791 "\350\351\352\353\354\355\356\357".
792 "\360\361\362\363\364\365\366\367".
a2a7852b 793 "\370\371\372\373\374\375\376\377",
1fd97780 794 "????????????????????????????????????????".
795 "????????????????????????????????????????".
796 "????????????????????????????????????????".
797 "????????"));
a2a7852b 798
799}
800
801/*
802 * This is the same as ISO-646-NO and is used by some
803 * Microsoft programs when sending Norwegian characters
804 */
805function charset_decode_ns_4551_1 ($string) {
806 /*
807 * These characters are:
808 * Latin capital letter AE
809 * Latin capital letter O with stroke
810 * Latin capital letter A with ring above
811 * and the same as small letters
812 */
813