summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/stdio-frontend.c
blob: 3fbed999a5534d51acf4f210dceb5daac099da26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
/*
 * Guillaume Cottenceau (gc@mandrakesoft.com)
 *
 * Copyright 2000 MandrakeSoft
 *
 * This software may be freely redistributed under the terms of the GNU
 * public license.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */


/*
 * Each different frontend must implement all functions defined in frontend.h
 */


#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <termios.h>

#include <probing.h>

#include "frontend.h"


void init_frontend(char * welcome_msg)
{
	printf(welcome_msg);
	printf("\n");
}


void finish_frontend(void)
{
}

static void get_any_response(void)
{
	unsigned char t;
	printf("\n\t(press <enter> to proceed)");
	fflush(stdout);
	read(0, &t, 1);
	fcntl(0, F_SETFL, O_NONBLOCK);
	while (read(0, &t, 1) > 0);
	fcntl(0, F_SETFL, 0);
}
	
static int get_int_response(void)
{
	char s[50];
	int j = 0, i = 0; /* (0) tied to Cancel */
	fflush(stdout);
	read(0, &(s[i++]), 1);
	fcntl(0, F_SETFL, O_NONBLOCK);
	do {
		int v = s[i-1];
		if (v >= '0' && v <= '9')
			j = j*10 + (v - '0');
	} while (read(0, &(s[i++]), 1) > 0 && i < sizeof(s));
	fcntl(0, F_SETFL, 0);
	return j;
}

static char * get_string_response(char * initial_string)
{
	/* I won't use a scanf/%s since I also want the null string to be accepted -- also, I want the initial_string */
	char s[500];
	int i = 0;
	char buf[10];
	int b_index = 0;
	char b;

	struct termios t;

	memset(s, '\0', sizeof(s));

	if (initial_string) {
		printf(initial_string);
		strcpy(s, initial_string);
		i = strlen(s);
	}
	
	/* from ncurses/tinfo/lib_raw.c:(cbreak) */
	tcgetattr(0, &t);
	t.c_lflag &= ~ICANON;
	t.c_lflag |= ISIG;
	t.c_lflag &= ~ECHO;
	t.c_iflag &= ~ICRNL;
	t.c_cc[VMIN] = 1;
	t.c_cc[VTIME] = 0;
	tcsetattr(0, TCSADRAIN, &t);

	fflush(stdout);

	fcntl(0, F_SETFL, O_NONBLOCK);

	while (1) {
		if (read(0, &b, 1) > 0) {
			if (b_index == 1) {
				if (b == 91) {
					buf[b_index] = b;
					b_index++;
					continue;
				}
				else
					b_index = 0;
			}
			if (b_index == 2) {
				if (b == 67) {
					if (s[i] != '\0') {
						printf("\033[C");
						i++;
					}
				}
				if (b == 68) {
					if (i > 0) {
						printf("\033[D");
						i--;
					}
				}
				b_index = 0;
				continue;
			}
				
			if (b == 13)
				break;
			if (b == 127) {
				if (i > 0) {
					printf("\033[D");
					printf(" ");
					printf("\033[D");
					if (s[i] == '\0')
						s[i-1] = '\0';
					else
						s[i-1] = ' ';
					i--;
				}
			} else if (b == 27) {
				buf[b_index] = b;
				b_index++;
			} else {
				printf("%c", b);
				s[i] = b;
				i++;
			}
		}
	}

	t.c_lflag |= ICANON;
	t.c_lflag |= ECHO;
	t.c_iflag |= ICRNL; 
	tcsetattr(0, TCSADRAIN, &t);

	fcntl(0, F_SETFL, 0);

	printf("\n");
	return strdup(s);
}

static void blocking_msg(char *type, char *fmt, va_list ap)
{
	printf(type);
	vprintf(fmt, ap);
	get_any_response();
}

void verror_message(char *msg, va_list ap)
{
	blocking_msg("> Error! ", msg, ap);
}

void vinfo_message(char *msg, va_list ap)
{
	blocking_msg("> Notice: ", msg, ap);
}

void vwait_message(char *msg, va_list ap)
{
	printf("Please wait: ");
	vprintf(msg, ap);
	fflush(stdout);
}

void remove_wait_message(void)
{
	printf("\n");
}


static int size_progress;
static int actually_drawn;
#define PROGRESS_SIZE 45
void init_progression(char *msg, int size)
{
	int i;
	size_progress = size;
	printf("%s  ", msg);
	if (size) {
		actually_drawn = 0;
		for (i=0; i<PROGRESS_SIZE; i++)
			printf(".");
		printf("]\033[G%s [", msg);		/* only works on ANSI-compatibles */
		fflush(stdout);
	} else
		printf("\n");
}

void update_progression(int current_size)
{
	if (size_progress) {
		if (current_size > size_progress)
			current_size = size_progress;
		while ((int)((current_size*PROGRESS_SIZE)/size_progress) > actually_drawn) {
			printf("*");
			actually_drawn++;
		}
	} else
		printf("\033[GStatus: [%8d] bytes loaded...", current_size);
	
	fflush(stdout);
}

void end_progression(void)
{
	if (size_progress) {
		update_progression(size_progress);
		printf("]\n");
	} else
		printf(" done.\n");
}


enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice)
{
	int justify_number = 1;
	void print_choice_number(int i) {
		char tmp[500];
		snprintf(tmp, sizeof(tmp), "[%%%dd]", justify_number);
		printf(tmp, i);
	}
	char ** sav_elems = elems;
	int i = 1;
	int j = 0;

	probe_that_type(USB_CONTROLLERS, BUS_USB); // we'd need the keyboard for interactions so...

	while (elems && *elems) {
		elems++;
		i++;
	}
	if (i >= 10)
		justify_number = 2;

	elems = sav_elems;
	i = 1;

	printf("> %s\n", msg);
	print_choice_number(0);
	printf(" Cancel");

	while (elems && *elems) {
		if (elems_comments && *elems_comments) {
			printf("\n");
			print_choice_number(i);
			printf(" %s (%s)", *elems, *elems_comments);
			j = 0;
		} else {
			if (j == 0)
				printf("\n");n1293'>1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
<?php
function iso_8859_1($string)
{
	return utf8_encode($string);
}

function iso_8859_2($string)
{
	static $transform = array(
		"\x80" => "\xC2\x80",
		"\x81" => "\xC2\x81",
		"\x82" => "\xC2\x82",
		"\x83" => "\xC2\x83",
		"\x84" => "\xC2\x84",
		"\x85" => "\xC2\x85",
		"\x86" => "\xC2\x86",
		"\x87" => "\xC2\x87",
		"\x88" => "\xC2\x88",
		"\x89" => "\xC2\x89",
		"\x8A" => "\xC2\x8A",
		"\x8B" => "\xC2\x8B",
		"\x8C" => "\xC2\x8C",
		"\x8D" => "\xC2\x8D",
		"\x8E" => "\xC2\x8E",
		"\x8F" => "\xC2\x8F",
		"\x90" => "\xC2\x90",
		"\x91" => "\xC2\x91",
		"\x92" => "\xC2\x92",
		"\x93" => "\xC2\x93",
		"\x94" => "\xC2\x94",
		"\x95" => "\xC2\x95",
		"\x96" => "\xC2\x96",
		"\x97" => "\xC2\x97",
		"\x98" => "\xC2\x98",
		"\x99" => "\xC2\x99",
		"\x9A" => "\xC2\x9A",
		"\x9B" => "\xC2\x9B",
		"\x9C" => "\xC2\x9C",
		"\x9D" => "\xC2\x9D",
		"\x9E" => "\xC2\x9E",
		"\x9F" => "\xC2\x9F",
		"\xA0" => "\xC2\xA0",
		"\xA1" => "\xC4\x84",
		"\xA2" => "\xCB\x98",
		"\xA3" => "\xC5\x81",
		"\xA4" => "\xC2\xA4",
		"\xA5" => "\xC4\xBD",
		"\xA6" => "\xC5\x9A",
		"\xA7" => "\xC2\xA7",
		"\xA8" => "\xC2\xA8",
		"\xA9" => "\xC5\xA0",
		"\xAA" => "\xC5\x9E",
		"\xAB" => "\xC5\xA4",
		"\xAC" => "\xC5\xB9",
		"\xAD" => "\xC2\xAD",
		"\xAE" => "\xC5\xBD",
		"\xAF" => "\xC5\xBB",
		"\xB0" => "\xC2\xB0",
		"\xB1" => "\xC4\x85",
		"\xB2" => "\xCB\x9B",
		"\xB3" => "\xC5\x82",
		"\xB4" => "\xC2\xB4",
		"\xB5" => "\xC4\xBE",
		"\xB6" => "\xC5\x9B",
		"\xB7" => "\xCB\x87",
		"\xB8" => "\xC2\xB8",
		"\xB9" => "\xC5\xA1",
		"\xBA" => "\xC5\x9F",
		"\xBB" => "\xC5\xA5",
		"\xBC" => "\xC5\xBA",
		"\xBD" => "\xCB\x9D",
		"\xBE" => "\xC5\xBE",
		"\xBF" => "\xC5\xBC",
		"\xC0" => "\xC5\x94",
		"\xC1" => "\xC3\x81",
		"\xC2" => "\xC3\x82",
		"\xC3" => "\xC4\x82",
		"\xC4" => "\xC3\x84",
		"\xC5" => "\xC4\xB9",
		"\xC6" => "\xC4\x86",
		"\xC7" => "\xC3\x87",
		"\xC8" => "\xC4\x8C",
		"\xC9" => "\xC3\x89",
		"\xCA" => "\xC4\x98",
		"\xCB" => "\xC3\x8B",
		"\xCC" => "\xC4\x9A",
		"\xCD" => "\xC3\x8D",
		"\xCE" => "\xC3\x8E",
		"\xCF" => "\xC4\x8E",
		"\xD0" => "\xC4\x90",
		"\xD1" => "\xC5\x83",
		"\xD2" => "\xC5\x87",
		"\xD3" => "\xC3\x93",
		"\xD4" => "\xC3\x94",
		"\xD5" => "\xC5\x90",
		"\xD6" => "\xC3\x96",
		"\xD7" => "\xC3\x97",
		"\xD8" => "\xC5\x98",
		"\xD9" => "\xC5\xAE",
		"\xDA" => "\xC3\x9A",
		"\xDB" => "\xC5\xB0",
		"\xDC" => "\xC3\x9C",
		"\xDD" => "\xC3\x9D",
		"\xDE" => "\xC5\xA2",
		"\xDF" => "\xC3\x9F",
		"\xE0" => "\xC5\x95",
		"\xE1" => "\xC3\xA1",
		"\xE2" => "\xC3\xA2",
		"\xE3" => "\xC4\x83",
		"\xE4" => "\xC3\xA4",
		"\xE5" => "\xC4\xBA",
		"\xE6" => "\xC4\x87",
		"\xE7" => "\xC3\xA7",
		"\xE8" => "\xC4\x8D",
		"\xE9" => "\xC3\xA9",
		"\xEA" => "\xC4\x99",
		"\xEB" => "\xC3\xAB",
		"\xEC" => "\xC4\x9B",
		"\xED" => "\xC3\xAD",
		"\xEE" => "\xC3\xAE",
		"\xEF" => "\xC4\x8F",
		"\xF0" => "\xC4\x91",
		"\xF1" => "\xC5\x84",
		"\xF2" => "\xC5\x88",
		"\xF3" => "\xC3\xB3",
		"\xF4" => "\xC3\xB4",
		"\xF5" => "\xC5\x91",
		"\xF6" => "\xC3\xB6",
		"\xF7" => "\xC3\xB7",
		"\xF8" => "\xC5\x99",
		"\xF9" => "\xC5\xAF",
		"\xFA" => "\xC3\xBA",
		"\xFB" => "\xC5\xB1",
		"\xFC" => "\xC3\xBC",
		"\xFD" => "\xC3\xBD",
		"\xFE" => "\xC5\xA3",
		"\xFF" => "\xCB\x99",
	);
	return strtr($string, $transform);
}

function iso_8859_4($string)
{
	static $transform = array(
		"\x80" => "\xC2\x80",
		"\x81" => "\xC2\x81",
		"\x82" => "\xC2\x82",
		"\x83" => "\xC2\x83",
		"\x84" => "\xC2\x84",
		"\x85" => "\xC2\x85",
		"\x86" => "\xC2\x86",
		"\x87" => "\xC2\x87",
		"\x88" => "\xC2\x88",
		"\x89" => "\xC2\x89",
		"\x8A" => "\xC2\x8A",
		"\x8B" => "\xC2\x8B",
		"\x8C" => "\xC2\x8C",
		"\x8D" => "\xC2\x8D",
		"\x8E" => "\xC2\x8E",
		"\x8F" => "\xC2\x8F",
		"\x90" => "\xC2\x90",
		"\x91" => "\xC2\x91",
		"\x92" => "\xC2\x92",
		"\x93" => "\xC2\x93",
		"\x94" => "\xC2\x94",
		"\x95" => "\xC2\x95",
		"\x96" => "\xC2\x96",
		"\x97" => "\xC2\x97",
		"\x98" => "\xC2\x98",
		"\x99" => "\xC2\x99",
		"\x9A" => "\xC2\x9A",
		"\x9B" => "\xC2\x9B",
		"\x9C" => "\xC2\x9C",
		"\x9D" => "\xC2\x9D",
		"\x9E" => "\xC2\x9E",
		"\x9F" => "\xC2\x9F",
		"\xA0" => "\xC2\xA0",
		"\xA1" => "\xC4\x84",
		"\xA2" => "\xC4\xB8",
		"\xA3" => "\xC5\x96",
		"\xA4" => "\xC2\xA4",
		"\xA5" => "\xC4\xA8",
		"\xA6" => "\xC4\xBB",
		"\xA7" => "\xC2\xA7",
		"\xA8" => "\xC2\xA8",
		"\xA9" => "\xC5\xA0",
		"\xAA" => "\xC4\x92",
		"\xAB" => "\xC4\xA2",
		"\xAC" => "\xC5\xA6",
		"\xAD" => "\xC2\xAD",
		"\xAE" => "\xC5\xBD",
		"\xAF" => "\xC2\xAF",
		"\xB0" => "\xC2\xB0",
		"\xB1" => "\xC4\x85",
		"\xB2" => "\xCB\x9B",
		"\xB3" => "\xC5\x97",
		"\xB4" => "\xC2\xB4",
		"\xB5" => "\xC4\xA9",
		"\xB6" => "\xC4\xBC",
		"\xB7" => "\xCB\x87",
		"\xB8" => "\xC2\xB8",
		"\xB9" => "\xC5\xA1",
		"\xBA" => "\xC4\x93",
		"\xBB" => "\xC4\xA3",
		"\xBC" => "\xC5\xA7",
		"\xBD" => "\xC5\x8A",
		"\xBE" => "\xC5\xBE",
		"\xBF" => "\xC5\x8B",
		"\xC0" => "\xC4\x80",
		"\xC1" => "\xC3\x81",
		"\xC2" => "\xC3\x82",
		"\xC3" => "\xC3\x83",
		"\xC4" => "\xC3\x84",
		"\xC5" => "\xC3\x85",
		"\xC6" => "\xC3\x86",
		"\xC7" => "\xC4\xAE",
		"\xC8" => "\xC4\x8C",
		"\xC9" => "\xC3\x89",
		"\xCA" => "\xC4\x98",
		"\xCB" => "\xC3\x8B",
		"\xCC" => "\xC4\x96",
		"\xCD" => "\xC3\x8D",
		"\xCE" => "\xC3\x8E",
		"\xCF" => "\xC4\xAA",
		"\xD0" => "\xC4\x90",
		"\xD1" => "\xC5\x85",
		"\xD2" => "\xC5\x8C",
		"\xD3" => "\xC4\xB6",
		"\xD4" => "\xC3\x94",
		"\xD5" => "\xC3\x95",
		"\xD6" => "\xC3\x96",
		"\xD7" => "\xC3\x97",
		"\xD8" => "\xC3\x98",
		"\xD9" => "\xC5\xB2",
		"\xDA" => "\xC3\x9A",
		"\xDB" => "\xC3\x9B",
		"\xDC" => "\xC3\x9C",
		"\xDD" => "\xC5\xA8",
		"\xDE" => "\xC5\xAA",
		"\xDF" => "\xC3\x9F",
		"\xE0" => "\xC4\x81",
		"\xE1" => "\xC3\xA1",
		"\xE2" => "\xC3\xA2",
		"\xE3" => "\xC3\xA3",
		"\xE4" => "\xC3\xA4",
		"\xE5" => "\xC3\xA5",
		"\xE6" => "\xC3\xA6",
		"\xE7" => "\xC4\xAF",
		"\xE8" => "\xC4\x8D",
		"\xE9" => "\xC3\xA9",
		"\xEA" => "\xC4\x99",
		"\xEB" => "\xC3\xAB",
		"\xEC" => "\xC4\x97",
		"\xED" => "\xC3\xAD",
		"\xEE" => "\xC3\xAE",
		"\xEF" => "\xC4\xAB",
		"\xF0" => "\xC4\x91",
		"\xF1" => "\xC5\x86",
		"\xF2" => "\xC5\x8D",
		"\xF3" => "\xC4\xB7",
		"\xF4" => "\xC3\xB4",
		"\xF5" => "\xC3\xB5",
		"\xF6" => "\xC3\xB6",
		"\xF7" => "\xC3\xB7",
		"\xF8" => "\xC3\xB8",
		"\xF9" => "\xC5\xB3",
		"\xFA" => "\xC3\xBA",
		"\xFB" => "\xC3\xBB",
		"\xFC" => "\xC3\xBC",
		"\xFD" => "\xC5\xA9",
		"\xFE" => "\xC5\xAB",
		"\xFF" => "\xCB\x99",
	);
	return strtr($string, $transform);
}

function iso_8859_7($string)
{
	static $transform = array(
		"\x80" => "\xC2\x80",
		"\x81" => "\xC2\x81",
		"\x82" => "\xC2\x82",
		"\x83" => "\xC2\x83",
		"\x84" => "\xC2\x84",
		"\x85" => "\xC2\x85",
		"\x86" => "\xC2\x86",
		"\x87" => "\xC2\x87",
		"\x88" => "\xC2\x88",
		"\x89" => "\xC2\x89",
		"\x8A" => "\xC2\x8A",
		"\x8B" => "\xC2\x8B",
		"\x8C" => "\xC2\x8C",
		"\x8D" => "\xC2\x8D",
		"\x8E" => "\xC2\x8E",
		"\x8F" => "\xC2\x8F",
		"\x90" => "\xC2\x90",
		"\x91" => "\xC2\x91",
		"\x92" => "\xC2\x92",
		"\x93" => "\xC2\x93",
		"\x94" => "\xC2\x94",
		"\x95" => "\xC2\x95",
		"\x96" => "\xC2\x96",
		"\x97" => "\xC2\x97",
		"\x98" => "\xC2\x98",
		"\x99" => "\xC2\x99",
		"\x9A" => "\xC2\x9A",
		"\x9B" => "\xC2\x9B",
		"\x9C" => "\xC2\x9C",
		"\x9D" => "\xC2\x9D",
		"\x9E" => "\xC2\x9E",
		"\x9F" => "\xC2\x9F",
		"\xA0" => "\xC2\xA0",
		"\xA1" => "\xE2\x80\x98",
		"\xA2" => "\xE2\x80\x99",
		"\xA3" => "\xC2\xA3",
		"\xA4" => "\xE2\x82\xAC",
		"\xA5" => "\xE2\x82\xAF",
		"\xA6" => "\xC2\xA6",
		"\xA7" => "\xC2\xA7",
		"\xA8" => "\xC2\xA8",
		"\xA9" => "\xC2\xA9",
		"\xAA" => "\xCD\xBA",
		"\xAB" => "\xC2\xAB",
		"\xAC" => "\xC2\xAC",
		"\xAD" => "\xC2\xAD",
		"\xAF" => "\xE2\x80\x95",
		"\xB0" => "\xC2\xB0",
		"\xB1" => "\xC2\xB1",
		"\xB2" => "\xC2\xB2",
		"\xB3" => "\xC2\xB3",
		"\xB4" => "\xCE\x84",
		"\xB5" => "\xCE\x85",
		"\xB6" => "\xCE\x86",
		"\xB7" => "\xC2\xB7",
		"\xB8" => "\xCE\x88",
		"\xB9" => "\xCE\x89",
		"\xBA" => "\xCE\x8A",
		"\xBB" => "\xC2\xBB",
		"\xBC" => "\xCE\x8C",
		"\xBD" => "\xC2\xBD",
		"\xBE" => "\xCE\x8E",
		"\xBF" => "\xCE\x8F",
		"\xC0" => "\xCE\x90",
		"\xC1" => "\xCE\x91",
		"\xC2" => "\xCE\x92",
		"\xC3" => "\xCE\x93",
		"\xC4" => "\xCE\x94",
		"\xC5" => "\xCE\x95",
		"\xC6" => "\xCE\x96",
		"\xC7" => "\xCE\x97",
		"\xC8" => "\xCE\x98",
		"\xC9" => "\xCE\x99",
		"\xCA" => "\xCE\x9A",
		"\xCB" => "\xCE\x9B",
		"\xCC" => "\xCE\x9C",
		"\xCD" => "\xCE\x9D",
		"\xCE" => "\xCE\x9E",
		"\xCF" => "\xCE\x9F",
		"\xD0" => "\xCE\xA0",
		"\xD1" => "\xCE\xA1",
		"\xD3" => "\xCE\xA3",
		"\xD4" => "\xCE\xA4",
		"\xD5" => "\xCE\xA5",
		"\xD6" => "\xCE\xA6",
		"\xD7" => "\xCE\xA7",
		"\xD8" => "\xCE\xA8",
		"\xD9" => "\xCE\xA9",
		"\xDA" => "\xCE\xAA",
		"\xDB" => "\xCE\xAB",
		"\xDC" => "\xCE\xAC",
		"\xDD" => "\xCE\xAD",
		"\xDE" => "\xCE\xAE",
		"\xDF" => "\xCE\xAF",
		"\xE0" => "\xCE\xB0",
		"\xE1" => "\xCE\xB1",
		"\xE2" => "\xCE\xB2",
		"\xE3" => "\xCE\xB3",
		"\xE4" => "\xCE\xB4",
		"\xE5" => "\xCE\xB5",
		"\xE6" => "\xCE\xB6",
		"\xE7" => "\xCE\xB7",
		"\xE8" => "\xCE\xB8",
		"\xE9" => "\xCE\xB9",
		"\xEA" => "\xCE\xBA",
		"\xEB" => "\xCE\xBB",
		"\xEC" => "\xCE\xBC",
		"\xED" => "\xCE\xBD",
		"\xEE" => "\xCE\xBE",
		"\xEF" => "\xCE\xBF",
		"\xF0" => "\xCF\x80",
		"\xF1" => "\xCF\x81",
		"\xF2" => "\xCF\x82",
		"\xF3" => "\xCF\x83",
		"\xF4" => "\xCF\x84",
		"\xF5" => "\xCF\x85",
		"\xF6" => "\xCF\x86",
		"\xF7" => "\xCF\x87",
		"\xF8" => "\xCF\x88",
		"\xF9" => "\xCF\x89",
		"\xFA" => "\xCF\x8A",
		"\xFB" => "\xCF\x8B",
		"\xFC" => "\xCF\x8C",
		"\xFD" => "\xCF\x8D",
		"\xFE" => "\xCF\x8E",
	);
	return strtr($string, $transform);
}

function iso_8859_8($string)
{
	static $transform = array(
		"\xC2\xAA" => "\xC3\x97",
		"\xC2\xBA" => "\xC3\xB7",
		"\xC3\x9F" => "\xE2\x80\x97",
		"\xC3\xA0" => "\xD7\x90",
		"\xC3\xA1" => "\xD7\x91",
		"\xC3\xA2" => "\xD7\x92",
		"\xC3\xA3" => "\xD7\x93",
		"\xC3\xA4" => "\xD7\x94",
		"\xC3\xA5" => "\xD7\x95",
		"\xC3\xA6" => "\xD7\x96",
		"\xC3\xA7" => "\xD7\x97",
		"\xC3\xA8" => "\xD7\x98",
		"\xC3\xA9" => "\xD7\x99",
		"\xC3\xAA" => "\xD7\x9A",
		"\xC3\xAB" => "\xD7\x9B",
		"\xC3\xAC" => "\xD7\x9C",
		"\xC3\xAD" => "\xD7\x9D",
		"\xC3\xAE" => "\xD7\x9E",
		"\xC3\xAF" => "\xD7\x9F",
		"\xC3\xB0" => "\xD7\xA0",
		"\xC3\xB1" => "\xD7\xA1",
		"\xC3\xB2" => "\xD7\xA2",
		"\xC3\xB3" => "\xD7\xA3",
		"\xC3\xB4" => "\xD7\xA4",
		"\xC3\xB5" => "\xD7\xA5",
		"\xC3\xB6" => "\xD7\xA6",
		"\xC3\xB7" => "\xD7\xA7",
		"\xC3\xB8" => "\xD7\xA8",
		"\xC3\xB9" => "\xD7\xA9",
		"\xC3\xBA" => "\xD7\xAA",
		"\xC3\xBD" => "\xE2\x80\x8E",
		"\xC3\xBE" => "\xE2\x80\x8F",
	);
	return strtr(utf8_encode($string), $transform);
}

function iso_8859_9($string)
{
	static $transform = array(
		"\xC3\x90" => "\xC4\x9E",
		"\xC3\x9D" => "\xC4\xB0",
		"\xC3\x9E" => "\xC5\x9E",
		"\xC3\xB0" => "\xC4\x9F",
		"\xC3\xBD" => "\xC4\xB1",
		"\xC3\xBE" => "\xC5\x9F",
	);
	return strtr(utf8_encode($string), $transform);
}

function iso_8859_15($string)
{
	static $transform = array(
		"\xC2\xA4" => "\xE2\x82\xAC",
		"\xC2\xA6" => "\xC5\xA0",
		"\xC2\xA8" => "\xC5\xA1",
		"\xC2\xB4" => "\xC5\xBD",
		"\xC2\xB8" => "\xC5\xBE",
		"\xC2\xBC" => "\xC5\x92",
		"\xC2\xBD" => "\xC5\x93",
		"\xC2\xBE" => "\xC5\xB8",
	);
	return strtr(utf8_encode($string), $transform);
}

// nearly the same as iso-8859-11
function tis_620($string)
{
	static $transform = array(
		"\x80" => "\xC2\x80",
		"\x81" => "\xC2\x81",
		"\x82" => "\xC2\x82",
		"\x83" => "\xC2\x83",
		"\x84" => "\xC2\x84",
		"\x85" => "\xC2\x85",
		"\x86" => "\xC2\x86",
		"\x87" => "\xC2\x87",
		"\x88" => "\xC2\x88",
		"\x89" => "\xC2\x89",
		"\x8A" => "\xC2\x8A",
		"\x8B" => "\xC2\x8B",
		"\x8C" => "\xC2\x8C",
		"\x8D" => "\xC2\x8D",
		"\x8E" => "\xC2\x8E",
		"\x8F" => "\xC2\x8F",
		"\x90" => "\xC2\x90",
		"\x91" => "\xC2\x91",
		"\x92" => "\xC2\x92",
		"\x93" => "\xC2\x93",
		"\x94" => "\xC2\x94",
		"\x95" => "\xC2\x95",
		"\x96" => "\xC2\x96",
		"\x97" => "\xC2\x97",
		"\x98" => "\xC2\x98",
		"\x99" => "\xC2\x99",
		"\x9A" => "\xC2\x9A",
		"\x9B" => "\xC2\x9B",
		"\x9C" => "\xC2\x9C",
		"\x9D" => "\xC2\x9D",
		"\x9E" => "\xC2\x9E",
		"\x9F" => "\xC2\x9F",
		"\xA1" => "\xE0\xB8\x81",
		"\xA2" => "\xE0\xB8\x82",
		"\xA3" => "\xE0\xB8\x83",
		"\xA4" => "\xE0\xB8\x84",
		"\xA5" => "\xE0\xB8\x85",
		"\xA6" => "\xE0\xB8\x86",
		"\xA7" => "\xE0\xB8\x87",
		"\xA8" => "\xE0\xB8\x88",
		"\xA9" => "\xE0\xB8\x89",
		"\xAA" => "\xE0\xB8\x8A",
		"\xAB" => "\xE0\xB8\x8B",
		"\xAC" => "\xE0\xB8\x8C",
		"\xAD" => "\xE0\xB8\x8D",
		"\xAE" => "\xE0\xB8\x8E",
		"\xAF" => "\xE0\xB8\x8F",
		"\xB0" => "\xE0\xB8\x90",
		"\xB1" => "\xE0\xB8\x91",
		"\xB2" => "\xE0\xB8\x92",
		"\xB3" => "\xE0\xB8\x93",
		"\xB4" => "\xE0\xB8\x94",
		"\xB5" => "\xE0\xB8\x95",
		"\xB6" => "\xE0\xB8\x96",
		"\xB7" => "\xE0\xB8\x97",
		"\xB8" => "\xE0\xB8\x98",
		"\xB9" => "\xE0\xB8\x99",
		"\xBA" => "\xE0\xB8\x9A",
		"\xBB" => "\xE0\xB8\x9B",
		"\xBC" => "\xE0\xB8\x9C",
		"\xBD" => "\xE0\xB8\x9D",
		"\xBE" => "\xE0\xB8\x9E",
		"\xBF" => "\xE0\xB8\x9F",
		"\xC0" => "\xE0\xB8\xA0",
		"\xC1" => "\xE0\xB8\xA1",
		"\xC2" => "\xE0\xB8\xA2",
		"\xC3" => "\xE0\xB8\xA3",
		"\xC4" => "\xE0\xB8\xA4",
		"\xC5" => "\xE0\xB8\xA5",
		"\xC6" => "\xE0\xB8\xA6",
		"\xC7" => "\xE0\xB8\xA7",
		"\xC8" => "\xE0\xB8\xA8",
		"\xC9" => "\xE0\xB8\xA9",
		"\xCA" => "\xE0\xB8\xAA",
		"\xCB" => "\xE0\xB8\xAB",
		"\xCC" => "\xE0\xB8\xAC",
		"\xCD" => "\xE0\xB8\xAD",
		"\xCE" => "\xE0\xB8\xAE",
		"\xCF" => "\xE0\xB8\xAF",
		"\xD0" => "\xE0\xB8\xB0",
		"\xD1" => "\xE0\xB8\xB1",
		"\xD2" => "\xE0\xB8\xB2",
		"\xD3" => "\xE0\xB8\xB3",
		"\xD4" => "\xE0\xB8\xB4",
		"\xD5" => "\xE0\xB8\xB5",
		"\xD6" => "\xE0\xB8\xB6",
		"\xD7" => "\xE0\xB8\xB7",
		"\xD8" => "\xE0\xB8\xB8",
		"\xD9" => "\xE0\xB8\xB9",
		"\xDA" => "\xE0\xB8\xBA",
		"\xDF" => "\xE0\xB8\xBF",
		"\xE0" => "\xE0\xB9\x80",
		"\xE1" => "\xE0\xB9\x81",
		"\xE2" => "\xE0\xB9\x82",
		"\xE3" => "\xE0\xB9\x83",
		"\xE4" => "\xE0\xB9\x84",
		"\xE5" => "\xE0\xB9\x85",
		"\xE6" => "\xE0\xB9\x86",
		"\xE7" => "\xE0\xB9\x87",
		"\xE8" => "\xE0\xB9\x88",
		"\xE9" => "\xE0\xB9\x89",
		"\xEA" => "\xE0\xB9\x8A",
		"\xEB" => "\xE0\xB9\x8B",
		"\xEC" => "\xE0\xB9\x8C",
		"\xED" => "\xE0\xB9\x8D",
		"\xEE" => "\xE0\xB9\x8E",
		"\xEF" => "\xE0\xB9\x8F",
		"\xF0" => "\xE0\xB9\x90",
		"\xF1" => "\xE0\xB9\x91",
		"\xF2" => "\xE0\xB9\x92",
		"\xF3" => "\xE0\xB9\x93",
		"\xF4" => "\xE0\xB9\x94",
		"\xF5" => "\xE0\xB9\x95",
		"\xF6" => "\xE0\xB9\x96",
		"\xF7" => "\xE0\xB9\x97",
		"\xF8" => "\xE0\xB9\x98",
		"\xF9" => "\xE0\xB9\x99",
		"\xFA" => "\xE0\xB9\x9A",
		"\xFB" => "\xE0\xB9\x9B",
	);
	return strtr($string, $transform);
}

function cp874($string)
{
	static $transform = array(
		"\x80" => "\xE2\x82\xAC",
		"\x85" => "\xE2\x80\xA6",
		"\x91" => "\xE2\x80\x98",
		"\x92" => "\xE2\x80\x99",
		"\x93" => "\xE2\x80\x9C",
		"\x94" => "\xE2\x80\x9D",
		"\x95" => "\xE2\x80\xA2",
		"\x96" => "\xE2\x80\x93",
		"\x97" => "\xE2\x80\x94",
		"\xA0" => "\xC2\xA0",
		"\xA1" => "\xE0\xB8\x81",
		"\xA2" => "\xE0\xB8\x82",
		"\xA3" => "\xE0\xB8\x83",
		"\xA4" => "\xE0\xB8\x84",
		"\xA5" => "\xE0\xB8\x85",
		"\xA6" => "\xE0\xB8\x86",
		"\xA7" => "\xE0\xB8\x87",
		"\xA8" => "\xE0\xB8\x88",
		"\xA9" => "\xE0\xB8\x89",
		"\xAA" => "\xE0\xB8\x8A",
		"\xAB" => "\xE0\xB8\x8B",
		"\xAC" => "\xE0\xB8\x8C",
		"\xAD" => "\xE0\xB8\x8D",
		"\xAE" => "\xE0\xB8\x8E",
		"\xAF" => "\xE0\xB8\x8F",
		"\xB0" => "\xE0\xB8\x90",
		"\xB1" => "\xE0\xB8\x91",
		"\xB2" => "\xE0\xB8\x92",
		"\xB3" => "\xE0\xB8\x93",
		"\xB4" => "\xE0\xB8\x94",
		"\xB5" => "\xE0\xB8\x95",
		"\xB6" => "\xE0\xB8\x96",
		"\xB7" => "\xE0\xB8\x97",
		"\xB8" => "\xE0\xB8\x98",
		"\xB9" => "\xE0\xB8\x99",
		"\xBA" => "\xE0\xB8\x9A",
		"\xBB" => "\xE0\xB8\x9B",
		"\xBC" => "\xE0\xB8\x9C",
		"\xBD" => "\xE0\xB8\x9D",
		"\xBE" => "\xE0\xB8\x9E",
		"\xBF" => "\xE0\xB8\x9F",
		"\xC0" => "\xE0\xB8\xA0",
		"\xC1" => "\xE0\xB8\xA1",
		"\xC2" => "\xE0\xB8\xA2",
		"\xC3" => "\xE0\xB8\xA3",
		"\xC4" => "\xE0\xB8\xA4",
		"\xC5" => "\xE0\xB8\xA5",
		"\xC6" => "\xE0\xB8\xA6",
		"\xC7" => "\xE0\xB8\xA7",
		"\xC8" => "\xE0\xB8\xA8",
		"\xC9" => "\xE0\xB8\xA9",
		"\xCA" => "\xE0\xB8\xAA",
		"\xCB" => "\xE0\xB8\xAB",
		"\xCC" => "\xE0\xB8\xAC",
		"\xCD" => "\xE0\xB8\xAD",
		"\xCE" => "\xE0\xB8\xAE",
		"\xCF" => "\xE0\xB8\xAF",
		"\xD0" => "\xE0\xB8\xB0",
		"\xD1" => "\xE0\xB8\xB1",
		"\xD2" => "\xE0\xB8\xB2",
		"\xD3" => "\xE0\xB8\xB3",
		"\xD4" => "\xE0\xB8\xB4",
		"\xD5" => "\xE0\xB8\xB5",
		"\xD6" => "\xE0\xB8\xB6",
		"\xD7" => "\xE0\xB8\xB7",
		"\xD8" => "\xE0\xB8\xB8",
		"\xD9" => "\xE0\xB8\xB9",
		"\xDA" => "\xE0\xB8\xBA",
		"\xDF" => "\xE0\xB8\xBF",
		"\xE0" => "\xE0\xB9\x80",
		"\xE1" => "\xE0\xB9\x81",
		"\xE2" => "\xE0\xB9\x82",
		"\xE3" => "\xE0\xB9\x83",
		"\xE4" => "\xE0\xB9\x84",
		"\xE5" => "\xE0\xB9\x85",
		"\xE6" => "\xE0\xB9\x86",
		"\xE7" => "\xE0\xB9\x87",
		"\xE8" => "\xE0\xB9\x88",
		"\xE9" => "\xE0\xB9\x89",
		"\xEA" => "\xE0\xB9\x8A",
		"\xEB" => "\xE0\xB9\x8B",
		"\xEC" => "\xE0\xB9\x8C",
		"\xED" => "\xE0\xB9\x8D",
		"\xEE" => "\xE0\xB9\x8E",
		"\xEF" => "\xE0\xB9\x8F",
		"\xF0" => "\xE0\xB9\x90",
		"\xF1" => "\xE0\xB9\x91",
		"\xF2" => "\xE0\xB9\x92",
		"\xF3" => "\xE0\xB9\x93",
		"\xF4" => "\xE0\xB9\x94",
		"\xF5" => "\xE0\xB9\x95",
		"\xF6" => "\xE0\xB9\x96",
		"\xF7" => "\xE0\xB9\x97",
		"\xF8" => "\xE0\xB9\x98",
		"\xF9" => "\xE0\xB9\x99",
		"\xFA" => "\xE0\xB9\x9A",
		"\xFB" => "\xE0\xB9\x9B",
	);
	return strtr($string, $transform);
}

function cp1250($string)
{
	static $transform = array(
		"\x80" => "\xE2\x82\xAC",
		"\x82" => "\xE2\x80\x9A",
		"\x84" => "\xE2\x80\x9E",
		"\x85" => "\xE2\x80\xA6",
		"\x86" => "\xE2\x80\xA0",
		"\x87" => "\xE2\x80\xA1",
		"\x89" => "\xE2\x80\xB0",
		"\x8A" => "\xC5\xA0",
		"\x8B" => "\xE2\x80\xB9",
		"\x8C" => "\xC5\x9A",
		"\x8D" => "\xC5\xA4",
		"\x8E" => "\xC5\xBD",
		"\x8F" => "\xC5\xB9",
		"\x91" => "\xE2\x80\x98",
		"\x92" => "\xE2\x80\x99",
		"\x93" => "\xE2\x80\x9C",
		"\x94" => "\xE2\x80\x9D",
		"\x95" => "\xE2\x80\xA2",
		"\x96" => "\xE2\x80\x93",
		"\x97" => "\xE2\x80\x94",
		"\x99" => "\xE2\x84\xA2",
		"\x9A" => "\xC5\xA1",
		"\x9B" => "\xE2\x80\xBA",
		"\x9C" => "\xC5\x9B",
		"\x9D" => "\xC5\xA5",
		"\x9E" => "\xC5\xBE",
		"\x9F" => "\xC5\xBA",
		"\xA0" => "\xC2\xA0",
		"\xA1" => "\xCB\x87",
		"\xA2" => "\xCB\x98",
		"\xA3" => "\xC5\x81",
		"\xA4" => "\xC2\xA4",
		"\xA5" => "\xC4\x84",
		"\xA6" => "\xC2\xA6",
		"\xA7" => "\xC2\xA7",
		"\xA8" => "\xC2\xA8",
		"\xA9" => "\xC2\xA9",
		"\xAA" => "\xC5\x9E",
		"\xAB" => "\xC2\xAB",
		"\xAC" => "\xC2\xAC",
		"\xAD" => "\xC2\xAD",
		"\xAE" => "\xC2\xAE",
		"\xAF" => "\xC5\xBB",
		"\xB0" => "\xC2\xB0",
		"\xB1" => "\xC2\xB1",
		"\xB2" => "\xCB\x9B",
		"\xB3" => "\xC5\x82",
		"\xB4" => "\xC2\xB4",
		"\xB5" => "\xC2\xB5",
		"\xB6" => "\xC2\xB6",
		"\xB7" => "\xC2\xB7",
		"\xB8" => "\xC2\xB8",
		"\xB9" => "\xC4\x85",
		"\xBA" => "\xC5\x9F",
		"\xBB" => "\xC2\xBB",
		"\xBC" => "\xC4\xBD",
		"\xBD" => "\xCB\x9D",
		"\xBE" => "\xC4\xBE",
		"\xBF" => "\xC5\xBC",
		"\xC0" => "\xC5\x94",
		"\xC1" => "\xC3\x81",
		"\xC2" => "\xC3\x82",
		"\xC3" => "\xC4\x82",
		"\xC4" => "\xC3\x84",
		"\xC5" => "\xC4\xB9",
		"\xC6" => "\xC4\x86",
		"\xC7" => "\xC3\x87",
		"\xC8" => "\xC4\x8C",
		"\xC9" => "\xC3\x89",
		"\xCA" => "\xC4\x98",
		"\xCB" => "\xC3\x8B",
		"\xCC" => "\xC4\x9A",
		"\xCD" => "\xC3\x8D",
		"\xCE" => "\xC3\x8E",
		"\xCF" => "\xC4\x8E",
		"\xD0" => "\xC4\x90",
		"\xD1" => "\xC5\x83",
		"\xD2" => "\xC5\x87",
		"\xD3" => "\xC3\x93",
		"\xD4" => "\xC3\x94",
		"\xD5" => "\xC5\x90",
		"\xD6" => "\xC3\x96",
		"\xD7" => "\xC3\x97",
		"\xD8" => "\xC5\x98",
		"\xD9" => "\xC5\xAE",
		"\xDA" => "\xC3\x9A",
		"\xDB" => "\xC5\xB0",
		"\xDC" => "\xC3\x9C",
		"\xDD" => "\xC3\x9D",
		"\xDE" => "\xC5\xA2",
		"\xDF" => "\xC3\x9F",
		"\xE0" => "\xC5\x95",
		"\xE1" => "\xC3\xA1",
		"\xE2" => "\xC3\xA2",
		"\xE3" => "\xC4\x83",
		"\xE4" => "\xC3\xA4",
		"\xE5" => "\xC4\xBA",
		"\xE6" => "\xC4\x87",
		"\xE7" => "\xC3\xA7",
		"\xE8" => "\xC4\x8D",
		"\xE9" => "\xC3\xA9",
		"\xEA" => "\xC4\x99",
		"\xEB" => "\xC3\xAB",
		"\xEC" => "\xC4\x9B",
		"\xED" => "\xC3\xAD",
		"\xEE" => "\xC3\xAE",
		"\xEF" => "\xC4\x8F",
		"\xF0" => "\xC4\x91",
		"\xF1" => "\xC5\x84",
		"\xF2" => "\xC5\x88",
		"\xF3" => "\xC3\xB3",
		"\xF4" => "\xC3\xB4",
		"\xF5" => "\xC5\x91",
		"\xF6" => "\xC3\xB6",
		"\xF7" => "\xC3\xB7",
		"\xF8" => "\xC5\x99",
		"\xF9" => "\xC5\xAF",
		"\xFA" => "\xC3\xBA",
		"\xFB" => "\xC5\xB1",
		"\xFC" => "\xC3\xBC",
		"\xFD" => "\xC3\xBD",
		"\xFE" => "\xC5\xA3",
		"\xFF" => "\xCB\x99",
	);
	return strtr($string, $transform);
}

function cp1251($string)
{
	static $transform = array(
		"\x80" => "\xD0\x82",
		"\x81" => "\xD0\x83",
		"\x82" => "\xE2\x80\x9A",
		"\x83" => "\xD1\x93",
		"\x84" => "\xE2\x80\x9E",
		"\x85" => "\xE2\x80\xA6",
		"\x86" => "\xE2\x80\xA0",
		"\x87" => "\xE2\x80\xA1",
		"\x88" => "\xE2\x82\xAC",
		"\x89" => "\xE2\x80\xB0",
		"\x8A" => "\xD0\x89",
		"\x8B" => "\xE2\x80\xB9",
		"\x8C" => "\xD0\x8A",
		"\x8D" => "\xD0\x8C",
		"\x8E" => "\xD0\x8B",
		"\x8F" => "\xD0\x8F",
		"\x90" => "\xD1\x92",
		"\x91" => "\xE2\x80\x98",
		"\x92" => "\xE2\x80\x99",
		"\x93" => "\xE2\x80\x9C",
		"\x94" => "\xE2\x80\x9D",
		"\x95" => "\xE2\x80\xA2",
		"\x96" => "\xE2\x80\x93",
		"\x97" => "\xE2\x80\x94",
		"\x99" => "\xE2\x84\xA2",
		"\x9A" => "\xD1\x99",
		"\x9B" => "\xE2\x80\xBA",
		"\x9C" => "\xD1\x9A",
		"\x9D" => "\xD1\x9C",
		"\x9E" => "\xD1\x9B",
		"\x9F" => "\xD1\x9F",
		"\xA0" => "\xC2\xA0",
		"\xA1" => "\xD0\x8E",
		"\xA2" => "\xD1\x9E",
		"\xA3" => "\xD0\x88",
		"\xA4" => "\xC2\xA4",
		"\xA5" => "\xD2\x90",
		"\xA6" => "\xC2\xA6",
		"\xA7" => "\xC2\xA7",
		"\xA8" => "\xD0\x81",
		"\xA9" => "\xC2\xA9",
		"\xAA" => "\xD0\x84",
		"\xAB" => "\xC2\xAB",
		"\xAC" => "\xC2\xAC",
		"\xAD" => "\xC2\xAD",
		"\xAE" => "\xC2\xAE",
		"\xAF" => "\xD0\x87",
		"\xB0" => "\xC2\xB0",
		"\xB1" => "\xC2\xB1",
		"\xB2" => "\xD0\x86",
		"\xB3" => "\xD1\x96",
		"\xB4" => "\xD2\x91",
		"\xB5" => "\xC2\xB5",
		"\xB6" => "\xC2\xB6",
		"\xB7" => "\xC2\xB7",
		"\xB8" => "\xD1\x91",
		"\xB9" => "\xE2\x84\x96",
		"\xBA" => "\xD1\x94",
		"\xBB" => "\xC2\xBB",
		"\xBC" => "\xD1\x98",
		"\xBD" => "\xD0\x85",
		"\xBE" => "\xD1\x95",
		"\xBF" => "\xD1\x97",
		"\xC0" => "\xD0\x90",
		"\xC1" => "\xD0\x91",
		"\xC2" => "\xD0\x92",
		"\xC3" => "\xD0\x93",
		"\xC4" => "\xD0\x94",
		"\xC5" => "\xD0\x95",
		"\xC6" => "\xD0\x96",
		"\xC7" => "\xD0\x97",
		"\xC8" => "\xD0\x98",
		"\xC9" => "\xD0\x99",
		"\xCA" => "\xD0\x9A",
		"\xCB" => "\xD0\x9B",
		"\xCC" => "\xD0\x9C",
		"\xCD" => "\xD0\x9D",
		"\xCE" => "\xD0\x9E",
		"\xCF" => "\xD0\x9F",
		"\xD0" => "\xD0\xA0",
		"\xD1" => "\xD0\xA1",
		"\xD2" => "\xD0\xA2",
		"\xD3" => "\xD0\xA3",
		"\xD4" => "\xD0\xA4",
		"\xD5" => "\xD0\xA5",
		"\xD6" => "\xD0\xA6",
		"\xD7" => "\xD0\xA7",
		"\xD8" => "\xD0\xA8",
		"\xD9" => "\xD0\xA9",
		"\xDA" => "\xD0\xAA",
		"\xDB" => "\xD0\xAB",
		"\xDC" => "\xD0\xAC",
		"\xDD" => "\xD0\xAD",
		"\xDE" => "\xD0\xAE",
		"\xDF" => "\xD0\xAF",
		"\xE0" => "\xD0\xB0",
		"\xE1" => "\xD0\xB1",
		"\xE2" => "\xD0\xB2",
		"\xE3" => "\xD0\xB3",
		"\xE4" => "\xD0\xB4",
		"\xE5" => "\xD0\xB5",
		"\xE6" => "\xD0\xB6",
		"\xE7" => "\xD0\xB7",
		"\xE8" => "\xD0\xB8",
		"\xE9" => "\xD0\xB9",
		"\xEA" => "\xD0\xBA",
		"\xEB" => "\xD0\xBB",
		"\xEC" => "\xD0\xBC",
		"\xED" => "\xD0\xBD",
		"\xEE" => "\xD0\xBE",
		"\xEF" => "\xD0\xBF",
		"\xF0" => "\xD1\x80",
		"\xF1" => "\xD1\x81",
		"\xF2" => "\xD1\x82",
		"\xF3" => "\xD1\x83",
		"\xF4" => "\xD1\x84",
		"\xF5" => "\xD1\x85",
		"\xF6" => "\xD1\x86",
		"\xF7" => "\xD1\x87",
		"\xF8" => "\xD1\x88",
		"\xF9" => "\xD1\x89",
		"\xFA" => "\xD1\x8A",
		"\xFB" => "\xD1\x8B",
		"\xFC" => "\xD1\x8C",
		"\xFD" => "\xD1\x8D",
		"\xFE" => "\xD1\x8E",
		"\xFF" => "\xD1\x8F",
	);
	return strtr($string, $transform);
}

function cp1252($string)
{
	static $transform = array(
		"\xC2\x80" => "\xE2\x82\xAC",
		"\xC2\x82" => "\xE2\x80\x9A",
		"\xC2\x83" => "\xC6\x92",
		"\xC2\x84" => "\xE2\x80\x9E",
		"\xC2\x85" => "\xE2\x80\xA6",
		"\xC2\x86" => "\xE2\x80\xA0",
		"\xC2\x87" => "\xE2\x80\xA1",
		"\xC2\x88" => "\xCB\x86",
		"\xC2\x89" => "\xE2\x80\xB0",
		"\xC2\x8A" => "\xC5\xA0",
		"\xC2\x8B" => "\xE2\x80\xB9",
		"\xC2\x8C" => "\xC5\x92",
		"\xC2\x8E" => "\xC5\xBD",
		"\xC2\x91" => "\xE2\x80\x98",
		"\xC2\x92" => "\xE2\x80\x99",
		"\xC2\x93" => "\xE2\x80\x9C",
		"\xC2\x94" => "\xE2\x80\x9D",
		"\xC2\x95" => "\xE2\x80\xA2",
		"\xC2\x96" => "\xE2\x80\x93",
		"\xC2\x97" => "\xE2\x80\x94",
		"\xC2\x98" => "\xCB\x9C",
		"\xC2\x99" => "\xE2\x84\xA2",
		"\xC2\x9A" => "\xC5\xA1",
		"\xC2\x9B" => "\xE2\x80\xBA",
		"\xC2\x9C" => "\xC5\x93",
		"\xC2\x9E" => "\xC5\xBE",
		"\xC2\x9F" => "\xC5\xB8"
	);
	return strtr(utf8_encode($string), $transform);
}

function cp1254($string)
{
	static $transform = array(
		"\xC2\x80" => "\xE2\x82\xAC",
		"\xC2\x82" => "\xE2\x80\x9A",
		"\xC2\x83" => "\xC6\x92",
		"\xC2\x84" => "\xE2\x80\x9E",
		"\xC2\x85" => "\xE2\x80\xA6",
		"\xC2\x86" => "\xE2\x80\xA0",
		"\xC2\x87" => "\xE2\x80\xA1",
		"\xC2\x88" => "\xCB\x86",
		"\xC2\x89" => "\xE2\x80\xB0",
		"\xC2\x8A" => "\xC5\xA0",
		"\xC2\x8B" => "\xE2\x80\xB9",
		"\xC2\x8C" => "\xC5\x92",
		"\xC2\x91" => "\xE2\x80\x98",
		"\xC2\x92" => "\xE2\x80\x99",
		"\xC2\x93" => "\xE2\x80\x9C",
		"\xC2\x94" => "\xE2\x80\x9D",
		"\xC2\x95" => "\xE2\x80\xA2",
		"\xC2\x96" => "\xE2\x80\x93",
		"\xC2\x97" => "\xE2\x80\x94",
		"\xC2\x98" => "\xCB\x9C",
		"\xC2\x99" => "\xE2\x84\xA2",
		"\xC2\x9A" => "\xC5\xA1",
		"\xC2\x9B" => "\xE2\x80\xBA",
		"\xC2\x9C" => "\xC5\x93",
		"\xC2\x9F" => "\xC5\xB8",
		"\xC3\x90" => "\xC4\x9E",
		"\xC3\x9D" => "\xC4\xB0",
		"\xC3\x9E" => "\xC5\x9E",
		"\xC3\xB0" => "\xC4\x9F",
		"\xC3\xBD" => "\xC4\xB1",
		"\xC3\xBE" => "\xC5\x9F",
	);
	return strtr(utf8_encode($string), $transform);
}

function cp1255($string)
{
	static $transform = array(
		"\x80" => "\xE2\x82\xAC",
		"\x82" => "\xE2\x80\x9A",
		"\x83" => "\xC6\x92",
		"\x84" => "\xE2\x80\x9E",
		"\x85" => "\xE2\x80\xA6",
		"\x86" => "\xE2\x80\xA0",
		"\x87" => "\xE2\x80\xA1",
		"\x88" => "\xCB\x86",
		"\x89" => "\xE2\x80\xB0",
		"\x8B" => "\xE2\x80\xB9",
		"\x91" => "\xE2\x80\x98",
		"\x92" => "\xE2\x80\x99",
		"\x93" => "\xE2\x80\x9C",
		"\x94" => "\xE2\x80\x9D",
		"\x95" => "\xE2\x80\xA2",
		"\x96" => "\xE2\x80\x93",
		"\x97" => "\xE2\x80\x94",
		"\x98" => "\xCB\x9C",
		"\x99" => "\xE2\x84\xA2",
		"\x9B" => "\xE2\x80\xBA",
		"\xA0" => "\xC2\xA0",
		"\xA1" => "\xC2\xA1",
		"\xA2" => "\xC2\xA2",
		"\xA3" => "\xC2\xA3",
		"\xA4" => "\xE2\x82\xAA",
		"\xA5" => "\xC2\xA5",
		"\xA6" => "\xC2\xA6",
		"\xA7" => "\xC2\xA7",
		"\xA8" => "\xC2\xA8",
		"\xA9" => "\xC2\xA9",
		"\xAA" => "\xC3\x97",
		"\xAB" => "\xC2\xAB",
		"\xAC" => "\xC2\xAC",
		"\xAD" => "\xC2\xAD",
		"\xAE" => "\xC2\xAE",
		"\xAF" => "\xC2\xAF",
		"\xB0" => "\xC2\xB0",
		"\xB1" => "\xC2\xB1",
		"\xB2" => "\xC2\xB2",
		"\xB3" => "\xC2\xB3",
		"\xB4" => "\xC2\xB4",
		"\xB5" => "\xC2\xB5",
		"\xB6" => "\xC2\xB6",
		"\xB7" => "\xC2\xB7",
		"\xB8" => "\xC2\xB8",
		"\xB9" => "\xC2\xB9",
		"\xBA" => "\xC3\xB7",
		"\xBB" => "\xC2\xBB",
		"\xBC" => "\xC2\xBC",
		"\xBD" => "\xC2\xBD",
		"\xBE" => "\xC2\xBE",
		"\xBF" => "\xC2\xBF",
		"\xC0" => "\xD6\xB0",
		"\xC1" => "\xD6\xB1",
		"\xC2" => "\xD6\xB2",
		"\xC3" => "\xD6\xB3",
		"\xC4" => "\xD6\xB4",
		"\xC5" => "\xD6\xB5",
		"\xC6" => "\xD6\xB6",
		"\xC7" => "\xD6\xB7",
		"\xC8" => "\xD6\xB8",
		"\xC9" => "\xD6\xB9",
		"\xCB" => "\xD6\xBB",
		"\xCC" => "\xD6\xBC",
		"\xCD" => "\xD6\xBD",
		"\xCE" => "\xD6\xBE",
		"\xCF" => "\xD6\xBF",
		"\xD0" => "\xD7\x80",
		"\xD1" => "\xD7\x81",
		"\xD2" => "\xD7\x82",
		"\xD3" => "\xD7\x83",
		"\xD4" => "\xD7\xB0",
		"\xD5" => "\xD7\xB1",
		"\xD6" => "\xD7\xB2",
		"\xD7" => "\xD7\xB3",
		"\xD8" => "\xD7\xB4",
		"\xE0" => "\xD7\x90",
		"\xE1" => "\xD7\x91",
		"\xE2" => "\xD7\x92",
		"\xE3" => "\xD7\x93",
		"\xE4" => "\xD7\x94",
		"\xE5" => "\xD7\x95",
		"\xE6" => "\xD7\x96",
		"\xE7" => "\xD7\x97",
		"\xE8" => "\xD7\x98",
		"\xE9" => "\xD7\x99",
		"\xEA" => "\xD7\x9A",
		"\xEB" => "\xD7\x9B",
		"\xEC" => "\xD7\x9C",
		"\xED" => "\xD7\x9D",
		"\xEE" => "\xD7\x9E",
		"\xEF" => "\xD7\x9F",
		"\xF0" => "\xD7\xA0",
		"\xF1" => "\xD7\xA1",
		"\xF2" => "\xD7\xA2",
		"\xF3" => "\xD7\xA3",
		"\xF4" => "\xD7\xA4",
		"\xF5" => "\xD7\xA5",
		"\xF6" => "\xD7\xA6",
		"\xF7" => "\xD7\xA7",
		"\xF8" => "\xD7\xA8",
		"\xF9" => "\xD7\xA9",
		"\xFA" => "\xD7\xAA",
		"\xFD" => "\xE2\x80\x8E",
		"\xFE" => "\xE2\x80\x8F",
	);
	return strtr($string, $transform);
}

function cp1256($string)
{
	static $transform = array(
		"\x80" => "\xE2\x82\xAC",
		"\x81" => "\xD9\xBE",
		"\x82" => "\xE2\x80\x9A",
		"\x83" => "\xC6\x92",
		"\x84" => "\xE2\x80\x9E",
		"\x85" => "\xE2\x80\xA6",
		"\x86" => "\xE2\x80\xA0",
		"\x87" => "\xE2\x80\xA1",
		"\x88" => "\xCB\x86",
		"\x89" => "\xE2\x80\xB0",
		"\x8A" => "\xD9\xB9",
		"\x8B" => "\xE2\x80\xB9",
		"\x8C" => "\xC5\x92",
		"\x8D" => "\xDA\x86",
		"\x8E" => "\xDA\x98",
		"\x8F" => "\xDA\x88",
		"\x90" => "\xDA\xAF",
		"\x91" => "\xE2\x80\x98",
		"\x92" => "\xE2\x80\x99",
		"\x93" => "\xE2\x80\x9C",
		"\x94" => "\xE2\x80\x9D",
		"\x95" => "\xE2\x80\xA2",
		"\x96" => "\xE2\x80\x93",
		"\x97" => "\xE2\x80\x94",
		"\x98" => "\xDA\xA9",
		"\x99" => "\xE2\x84\xA2",
		"\x9A" => "\xDA\x91",
		"\x9B" => "\xE2\x80\xBA",
		"\x9C" => "\xC5\x93",
		"\x9D" => "\xE2\x80\x8C",
		"\x9E" => "\xE2\x80\x8D",
		"\x9F" => "\xDA\xBA",
		"\xA0" => "\xC2\xA0",
		"\xA1" => "\xD8\x8C",
		"\xA2" => "\xC2\xA2",
		"\xA3" => "\xC2\xA3",
		"\xA4" => "\xC2\xA4",
		"\xA5" => "\xC2\xA5",
		"\xA6" => "\xC2\xA6",
		"\xA7" => "\xC2\xA7",
		"\xA8" => "\xC2\xA8",
		"\xA9" => "\xC2\xA9",
		"\xAA" => "\xDA\xBE",
		"\xAB" => "\xC2\xAB",
		"\xAC" => "\xC2\xAC",
		"\xAD" => "\xC2\xAD",
		"\xAE" => "\xC2\xAE",
		"\xAF" => "\xC2\xAF",
		"\xB0" => "\xC2\xB0",
		"\xB1" => "\xC2\xB1",
		"\xB2" => "\xC2\xB2",
		"\xB3" => "\xC2\xB3",
		"\xB4" => "\xC2\xB4",
		"\xB5" => "\xC2\xB5",
		"\xB6" => "\xC2\xB6",
		"\xB7" => "\xC2\xB7",
		"\xB8" => "\xC2\xB8",
		"\xB9" => "\xC2\xB9",
		"\xBA" => "\xD8\x9B",
		"\xBB" => "\xC2\xBB",
		"\xBC" => "\xC2\xBC",
		"\xBD" => "\xC2\xBD",
		"\xBE" => "\xC2\xBE",
		"\xBF" => "\xD8\x9F",
		"\xC0" => "\xDB\x81",
		"\xC1" => "\xD8\xA1",
		"\xC2" => "\xD8\xA2",
		"\xC3" => "\xD8\xA3",
		"\xC4" => "\xD8\xA4",
		"\xC5" => "\xD8\xA5",
		"\xC6" => "\xD8\xA6",
		"\xC7" => "\xD8\xA7",
		"\xC8" => "\xD8\xA8",
		"\xC9" => "\xD8\xA9",
		"\xCA" => "\xD8\xAA",
		"\xCB" => "\xD8\xAB",
		"\xCC" => "\xD8\xAC",
		"\xCD" => "\xD8\xAD",
		"\xCE" => "\xD8\xAE",
		"\xCF" => "\xD8\xAF",
		"\xD0" => "\xD8\xB0",
		"\xD1" => "\xD8\xB1",
		"\xD2" => "\xD8\xB2",
		"\xD3" => "\xD8\xB3",
		"\xD4" => "\xD8\xB4",
		"\xD5" => "\xD8\xB5",
		"\xD6" => "\xD8\xB6",
		"\xD7" => "\xC3\x97",
		"\xD8" => "\xD8\xB7",
		"\xD9" => "\xD8\xB8",
		"\xDA" => "\xD8\xB9",
		"\xDB" => "\xD8\xBA",
		"\xDC" => "\xD9\x80",
		"\xDD" => "\xD9\x81",
		"\xDE" => "\xD9\x82",
		"\xDF" => "\xD9\x83",
		"\xE0" => "\xC3\xA0",
		"\xE1" => "\xD9\x84",
		"\xE2" => "\xC3\xA2",
		"\xE3" => "\xD9\x85",
		"\xE4" => "\xD9\x86",
		"\xE5" => "\xD9\x87",
		"\xE6" => "\xD9\x88",
		"\xE7" => "\xC3\xA7",
		"\xE8" => "\xC3\xA8",
		"\xE9" => "\xC3\xA9",
		"\xEA" => "\xC3\xAA",
		"\xEB" => "\xC3\xAB",
		"\xEC" => "\xD9\x89",
		"\xED" => "\xD9\x8A",
		"\xEE" => "\xC3\xAE",
		"\xEF" => "\xC3\xAF",
		"\xF0" => "\xD9\x8B",
		"\xF1" => "\xD9\x8C",
		"\xF2" => "\xD9\x8D",
		"\xF3" => "\xD9\x8E",
		"\xF4" => "\xC3\xB4",
		"\xF5" => "\xD9\x8F",
		"\xF6" => "\xD9\x90",
		"\xF7" => "\xC3\xB7",
		"\xF8" => "\xD9\x91",
		"\xF9" => "\xC3\xB9",
		"\xFA" => "\xD9\x92",
		"\xFB" => "\xC3\xBB",
		"\xFC" => "\xC3\xBC",
		"\xFD" => "\xE2\x80\x8E",
		"\xFE" => "\xE2\x80\x8F",
		"\xFF" => "\xDB\x92",
	);
	return strtr($string, $transform);
}

function cp1257($string)
{
	static $transform = array(
		"\x80" => "\xE2\x82\xAC",
		"\x82" => "\xE2\x80\x9A",
		"\x84" => "\xE2\x80\x9E",
		"\x85" => "\xE2\x80\xA6",
		"\x86" => "\xE2\x80\xA0",
		"\x87" => "\xE2\x80\xA1",
		"\x89" => "\xE2\x80\xB0",
		"\x8B" => "\xE2\x80\xB9",
		"\x8D" => "\xC2\xA8",
		"\x8E" => "\xCB\x87",
		"\x8F" => "\xC2\xB8",
		"\x91" => "\xE2\x80\x98",
		"\x92" => "\xE2\x80\x99",
		"\x93" => "\xE2\x80\x9C",
		"\x94" => "\xE2\x80\x9D",
		"\x95" => "\xE2\x80\xA2",
		"\x96" => "\xE2\x80\x93",
		"\x97" => "\xE2\x80\x94",
		"\x99" => "\xE2\x84\xA2",
		"\x9B" => "\xE2\x80\xBA",
		"\x9D" => "\xC2\xAF",
		"\x9E" => "\xCB\x9B",
		"\xA0" => "\xC2\xA0",
		"\xA2" => "\xC2\xA2",
		"\xA3" => "\xC2\xA3",
		"\xA4" => "\xC2\xA4",
		"\xA6" => "\xC2\xA6",
		"\xA7" => "\xC2\xA7",
		"\xA8" => "\xC3\x98",
		"\xA9" => "\xC2\xA9",
		"\xAA" => "\xC5\x96",
		"\xAB" => "\xC2\xAB",
		"\xAC" => "\xC2\xAC",
		"\xAD" => "\xC2\xAD",
		"\xAE" => "\xC2\xAE",
		"\xAF" => "\xC3\x86",
		"\xB0" => "\xC2\xB0",
		"\xB1" => "\xC2\xB1",
		"\xB2" => "\xC2\xB2",
		"\xB3" => "\xC2\xB3",
		"\xB4" => "\xC2\xB4",
		"\xB5" => "\xC2\xB5",
		"\xB6" => "\xC2\xB6",
		"\xB7" => "\xC2\xB7",
		"\xB8" => "\xC3\xB8",
		"\xB9" => "\xC2\xB9",
		"\xBA" => "\xC5\x97",
		"\xBB" => "\xC2\xBB",
		"\xBC" => "\xC2\xBC",
		"\xBD" => "\xC2\xBD",
		"\xBE" => "\xC2\xBE",
		"\xBF" => "\xC3\xA6",
		"\xC0" => "\xC4\x84",
		"\xC1" => "\xC4\xAE",
		"\xC2" => "\xC4\x80",
		"\xC3" => "\xC4\x86",
		"\xC4" => "\xC3\x84",
		"\xC5" => "\xC3\x85",
		"\xC6" => "\xC4\x98",
		"\xC7" => "\xC4\x92",
		"\xC8" => "\xC4\x8C",
		"\xC9" => "\xC3\x89",
		"\xCA" => "\xC5\xB9",
		"\xCB" => "\xC4\x96",
		"\xCC" => "\xC4\xA2",
		"\xCD" => "\xC4\xB6",
		"\xCE" => "\xC4\xAA",
		"\xCF" => "\xC4\xBB",
		"\xD0" => "\xC5\xA0",
		"\xD1" => "\xC5\x83",
		"\xD2" => "\xC5\x85",
		"\xD3" => "\xC3\x93",
		"\xD4" => "\xC5\x8C",
		"\xD5" => "\xC3\x95",
		"\xD6" => "\xC3\x96",
		"\xD7" => "\xC3\x97",
		"\xD8" => "\xC5\xB2",
		"\xD9" => "\xC5\x81",
		"\xDA" => "\xC5\x9A",
		"\xDB" => "\xC5\xAA",
		"\xDC" => "\xC3\x9C",
		"\xDD" => "\xC5\xBB",
		"\xDE" => "\xC5\xBD",
		"\xDF" => "\xC3\x9F",
		"\xE0" => "\xC4\x85",
		"\xE1" => "\xC4\xAF",
		"\xE2" => "\xC4\x81",
		"\xE3" => "\xC4\x87",
		"\xE4" => "\xC3\xA4",
		"\xE5" => "\xC3\xA5",
		"\xE6" => "\xC4\x99",
		"\xE7" => "\xC4\x93",
		"\xE8" => "\xC4\x8D",
		"\xE9" => "\xC3\xA9",
		"\xEA" => "\xC5\xBA",
		"\xEB" => "\xC4\x97",
		"\xEC" => "\xC4\xA3",
		"\xED" => "\xC4\xB7",
		"\xEE" => "\xC4\xAB",
		"\xEF" => "\xC4\xBC",
		"\xF0" => "\xC5\xA1",
		"\xF1" => "\xC5\x84",
		"\xF2" => "\xC5\x86",
		"\xF3" => "\xC3\xB3",
		"\xF4" => "\xC5\x8D",
		"\xF5" => "\xC3\xB5",
		"\xF6" => "\xC3\xB6",
		"\xF7" => "\xC3\xB7",
		"\xF8" => "\xC5\xB3",
		"\xF9" => "\xC5\x82",
		"\xFA" => "\xC5\x9B",
		"\xFB" => "\xC5\xAB",
		"\xFC" => "\xC3\xBC",
		"\xFD" => "\xC5\xBC",
		"\xFE" => "\xC5\xBE",
		"\xFF" => "\xCB\x99",
	);
	return strtr($string, $transform);
}

function utf8_to_cp1252($string)
{
	static $transform = array(
		"\xE2\x82\xAC" => "\x80",
		"\xE2\x80\x9A" => "\x82",
		"\xC6\x92" => "\x83",
		"\xE2\x80\x9E" => "\x84",
		"\xE2\x80\xA6" => "\x85",
		"\xE2\x80\xA0" => "\x86",
		"\xE2\x80\xA1" => "\x87",
		"\xCB\x86" => "\x88",
		"\xE2\x80\xB0" => "\x89",
		"\xC5\xA0" => "\x8A",
		"\xE2\x80\xB9" => "\x8B",
		"\xC5\x92" => "\x8C",
		"\xC5\xBD" => "\x8E",
		"\xE2\x80\x98" => "\x91",
		"\xE2\x80\x99" => "\x92",
		"\xE2\x80\x9C" => "\x93",
		"\xE2\x80\x9D" => "\x94",
		"\xE2\x80\xA2" => "\x95",
		"\xE2\x80\x93" => "\x96",
		"\xE2\x80\x94" => "\x97",
		"\xCB\x9C" => "\x98",
		"\xE2\x84\xA2" => "\x99",
		"\xC5\xA1" => "\x9A",
		"\xE2\x80\xBA" => "\x9B",
		"\xC5\x93" => "\x9C",
		"\xC5\xBE" => "\x9E",
		"\xC5\xB8" => "\x9F",
		"\xC2\xA0" => "\xA0",
		"\xC2\xA1" => "\xA1",
		"\xC2\xA2" => "\xA2",
		"\xC2\xA3" => "\xA3",
		"\xC2\xA4" => "\xA4",
		"\xC2\xA5" => "\xA5",
		"\xC2\xA6" => "\xA6",
		"\xC2\xA7" => "\xA7",
		"\xC2\xA8" => "\xA8",
		"\xC2\xA9" => "\xA9",
		"\xC2\xAA" => "\xAA",
		"\xC2\xAB" => "\xAB",
		"\xC2\xAC" => "\xAC",
		"\xC2\xAD" => "\xAD",
		"\xC2\xAE" => "\xAE",
		"\xC2\xAF" => "\xAF",
		"\xC2\xB0" => "\xB0",
		"\xC2\xB1" => "\xB1",
		"\xC2\xB2" => "\xB2",
		"\xC2\xB3" => "\xB3",
		"\xC2\xB4" => "\xB4",
		"\xC2\xB5" => "\xB5",
		"\xC2\xB6" => "\xB6",
		"\xC2\xB7" => "\xB7",
		"\xC2\xB8" => "\xB8",
		"\xC2\xB9" => "\xB9",
		"\xC2\xBA" => "\xBA",
		"\xC2\xBB" => "\xBB",
		"\xC2\xBC" => "\xBC",
		"\xC2\xBD" => "\xBD",
		"\xC2\xBE" => "\xBE",
		"\xC2\xBF" => "\xBF",
		"\xC3\x80" => "\xC0",
		"\xC3\x81" => "\xC1",
		"\xC3\x82" => "\xC2",
		"\xC3\x83" => "\xC3",
		"\xC3\x84" => "\xC4",
		"\xC3\x85" => "\xC5",
		"\xC3\x86" => "\xC6",
		"\xC3\x87" => "\xC7",
		"\xC3\x88" => "\xC8",
		"\xC3\x89" => "\xC9",
		"\xC3\x8A" => "\xCA",
		"\xC3\x8B" => "\xCB",
		"\xC3\x8C" => "\xCC",
		"\xC3\x8D" => "\xCD",
		"\xC3\x8E" => "\xCE",
		"\xC3\x8F" => "\xCF",
		"\xC3\x90" => "\xD0",
		"\xC3\x91" => "\xD1",
		"\xC3\x92" => "\xD2",
		"\xC3\x93" => "\xD3",
		"\xC3\x94" => "\xD4",
		"\xC3\x95" => "\xD5",
		"\xC3\x96" => "\xD6",
		"\xC3\x97" => "\xD7",
		"\xC3\x98" => "\xD8",
		"\xC3\x99" => "\xD9",
		"\xC3\x9A" => "\xDA",
		"\xC3\x9B" => "\xDB",
		"\xC3\x9C" => "\xDC",
		"\xC3\x9D" => "\xDD",
		"\xC3\x9E" => "\xDE",
		"\xC3\x9F" => "\xDF",
		"\xC3\xA0" => "\xE0",
		"\xC3\xA1" => "\xE1",
		"\xC3\xA2" => "\xE2",
		"\xC3\xA3" => "\xE3",
		"\xC3\xA4" => "\xE4",
		"\xC3\xA5" => "\xE5",
		"\xC3\xA6" => "\xE6",
		"\xC3\xA7" => "\xE7",
		"\xC3\xA8" => "\xE8",
		"\xC3\xA9" => "\xE9",
		"\xC3\xAA" => "\xEA",
		"\xC3\xAB" => "\xEB",
		"\xC3\xAC" => "\xEC",
		"\xC3\xAD" => "\xED",
		"\xC3\xAE" => "\xEE",
		"\xC3\xAF" => "\xEF",
		"\xC3\xB0" => "\xF0",
		"\xC3\xB1" => "\xF1",
		"\xC3\xB2" => "\xF2",
		"\xC3\xB3" => "\xF3",
		"\xC3\xB4" => "\xF4",
		"\xC3\xB5" => "\xF5",
		"\xC3\xB6" => "\xF6",
		"\xC3\xB7" => "\xF7",
		"\xC3\xB8" => "\xF8",
		"\xC3\xB9" => "\xF9",
		"\xC3\xBA" => "\xFA",
		"\xC3\xBB" => "\xFB",
		"\xC3\xBC" => "\xFC",
		"\xC3\xBD" => "\xFD",
		"\xC3\xBE" => "\xFE",
		"\xC3\xBF" => "\xFF"
	);
	return strtr($string, $transform);
}