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