Skip to main content

anyxml_encoding/
iso_8859.rs

1use crate::{DecodeError, Decoder, EncodeError, Encoder};
2
3pub const ISO_8859_1_NAME: &str = "ISO_8859-1:1987";
4
5pub struct ISO8859_1Encoder;
6impl Encoder for ISO8859_1Encoder {
7    fn name(&self) -> &'static str {
8        ISO_8859_1_NAME
9    }
10
11    fn encode(
12        &mut self,
13        src: &str,
14        dst: &mut [u8],
15        finish: bool,
16    ) -> Result<(usize, usize), EncodeError> {
17        if src.is_empty() {
18            return if finish {
19                Ok((0, 0))
20            } else {
21                Err(EncodeError::InputIsEmpty)
22            };
23        }
24
25        if dst.is_empty() {
26            return Err(EncodeError::OutputTooShort);
27        }
28
29        let (mut read, mut write) = (0, 0);
30        for c in src.chars() {
31            let b = c as u32;
32            read += c.len_utf8();
33            if b >= 256 {
34                return Err(EncodeError::Unmappable { read, write, c });
35            }
36            dst[write] = b as u8;
37            write += 1;
38            if write == dst.len() {
39                break;
40            }
41        }
42        Ok((read, write))
43    }
44}
45
46pub struct ISO8859_1Decoder;
47impl Decoder for ISO8859_1Decoder {
48    fn name(&self) -> &'static str {
49        ISO_8859_1_NAME
50    }
51
52    fn decode(
53        &mut self,
54        src: &[u8],
55        dst: &mut String,
56        finish: bool,
57    ) -> Result<(usize, usize), DecodeError> {
58        if src.is_empty() {
59            return if finish {
60                Ok((0, 0))
61            } else {
62                Err(DecodeError::InputIsEmpty)
63            };
64        }
65        let len = dst.capacity() - dst.len();
66        if len < 4 {
67            return Err(DecodeError::OutputTooShort);
68        }
69
70        let (mut read, mut write) = (0, 0);
71        for &b in src {
72            let c = b as char;
73            let l = c.len_utf8();
74            if write + l > len {
75                break;
76            }
77            dst.push(c);
78            read += 1;
79            write += l;
80        }
81        Ok((read, write))
82    }
83}
84
85pub const ISO_8859_2_NAME: &str = "ISO_8859-2:1987";
86pub const ISO_8859_3_NAME: &str = "ISO_8859-3:1988";
87pub const ISO_8859_4_NAME: &str = "ISO_8859-4:1988";
88pub const ISO_8859_5_NAME: &str = "ISO_8859-5:1988";
89pub const ISO_8859_6_NAME: &str = "ISO_8859-6:1987";
90pub const ISO_8859_7_NAME: &str = "ISO_8859-7:1987";
91pub const ISO_8859_8_NAME: &str = "ISO_8859-8:1988";
92pub const ISO_8859_9_NAME: &str = "ISO_8859-9:1989";
93pub const ISO_8859_10_NAME: &str = "ISO-8859-10";
94pub const ISO_8859_11_NAME: &str = "TIS-620";
95pub const ISO_8859_13_NAME: &str = "ISO-8859-13";
96pub const ISO_8859_14_NAME: &str = "ISO-8859-14";
97pub const ISO_8859_15_NAME: &str = "ISO-8859-15";
98pub const ISO_8859_16_NAME: &str = "ISO-8859-16";
99
100// The table generated by `resources/generate-iso8859-table.ts`, referencing the Unicode Database
101// https://www.unicode.org/Public/MAPPINGS/ISO8859/
102
103const ISO_8859_2_TO_UNICODE: [char; 128] = [
104    '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}',
105    '\u{89}', '\u{8a}', '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}',
106    '\u{92}', '\u{93}', '\u{94}', '\u{95}', '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}',
107    '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}', '\u{104}', '\u{2d8}', '\u{141}',
108    '\u{a4}', '\u{13d}', '\u{15a}', '\u{a7}', '\u{a8}', '\u{160}', '\u{15e}', '\u{164}', '\u{179}',
109    '\u{ad}', '\u{17d}', '\u{17b}', '\u{b0}', '\u{105}', '\u{2db}', '\u{142}', '\u{b4}', '\u{13e}',
110    '\u{15b}', '\u{2c7}', '\u{b8}', '\u{161}', '\u{15f}', '\u{165}', '\u{17a}', '\u{2dd}',
111    '\u{17e}', '\u{17c}', '\u{154}', '\u{c1}', '\u{c2}', '\u{102}', '\u{c4}', '\u{139}', '\u{106}',
112    '\u{c7}', '\u{10c}', '\u{c9}', '\u{118}', '\u{cb}', '\u{11a}', '\u{cd}', '\u{ce}', '\u{10e}',
113    '\u{110}', '\u{143}', '\u{147}', '\u{d3}', '\u{d4}', '\u{150}', '\u{d6}', '\u{d7}', '\u{158}',
114    '\u{16e}', '\u{da}', '\u{170}', '\u{dc}', '\u{dd}', '\u{162}', '\u{df}', '\u{155}', '\u{e1}',
115    '\u{e2}', '\u{103}', '\u{e4}', '\u{13a}', '\u{107}', '\u{e7}', '\u{10d}', '\u{e9}', '\u{119}',
116    '\u{eb}', '\u{11b}', '\u{ed}', '\u{ee}', '\u{10f}', '\u{111}', '\u{144}', '\u{148}', '\u{f3}',
117    '\u{f4}', '\u{151}', '\u{f6}', '\u{f7}', '\u{159}', '\u{16f}', '\u{fa}', '\u{171}', '\u{fc}',
118    '\u{fd}', '\u{163}', '\u{2d9}',
119];
120
121const UNICODE_TO_ISO_8859_2: &[(u16, u8)] = &[
122    (128, 128),
123    (129, 129),
124    (130, 130),
125    (131, 131),
126    (132, 132),
127    (133, 133),
128    (134, 134),
129    (135, 135),
130    (136, 136),
131    (137, 137),
132    (138, 138),
133    (139, 139),
134    (140, 140),
135    (141, 141),
136    (142, 142),
137    (143, 143),
138    (144, 144),
139    (145, 145),
140    (146, 146),
141    (147, 147),
142    (148, 148),
143    (149, 149),
144    (150, 150),
145    (151, 151),
146    (152, 152),
147    (153, 153),
148    (154, 154),
149    (155, 155),
150    (156, 156),
151    (157, 157),
152    (158, 158),
153    (159, 159),
154    (160, 160),
155    (164, 164),
156    (167, 167),
157    (168, 168),
158    (173, 173),
159    (176, 176),
160    (180, 180),
161    (184, 184),
162    (193, 193),
163    (194, 194),
164    (196, 196),
165    (199, 199),
166    (201, 201),
167    (203, 203),
168    (205, 205),
169    (206, 206),
170    (211, 211),
171    (212, 212),
172    (214, 214),
173    (215, 215),
174    (218, 218),
175    (220, 220),
176    (221, 221),
177    (223, 223),
178    (225, 225),
179    (226, 226),
180    (228, 228),
181    (231, 231),
182    (233, 233),
183    (235, 235),
184    (237, 237),
185    (238, 238),
186    (243, 243),
187    (244, 244),
188    (246, 246),
189    (247, 247),
190    (250, 250),
191    (252, 252),
192    (253, 253),
193    (258, 195),
194    (259, 227),
195    (260, 161),
196    (261, 177),
197    (262, 198),
198    (263, 230),
199    (268, 200),
200    (269, 232),
201    (270, 207),
202    (271, 239),
203    (272, 208),
204    (273, 240),
205    (280, 202),
206    (281, 234),
207    (282, 204),
208    (283, 236),
209    (313, 197),
210    (314, 229),
211    (317, 165),
212    (318, 181),
213    (321, 163),
214    (322, 179),
215    (323, 209),
216    (324, 241),
217    (327, 210),
218    (328, 242),
219    (336, 213),
220    (337, 245),
221    (340, 192),
222    (341, 224),
223    (344, 216),
224    (345, 248),
225    (346, 166),
226    (347, 182),
227    (350, 170),
228    (351, 186),
229    (352, 169),
230    (353, 185),
231    (354, 222),
232    (355, 254),
233    (356, 171),
234    (357, 187),
235    (366, 217),
236    (367, 249),
237    (368, 219),
238    (369, 251),
239    (377, 172),
240    (378, 188),
241    (379, 175),
242    (380, 191),
243    (381, 174),
244    (382, 190),
245    (711, 183),
246    (728, 162),
247    (729, 255),
248    (731, 178),
249    (733, 189),
250];
251
252const ISO_8859_3_TO_UNICODE: [char; 128] = [
253    '\u{80}',
254    '\u{81}',
255    '\u{82}',
256    '\u{83}',
257    '\u{84}',
258    '\u{85}',
259    '\u{86}',
260    '\u{87}',
261    '\u{88}',
262    '\u{89}',
263    '\u{8a}',
264    '\u{8b}',
265    '\u{8c}',
266    '\u{8d}',
267    '\u{8e}',
268    '\u{8f}',
269    '\u{90}',
270    '\u{91}',
271    '\u{92}',
272    '\u{93}',
273    '\u{94}',
274    '\u{95}',
275    '\u{96}',
276    '\u{97}',
277    '\u{98}',
278    '\u{99}',
279    '\u{9a}',
280    '\u{9b}',
281    '\u{9c}',
282    '\u{9d}',
283    '\u{9e}',
284    '\u{9f}',
285    '\u{a0}',
286    '\u{126}',
287    '\u{2d8}',
288    '\u{a3}',
289    '\u{a4}',
290    char::REPLACEMENT_CHARACTER,
291    '\u{124}',
292    '\u{a7}',
293    '\u{a8}',
294    '\u{130}',
295    '\u{15e}',
296    '\u{11e}',
297    '\u{134}',
298    '\u{ad}',
299    char::REPLACEMENT_CHARACTER,
300    '\u{17b}',
301    '\u{b0}',
302    '\u{127}',
303    '\u{b2}',
304    '\u{b3}',
305    '\u{b4}',
306    '\u{b5}',
307    '\u{125}',
308    '\u{b7}',
309    '\u{b8}',
310    '\u{131}',
311    '\u{15f}',
312    '\u{11f}',
313    '\u{135}',
314    '\u{bd}',
315    char::REPLACEMENT_CHARACTER,
316    '\u{17c}',
317    '\u{c0}',
318    '\u{c1}',
319    '\u{c2}',
320    char::REPLACEMENT_CHARACTER,
321    '\u{c4}',
322    '\u{10a}',
323    '\u{108}',
324    '\u{c7}',
325    '\u{c8}',
326    '\u{c9}',
327    '\u{ca}',
328    '\u{cb}',
329    '\u{cc}',
330    '\u{cd}',
331    '\u{ce}',
332    '\u{cf}',
333    char::REPLACEMENT_CHARACTER,
334    '\u{d1}',
335    '\u{d2}',
336    '\u{d3}',
337    '\u{d4}',
338    '\u{120}',
339    '\u{d6}',
340    '\u{d7}',
341    '\u{11c}',
342    '\u{d9}',
343    '\u{da}',
344    '\u{db}',
345    '\u{dc}',
346    '\u{16c}',
347    '\u{15c}',
348    '\u{df}',
349    '\u{e0}',
350    '\u{e1}',
351    '\u{e2}',
352    char::REPLACEMENT_CHARACTER,
353    '\u{e4}',
354    '\u{10b}',
355    '\u{109}',
356    '\u{e7}',
357    '\u{e8}',
358    '\u{e9}',
359    '\u{ea}',
360    '\u{eb}',
361    '\u{ec}',
362    '\u{ed}',
363    '\u{ee}',
364    '\u{ef}',
365    char::REPLACEMENT_CHARACTER,
366    '\u{f1}',
367    '\u{f2}',
368    '\u{f3}',
369    '\u{f4}',
370    '\u{121}',
371    '\u{f6}',
372    '\u{f7}',
373    '\u{11d}',
374    '\u{f9}',
375    '\u{fa}',
376    '\u{fb}',
377    '\u{fc}',
378    '\u{16d}',
379    '\u{15d}',
380    '\u{2d9}',
381];
382
383const UNICODE_TO_ISO_8859_3: &[(u16, u8)] = &[
384    (128, 128),
385    (129, 129),
386    (130, 130),
387    (131, 131),
388    (132, 132),
389    (133, 133),
390    (134, 134),
391    (135, 135),
392    (136, 136),
393    (137, 137),
394    (138, 138),
395    (139, 139),
396    (140, 140),
397    (141, 141),
398    (142, 142),
399    (143, 143),
400    (144, 144),
401    (145, 145),
402    (146, 146),
403    (147, 147),
404    (148, 148),
405    (149, 149),
406    (150, 150),
407    (151, 151),
408    (152, 152),
409    (153, 153),
410    (154, 154),
411    (155, 155),
412    (156, 156),
413    (157, 157),
414    (158, 158),
415    (159, 159),
416    (160, 160),
417    (163, 163),
418    (164, 164),
419    (167, 167),
420    (168, 168),
421    (173, 173),
422    (176, 176),
423    (178, 178),
424    (179, 179),
425    (180, 180),
426    (181, 181),
427    (183, 183),
428    (184, 184),
429    (189, 189),
430    (192, 192),
431    (193, 193),
432    (194, 194),
433    (196, 196),
434    (199, 199),
435    (200, 200),
436    (201, 201),
437    (202, 202),
438    (203, 203),
439    (204, 204),
440    (205, 205),
441    (206, 206),
442    (207, 207),
443    (209, 209),
444    (210, 210),
445    (211, 211),
446    (212, 212),
447    (214, 214),
448    (215, 215),
449    (217, 217),
450    (218, 218),
451    (219, 219),
452    (220, 220),
453    (223, 223),
454    (224, 224),
455    (225, 225),
456    (226, 226),
457    (228, 228),
458    (231, 231),
459    (232, 232),
460    (233, 233),
461    (234, 234),
462    (235, 235),
463    (236, 236),
464    (237, 237),
465    (238, 238),
466    (239, 239),
467    (241, 241),
468    (242, 242),
469    (243, 243),
470    (244, 244),
471    (246, 246),
472    (247, 247),
473    (249, 249),
474    (250, 250),
475    (251, 251),
476    (252, 252),
477    (264, 198),
478    (265, 230),
479    (266, 197),
480    (267, 229),
481    (284, 216),
482    (285, 248),
483    (286, 171),
484    (287, 187),
485    (288, 213),
486    (289, 245),
487    (292, 166),
488    (293, 182),
489    (294, 161),
490    (295, 177),
491    (304, 169),
492    (305, 185),
493    (308, 172),
494    (309, 188),
495    (348, 222),
496    (349, 254),
497    (350, 170),
498    (351, 186),
499    (364, 221),
500    (365, 253),
501    (379, 175),
502    (380, 191),
503    (728, 162),
504    (729, 255),
505];
506
507const ISO_8859_4_TO_UNICODE: [char; 128] = [
508    '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}',
509    '\u{89}', '\u{8a}', '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}',
510    '\u{92}', '\u{93}', '\u{94}', '\u{95}', '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}',
511    '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}', '\u{104}', '\u{138}', '\u{156}',
512    '\u{a4}', '\u{128}', '\u{13b}', '\u{a7}', '\u{a8}', '\u{160}', '\u{112}', '\u{122}', '\u{166}',
513    '\u{ad}', '\u{17d}', '\u{af}', '\u{b0}', '\u{105}', '\u{2db}', '\u{157}', '\u{b4}', '\u{129}',
514    '\u{13c}', '\u{2c7}', '\u{b8}', '\u{161}', '\u{113}', '\u{123}', '\u{167}', '\u{14a}',
515    '\u{17e}', '\u{14b}', '\u{100}', '\u{c1}', '\u{c2}', '\u{c3}', '\u{c4}', '\u{c5}', '\u{c6}',
516    '\u{12e}', '\u{10c}', '\u{c9}', '\u{118}', '\u{cb}', '\u{116}', '\u{cd}', '\u{ce}', '\u{12a}',
517    '\u{110}', '\u{145}', '\u{14c}', '\u{136}', '\u{d4}', '\u{d5}', '\u{d6}', '\u{d7}', '\u{d8}',
518    '\u{172}', '\u{da}', '\u{db}', '\u{dc}', '\u{168}', '\u{16a}', '\u{df}', '\u{101}', '\u{e1}',
519    '\u{e2}', '\u{e3}', '\u{e4}', '\u{e5}', '\u{e6}', '\u{12f}', '\u{10d}', '\u{e9}', '\u{119}',
520    '\u{eb}', '\u{117}', '\u{ed}', '\u{ee}', '\u{12b}', '\u{111}', '\u{146}', '\u{14d}', '\u{137}',
521    '\u{f4}', '\u{f5}', '\u{f6}', '\u{f7}', '\u{f8}', '\u{173}', '\u{fa}', '\u{fb}', '\u{fc}',
522    '\u{169}', '\u{16b}', '\u{2d9}',
523];
524
525const UNICODE_TO_ISO_8859_4: &[(u16, u8)] = &[
526    (128, 128),
527    (129, 129),
528    (130, 130),
529    (131, 131),
530    (132, 132),
531    (133, 133),
532    (134, 134),
533    (135, 135),
534    (136, 136),
535    (137, 137),
536    (138, 138),
537    (139, 139),
538    (140, 140),
539    (141, 141),
540    (142, 142),
541    (143, 143),
542    (144, 144),
543    (145, 145),
544    (146, 146),
545    (147, 147),
546    (148, 148),
547    (149, 149),
548    (150, 150),
549    (151, 151),
550    (152, 152),
551    (153, 153),
552    (154, 154),
553    (155, 155),
554    (156, 156),
555    (157, 157),
556    (158, 158),
557    (159, 159),
558    (160, 160),
559    (164, 164),
560    (167, 167),
561    (168, 168),
562    (173, 173),
563    (175, 175),
564    (176, 176),
565    (180, 180),
566    (184, 184),
567    (193, 193),
568    (194, 194),
569    (195, 195),
570    (196, 196),
571    (197, 197),
572    (198, 198),
573    (201, 201),
574    (203, 203),
575    (205, 205),
576    (206, 206),
577    (212, 212),
578    (213, 213),
579    (214, 214),
580    (215, 215),
581    (216, 216),
582    (218, 218),
583    (219, 219),
584    (220, 220),
585    (223, 223),
586    (225, 225),
587    (226, 226),
588    (227, 227),
589    (228, 228),
590    (229, 229),
591    (230, 230),
592    (233, 233),
593    (235, 235),
594    (237, 237),
595    (238, 238),
596    (244, 244),
597    (245, 245),
598    (246, 246),
599    (247, 247),
600    (248, 248),
601    (250, 250),
602    (251, 251),
603    (252, 252),
604    (256, 192),
605    (257, 224),
606    (260, 161),
607    (261, 177),
608    (268, 200),
609    (269, 232),
610    (272, 208),
611    (273, 240),
612    (274, 170),
613    (275, 186),
614    (278, 204),
615    (279, 236),
616    (280, 202),
617    (281, 234),
618    (290, 171),
619    (291, 187),
620    (296, 165),
621    (297, 181),
622    (298, 207),
623    (299, 239),
624    (302, 199),
625    (303, 231),
626    (310, 211),
627    (311, 243),
628    (312, 162),
629    (315, 166),
630    (316, 182),
631    (325, 209),
632    (326, 241),
633    (330, 189),
634    (331, 191),
635    (332, 210),
636    (333, 242),
637    (342, 163),
638    (343, 179),
639    (352, 169),
640    (353, 185),
641    (358, 172),
642    (359, 188),
643    (360, 221),
644    (361, 253),
645    (362, 222),
646    (363, 254),
647    (370, 217),
648    (371, 249),
649    (381, 174),
650    (382, 190),
651    (711, 183),
652    (729, 255),
653    (731, 178),
654];
655
656const ISO_8859_5_TO_UNICODE: [char; 128] = [
657    '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}',
658    '\u{89}', '\u{8a}', '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}',
659    '\u{92}', '\u{93}', '\u{94}', '\u{95}', '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}',
660    '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}', '\u{401}', '\u{402}', '\u{403}',
661    '\u{404}', '\u{405}', '\u{406}', '\u{407}', '\u{408}', '\u{409}', '\u{40a}', '\u{40b}',
662    '\u{40c}', '\u{ad}', '\u{40e}', '\u{40f}', '\u{410}', '\u{411}', '\u{412}', '\u{413}',
663    '\u{414}', '\u{415}', '\u{416}', '\u{417}', '\u{418}', '\u{419}', '\u{41a}', '\u{41b}',
664    '\u{41c}', '\u{41d}', '\u{41e}', '\u{41f}', '\u{420}', '\u{421}', '\u{422}', '\u{423}',
665    '\u{424}', '\u{425}', '\u{426}', '\u{427}', '\u{428}', '\u{429}', '\u{42a}', '\u{42b}',
666    '\u{42c}', '\u{42d}', '\u{42e}', '\u{42f}', '\u{430}', '\u{431}', '\u{432}', '\u{433}',
667    '\u{434}', '\u{435}', '\u{436}', '\u{437}', '\u{438}', '\u{439}', '\u{43a}', '\u{43b}',
668    '\u{43c}', '\u{43d}', '\u{43e}', '\u{43f}', '\u{440}', '\u{441}', '\u{442}', '\u{443}',
669    '\u{444}', '\u{445}', '\u{446}', '\u{447}', '\u{448}', '\u{449}', '\u{44a}', '\u{44b}',
670    '\u{44c}', '\u{44d}', '\u{44e}', '\u{44f}', '\u{2116}', '\u{451}', '\u{452}', '\u{453}',
671    '\u{454}', '\u{455}', '\u{456}', '\u{457}', '\u{458}', '\u{459}', '\u{45a}', '\u{45b}',
672    '\u{45c}', '\u{a7}', '\u{45e}', '\u{45f}',
673];
674
675const UNICODE_TO_ISO_8859_5: &[(u16, u8)] = &[
676    (128, 128),
677    (129, 129),
678    (130, 130),
679    (131, 131),
680    (132, 132),
681    (133, 133),
682    (134, 134),
683    (135, 135),
684    (136, 136),
685    (137, 137),
686    (138, 138),
687    (139, 139),
688    (140, 140),
689    (141, 141),
690    (142, 142),
691    (143, 143),
692    (144, 144),
693    (145, 145),
694    (146, 146),
695    (147, 147),
696    (148, 148),
697    (149, 149),
698    (150, 150),
699    (151, 151),
700    (152, 152),
701    (153, 153),
702    (154, 154),
703    (155, 155),
704    (156, 156),
705    (157, 157),
706    (158, 158),
707    (159, 159),
708    (160, 160),
709    (167, 253),
710    (173, 173),
711    (1025, 161),
712    (1026, 162),
713    (1027, 163),
714    (1028, 164),
715    (1029, 165),
716    (1030, 166),
717    (1031, 167),
718    (1032, 168),
719    (1033, 169),
720    (1034, 170),
721    (1035, 171),
722    (1036, 172),
723    (1038, 174),
724    (1039, 175),
725    (1040, 176),
726    (1041, 177),
727    (1042, 178),
728    (1043, 179),
729    (1044, 180),
730    (1045, 181),
731    (1046, 182),
732    (1047, 183),
733    (1048, 184),
734    (1049, 185),
735    (1050, 186),
736    (1051, 187),
737    (1052, 188),
738    (1053, 189),
739    (1054, 190),
740    (1055, 191),
741    (1056, 192),
742    (1057, 193),
743    (1058, 194),
744    (1059, 195),
745    (1060, 196),
746    (1061, 197),
747    (1062, 198),
748    (1063, 199),
749    (1064, 200),
750    (1065, 201),
751    (1066, 202),
752    (1067, 203),
753    (1068, 204),
754    (1069, 205),
755    (1070, 206),
756    (1071, 207),
757    (1072, 208),
758    (1073, 209),
759    (1074, 210),
760    (1075, 211),
761    (1076, 212),
762    (1077, 213),
763    (1078, 214),
764    (1079, 215),
765    (1080, 216),
766    (1081, 217),
767    (1082, 218),
768    (1083, 219),
769    (1084, 220),
770    (1085, 221),
771    (1086, 222),
772    (1087, 223),
773    (1088, 224),
774    (1089, 225),
775    (1090, 226),
776    (1091, 227),
777    (1092, 228),
778    (1093, 229),
779    (1094, 230),
780    (1095, 231),
781    (1096, 232),
782    (1097, 233),
783    (1098, 234),
784    (1099, 235),
785    (1100, 236),
786    (1101, 237),
787    (1102, 238),
788    (1103, 239),
789    (1105, 241),
790    (1106, 242),
791    (1107, 243),
792    (1108, 244),
793    (1109, 245),
794    (1110, 246),
795    (1111, 247),
796    (1112, 248),
797    (1113, 249),
798    (1114, 250),
799    (1115, 251),
800    (1116, 252),
801    (1118, 254),
802    (1119, 255),
803    (8470, 240),
804];
805
806const ISO_8859_6_TO_UNICODE: [char; 128] = [
807    '\u{80}',
808    '\u{81}',
809    '\u{82}',
810    '\u{83}',
811    '\u{84}',
812    '\u{85}',
813    '\u{86}',
814    '\u{87}',
815    '\u{88}',
816    '\u{89}',
817    '\u{8a}',
818    '\u{8b}',
819    '\u{8c}',
820    '\u{8d}',
821    '\u{8e}',
822    '\u{8f}',
823    '\u{90}',
824    '\u{91}',
825    '\u{92}',
826    '\u{93}',
827    '\u{94}',
828    '\u{95}',
829    '\u{96}',
830    '\u{97}',
831    '\u{98}',
832    '\u{99}',
833    '\u{9a}',
834    '\u{9b}',
835    '\u{9c}',
836    '\u{9d}',
837    '\u{9e}',
838    '\u{9f}',
839    '\u{a0}',
840    char::REPLACEMENT_CHARACTER,
841    char::REPLACEMENT_CHARACTER,
842    char::REPLACEMENT_CHARACTER,
843    '\u{a4}',
844    char::REPLACEMENT_CHARACTER,
845    char::REPLACEMENT_CHARACTER,
846    char::REPLACEMENT_CHARACTER,
847    char::REPLACEMENT_CHARACTER,
848    char::REPLACEMENT_CHARACTER,
849    char::REPLACEMENT_CHARACTER,
850    char::REPLACEMENT_CHARACTER,
851    '\u{60c}',
852    '\u{ad}',
853    char::REPLACEMENT_CHARACTER,
854    char::REPLACEMENT_CHARACTER,
855    char::REPLACEMENT_CHARACTER,
856    char::REPLACEMENT_CHARACTER,
857    char::REPLACEMENT_CHARACTER,
858    char::REPLACEMENT_CHARACTER,
859    char::REPLACEMENT_CHARACTER,
860    char::REPLACEMENT_CHARACTER,
861    char::REPLACEMENT_CHARACTER,
862    char::REPLACEMENT_CHARACTER,
863    char::REPLACEMENT_CHARACTER,
864    char::REPLACEMENT_CHARACTER,
865    char::REPLACEMENT_CHARACTER,
866    '\u{61b}',
867    char::REPLACEMENT_CHARACTER,
868    char::REPLACEMENT_CHARACTER,
869    char::REPLACEMENT_CHARACTER,
870    '\u{61f}',
871    char::REPLACEMENT_CHARACTER,
872    '\u{621}',
873    '\u{622}',
874    '\u{623}',
875    '\u{624}',
876    '\u{625}',
877    '\u{626}',
878    '\u{627}',
879    '\u{628}',
880    '\u{629}',
881    '\u{62a}',
882    '\u{62b}',
883    '\u{62c}',
884    '\u{62d}',
885    '\u{62e}',
886    '\u{62f}',
887    '\u{630}',
888    '\u{631}',
889    '\u{632}',
890    '\u{633}',
891    '\u{634}',
892    '\u{635}',
893    '\u{636}',
894    '\u{637}',
895    '\u{638}',
896    '\u{639}',
897    '\u{63a}',
898    char::REPLACEMENT_CHARACTER,
899    char::REPLACEMENT_CHARACTER,
900    char::REPLACEMENT_CHARACTER,
901    char::REPLACEMENT_CHARACTER,
902    char::REPLACEMENT_CHARACTER,
903    '\u{640}',
904    '\u{641}',
905    '\u{642}',
906    '\u{643}',
907    '\u{644}',
908    '\u{645}',
909    '\u{646}',
910    '\u{647}',
911    '\u{648}',
912    '\u{649}',
913    '\u{64a}',
914    '\u{64b}',
915    '\u{64c}',
916    '\u{64d}',
917    '\u{64e}',
918    '\u{64f}',
919    '\u{650}',
920    '\u{651}',
921    '\u{652}',
922    char::REPLACEMENT_CHARACTER,
923    char::REPLACEMENT_CHARACTER,
924    char::REPLACEMENT_CHARACTER,
925    char::REPLACEMENT_CHARACTER,
926    char::REPLACEMENT_CHARACTER,
927    char::REPLACEMENT_CHARACTER,
928    char::REPLACEMENT_CHARACTER,
929    char::REPLACEMENT_CHARACTER,
930    char::REPLACEMENT_CHARACTER,
931    char::REPLACEMENT_CHARACTER,
932    char::REPLACEMENT_CHARACTER,
933    char::REPLACEMENT_CHARACTER,
934    char::REPLACEMENT_CHARACTER,
935];
936
937const UNICODE_TO_ISO_8859_6: &[(u16, u8)] = &[
938    (128, 128),
939    (129, 129),
940    (130, 130),
941    (131, 131),
942    (132, 132),
943    (133, 133),
944    (134, 134),
945    (135, 135),
946    (136, 136),
947    (137, 137),
948    (138, 138),
949    (139, 139),
950    (140, 140),
951    (141, 141),
952    (142, 142),
953    (143, 143),
954    (144, 144),
955    (145, 145),
956    (146, 146),
957    (147, 147),
958    (148, 148),
959    (149, 149),
960    (150, 150),
961    (151, 151),
962    (152, 152),
963    (153, 153),
964    (154, 154),
965    (155, 155),
966    (156, 156),
967    (157, 157),
968    (158, 158),
969    (159, 159),
970    (160, 160),
971    (164, 164),
972    (173, 173),
973    (1548, 172),
974    (1563, 187),
975    (1567, 191),
976    (1569, 193),
977    (1570, 194),
978    (1571, 195),
979    (1572, 196),
980    (1573, 197),
981    (1574, 198),
982    (1575, 199),
983    (1576, 200),
984    (1577, 201),
985    (1578, 202),
986    (1579, 203),
987    (1580, 204),
988    (1581, 205),
989    (1582, 206),
990    (1583, 207),
991    (1584, 208),
992    (1585, 209),
993    (1586, 210),
994    (1587, 211),
995    (1588, 212),
996    (1589, 213),
997    (1590, 214),
998    (1591, 215),
999    (1592, 216),
1000    (1593, 217),
1001    (1594, 218),
1002    (1600, 224),
1003    (1601, 225),
1004    (1602, 226),
1005    (1603, 227),
1006    (1604, 228),
1007    (1605, 229),
1008    (1606, 230),
1009    (1607, 231),
1010    (1608, 232),
1011    (1609, 233),
1012    (1610, 234),
1013    (1611, 235),
1014    (1612, 236),
1015    (1613, 237),
1016    (1614, 238),
1017    (1615, 239),
1018    (1616, 240),
1019    (1617, 241),
1020    (1618, 242),
1021];
1022
1023const ISO_8859_7_TO_UNICODE: [char; 128] = [
1024    '\u{80}',
1025    '\u{81}',
1026    '\u{82}',
1027    '\u{83}',
1028    '\u{84}',
1029    '\u{85}',
1030    '\u{86}',
1031    '\u{87}',
1032    '\u{88}',
1033    '\u{89}',
1034    '\u{8a}',
1035    '\u{8b}',
1036    '\u{8c}',
1037    '\u{8d}',
1038    '\u{8e}',
1039    '\u{8f}',
1040    '\u{90}',
1041    '\u{91}',
1042    '\u{92}',
1043    '\u{93}',
1044    '\u{94}',
1045    '\u{95}',
1046    '\u{96}',
1047    '\u{97}',
1048    '\u{98}',
1049    '\u{99}',
1050    '\u{9a}',
1051    '\u{9b}',
1052    '\u{9c}',
1053    '\u{9d}',
1054    '\u{9e}',
1055    '\u{9f}',
1056    '\u{a0}',
1057    '\u{2018}',
1058    '\u{2019}',
1059    '\u{a3}',
1060    '\u{20ac}',
1061    '\u{20af}',
1062    '\u{a6}',
1063    '\u{a7}',
1064    '\u{a8}',
1065    '\u{a9}',
1066    '\u{37a}',
1067    '\u{ab}',
1068    '\u{ac}',
1069    '\u{ad}',
1070    char::REPLACEMENT_CHARACTER,
1071    '\u{2015}',
1072    '\u{b0}',
1073    '\u{b1}',
1074    '\u{b2}',
1075    '\u{b3}',
1076    '\u{384}',
1077    '\u{385}',
1078    '\u{386}',
1079    '\u{b7}',
1080    '\u{388}',
1081    '\u{389}',
1082    '\u{38a}',
1083    '\u{bb}',
1084    '\u{38c}',
1085    '\u{bd}',
1086    '\u{38e}',
1087    '\u{38f}',
1088    '\u{390}',
1089    '\u{391}',
1090    '\u{392}',
1091    '\u{393}',
1092    '\u{394}',
1093    '\u{395}',
1094    '\u{396}',
1095    '\u{397}',
1096    '\u{398}',
1097    '\u{399}',
1098    '\u{39a}',
1099    '\u{39b}',
1100    '\u{39c}',
1101    '\u{39d}',
1102    '\u{39e}',
1103    '\u{39f}',
1104    '\u{3a0}',
1105    '\u{3a1}',
1106    char::REPLACEMENT_CHARACTER,
1107    '\u{3a3}',
1108    '\u{3a4}',
1109    '\u{3a5}',
1110    '\u{3a6}',
1111    '\u{3a7}',
1112    '\u{3a8}',
1113    '\u{3a9}',
1114    '\u{3aa}',
1115    '\u{3ab}',
1116    '\u{3ac}',
1117    '\u{3ad}',
1118    '\u{3ae}',
1119    '\u{3af}',
1120    '\u{3b0}',
1121    '\u{3b1}',
1122    '\u{3b2}',
1123    '\u{3b3}',
1124    '\u{3b4}',
1125    '\u{3b5}',
1126    '\u{3b6}',
1127    '\u{3b7}',
1128    '\u{3b8}',
1129    '\u{3b9}',
1130    '\u{3ba}',
1131    '\u{3bb}',
1132    '\u{3bc}',
1133    '\u{3bd}',
1134    '\u{3be}',
1135    '\u{3bf}',
1136    '\u{3c0}',
1137    '\u{3c1}',
1138    '\u{3c2}',
1139    '\u{3c3}',
1140    '\u{3c4}',
1141    '\u{3c5}',
1142    '\u{3c6}',
1143    '\u{3c7}',
1144    '\u{3c8}',
1145    '\u{3c9}',
1146    '\u{3ca}',
1147    '\u{3cb}',
1148    '\u{3cc}',
1149    '\u{3cd}',
1150    '\u{3ce}',
1151    char::REPLACEMENT_CHARACTER,
1152];
1153
1154const UNICODE_TO_ISO_8859_7: &[(u16, u8)] = &[
1155    (128, 128),
1156    (129, 129),
1157    (130, 130),
1158    (131, 131),
1159    (132, 132),
1160    (133, 133),
1161    (134, 134),
1162    (135, 135),
1163    (136, 136),
1164    (137, 137),
1165    (138, 138),
1166    (139, 139),
1167    (140, 140),
1168    (141, 141),
1169    (142, 142),
1170    (143, 143),
1171    (144, 144),
1172    (145, 145),
1173    (146, 146),
1174    (147, 147),
1175    (148, 148),
1176    (149, 149),
1177    (150, 150),
1178    (151, 151),
1179    (152, 152),
1180    (153, 153),
1181    (154, 154),
1182    (155, 155),
1183    (156, 156),
1184    (157, 157),
1185    (158, 158),
1186    (159, 159),
1187    (160, 160),
1188    (163, 163),
1189    (166, 166),
1190    (167, 167),
1191    (168, 168),
1192    (169, 169),
1193    (171, 171),
1194    (172, 172),
1195    (173, 173),
1196    (176, 176),
1197    (177, 177),
1198    (178, 178),
1199    (179, 179),
1200    (183, 183),
1201    (187, 187),
1202    (189, 189),
1203    (890, 170),
1204    (900, 180),
1205    (901, 181),
1206    (902, 182),
1207    (904, 184),
1208    (905, 185),
1209    (906, 186),
1210    (908, 188),
1211    (910, 190),
1212    (911, 191),
1213    (912, 192),
1214    (913, 193),
1215    (914, 194),
1216    (915, 195),
1217    (916, 196),
1218    (917, 197),
1219    (918, 198),
1220    (919, 199),
1221    (920, 200),
1222    (921, 201),
1223    (922, 202),
1224    (923, 203),
1225    (924, 204),
1226    (925, 205),
1227    (926, 206),
1228    (927, 207),
1229    (928, 208),
1230    (929, 209),
1231    (931, 211),
1232    (932, 212),
1233    (933, 213),
1234    (934, 214),
1235    (935, 215),
1236    (936, 216),
1237    (937, 217),
1238    (938, 218),
1239    (939, 219),
1240    (940, 220),
1241    (941, 221),
1242    (942, 222),
1243    (943, 223),
1244    (944, 224),
1245    (945, 225),
1246    (946, 226),
1247    (947, 227),
1248    (948, 228),
1249    (949, 229),
1250    (950, 230),
1251    (951, 231),
1252    (952, 232),
1253    (953, 233),
1254    (954, 234),
1255    (955, 235),
1256    (956, 236),
1257    (957, 237),
1258    (958, 238),
1259    (959, 239),
1260    (960, 240),
1261    (961, 241),
1262    (962, 242),
1263    (963, 243),
1264    (964, 244),
1265    (965, 245),
1266    (966, 246),
1267    (967, 247),
1268    (968, 248),
1269    (969, 249),
1270    (970, 250),
1271    (971, 251),
1272    (972, 252),
1273    (973, 253),
1274    (974, 254),
1275    (8213, 175),
1276    (8216, 161),
1277    (8217, 162),
1278    (8364, 164),
1279    (8367, 165),
1280];
1281
1282const ISO_8859_8_TO_UNICODE: [char; 128] = [
1283    '\u{80}',
1284    '\u{81}',
1285    '\u{82}',
1286    '\u{83}',
1287    '\u{84}',
1288    '\u{85}',
1289    '\u{86}',
1290    '\u{87}',
1291    '\u{88}',
1292    '\u{89}',
1293    '\u{8a}',
1294    '\u{8b}',
1295    '\u{8c}',
1296    '\u{8d}',
1297    '\u{8e}',
1298    '\u{8f}',
1299    '\u{90}',
1300    '\u{91}',
1301    '\u{92}',
1302    '\u{93}',
1303    '\u{94}',
1304    '\u{95}',
1305    '\u{96}',
1306    '\u{97}',
1307    '\u{98}',
1308    '\u{99}',
1309    '\u{9a}',
1310    '\u{9b}',
1311    '\u{9c}',
1312    '\u{9d}',
1313    '\u{9e}',
1314    '\u{9f}',
1315    '\u{a0}',
1316    char::REPLACEMENT_CHARACTER,
1317    '\u{a2}',
1318    '\u{a3}',
1319    '\u{a4}',
1320    '\u{a5}',
1321    '\u{a6}',
1322    '\u{a7}',
1323    '\u{a8}',
1324    '\u{a9}',
1325    '\u{d7}',
1326    '\u{ab}',
1327    '\u{ac}',
1328    '\u{ad}',
1329    '\u{ae}',
1330    '\u{af}',
1331    '\u{b0}',
1332    '\u{b1}',
1333    '\u{b2}',
1334    '\u{b3}',
1335    '\u{b4}',
1336    '\u{b5}',
1337    '\u{b6}',
1338    '\u{b7}',
1339    '\u{b8}',
1340    '\u{b9}',
1341    '\u{f7}',
1342    '\u{bb}',
1343    '\u{bc}',
1344    '\u{bd}',
1345    '\u{be}',
1346    char::REPLACEMENT_CHARACTER,
1347    char::REPLACEMENT_CHARACTER,
1348    char::REPLACEMENT_CHARACTER,
1349    char::REPLACEMENT_CHARACTER,
1350    char::REPLACEMENT_CHARACTER,
1351    char::REPLACEMENT_CHARACTER,
1352    char::REPLACEMENT_CHARACTER,
1353    char::REPLACEMENT_CHARACTER,
1354    char::REPLACEMENT_CHARACTER,
1355    char::REPLACEMENT_CHARACTER,
1356    char::REPLACEMENT_CHARACTER,
1357    char::REPLACEMENT_CHARACTER,
1358    char::REPLACEMENT_CHARACTER,
1359    char::REPLACEMENT_CHARACTER,
1360    char::REPLACEMENT_CHARACTER,
1361    char::REPLACEMENT_CHARACTER,
1362    char::REPLACEMENT_CHARACTER,
1363    char::REPLACEMENT_CHARACTER,
1364    char::REPLACEMENT_CHARACTER,
1365    char::REPLACEMENT_CHARACTER,
1366    char::REPLACEMENT_CHARACTER,
1367    char::REPLACEMENT_CHARACTER,
1368    char::REPLACEMENT_CHARACTER,
1369    char::REPLACEMENT_CHARACTER,
1370    char::REPLACEMENT_CHARACTER,
1371    char::REPLACEMENT_CHARACTER,
1372    char::REPLACEMENT_CHARACTER,
1373    char::REPLACEMENT_CHARACTER,
1374    char::REPLACEMENT_CHARACTER,
1375    char::REPLACEMENT_CHARACTER,
1376    char::REPLACEMENT_CHARACTER,
1377    char::REPLACEMENT_CHARACTER,
1378    '\u{2017}',
1379    '\u{5d0}',
1380    '\u{5d1}',
1381    '\u{5d2}',
1382    '\u{5d3}',
1383    '\u{5d4}',
1384    '\u{5d5}',
1385    '\u{5d6}',
1386    '\u{5d7}',
1387    '\u{5d8}',
1388    '\u{5d9}',
1389    '\u{5da}',
1390    '\u{5db}',
1391    '\u{5dc}',
1392    '\u{5dd}',
1393    '\u{5de}',
1394    '\u{5df}',
1395    '\u{5e0}',
1396    '\u{5e1}',
1397    '\u{5e2}',
1398    '\u{5e3}',
1399    '\u{5e4}',
1400    '\u{5e5}',
1401    '\u{5e6}',
1402    '\u{5e7}',
1403    '\u{5e8}',
1404    '\u{5e9}',
1405    '\u{5ea}',
1406    char::REPLACEMENT_CHARACTER,
1407    char::REPLACEMENT_CHARACTER,
1408    '\u{200e}',
1409    '\u{200f}',
1410    char::REPLACEMENT_CHARACTER,
1411];
1412
1413const UNICODE_TO_ISO_8859_8: &[(u16, u8)] = &[
1414    (128, 128),
1415    (129, 129),
1416    (130, 130),
1417    (131, 131),
1418    (132, 132),
1419    (133, 133),
1420    (134, 134),
1421    (135, 135),
1422    (136, 136),
1423    (137, 137),
1424    (138, 138),
1425    (139, 139),
1426    (140, 140),
1427    (141, 141),
1428    (142, 142),
1429    (143, 143),
1430    (144, 144),
1431    (145, 145),
1432    (146, 146),
1433    (147, 147),
1434    (148, 148),
1435    (149, 149),
1436    (150, 150),
1437    (151, 151),
1438    (152, 152),
1439    (153, 153),
1440    (154, 154),
1441    (155, 155),
1442    (156, 156),
1443    (157, 157),
1444    (158, 158),
1445    (159, 159),
1446    (160, 160),
1447    (162, 162),
1448    (163, 163),
1449    (164, 164),
1450    (165, 165),
1451    (166, 166),
1452    (167, 167),
1453    (168, 168),
1454    (169, 169),
1455    (171, 171),
1456    (172, 172),
1457    (173, 173),
1458    (174, 174),
1459    (175, 175),
1460    (176, 176),
1461    (177, 177),
1462    (178, 178),
1463    (179, 179),
1464    (180, 180),
1465    (181, 181),
1466    (182, 182),
1467    (183, 183),
1468    (184, 184),
1469    (185, 185),
1470    (187, 187),
1471    (188, 188),
1472    (189, 189),
1473    (190, 190),
1474    (215, 170),
1475    (247, 186),
1476    (1488, 224),
1477    (1489, 225),
1478    (1490, 226),
1479    (1491, 227),
1480    (1492, 228),
1481    (1493, 229),
1482    (1494, 230),
1483    (1495, 231),
1484    (1496, 232),
1485    (1497, 233),
1486    (1498, 234),
1487    (1499, 235),
1488    (1500, 236),
1489    (1501, 237),
1490    (1502, 238),
1491    (1503, 239),
1492    (1504, 240),
1493    (1505, 241),
1494    (1506, 242),
1495    (1507, 243),
1496    (1508, 244),
1497    (1509, 245),
1498    (1510, 246),
1499    (1511, 247),
1500    (1512, 248),
1501    (1513, 249),
1502    (1514, 250),
1503    (8206, 253),
1504    (8207, 254),
1505    (8215, 223),
1506];
1507
1508const ISO_8859_9_TO_UNICODE: [char; 128] = [
1509    '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}',
1510    '\u{89}', '\u{8a}', '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}',
1511    '\u{92}', '\u{93}', '\u{94}', '\u{95}', '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}',
1512    '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}', '\u{a1}', '\u{a2}', '\u{a3}',
1513    '\u{a4}', '\u{a5}', '\u{a6}', '\u{a7}', '\u{a8}', '\u{a9}', '\u{aa}', '\u{ab}', '\u{ac}',
1514    '\u{ad}', '\u{ae}', '\u{af}', '\u{b0}', '\u{b1}', '\u{b2}', '\u{b3}', '\u{b4}', '\u{b5}',
1515    '\u{b6}', '\u{b7}', '\u{b8}', '\u{b9}', '\u{ba}', '\u{bb}', '\u{bc}', '\u{bd}', '\u{be}',
1516    '\u{bf}', '\u{c0}', '\u{c1}', '\u{c2}', '\u{c3}', '\u{c4}', '\u{c5}', '\u{c6}', '\u{c7}',
1517    '\u{c8}', '\u{c9}', '\u{ca}', '\u{cb}', '\u{cc}', '\u{cd}', '\u{ce}', '\u{cf}', '\u{11e}',
1518    '\u{d1}', '\u{d2}', '\u{d3}', '\u{d4}', '\u{d5}', '\u{d6}', '\u{d7}', '\u{d8}', '\u{d9}',
1519    '\u{da}', '\u{db}', '\u{dc}', '\u{130}', '\u{15e}', '\u{df}', '\u{e0}', '\u{e1}', '\u{e2}',
1520    '\u{e3}', '\u{e4}', '\u{e5}', '\u{e6}', '\u{e7}', '\u{e8}', '\u{e9}', '\u{ea}', '\u{eb}',
1521    '\u{ec}', '\u{ed}', '\u{ee}', '\u{ef}', '\u{11f}', '\u{f1}', '\u{f2}', '\u{f3}', '\u{f4}',
1522    '\u{f5}', '\u{f6}', '\u{f7}', '\u{f8}', '\u{f9}', '\u{fa}', '\u{fb}', '\u{fc}', '\u{131}',
1523    '\u{15f}', '\u{ff}',
1524];
1525
1526const UNICODE_TO_ISO_8859_9: &[(u16, u8)] = &[
1527    (128, 128),
1528    (129, 129),
1529    (130, 130),
1530    (131, 131),
1531    (132, 132),
1532    (133, 133),
1533    (134, 134),
1534    (135, 135),
1535    (136, 136),
1536    (137, 137),
1537    (138, 138),
1538    (139, 139),
1539    (140, 140),
1540    (141, 141),
1541    (142, 142),
1542    (143, 143),
1543    (144, 144),
1544    (145, 145),
1545    (146, 146),
1546    (147, 147),
1547    (148, 148),
1548    (149, 149),
1549    (150, 150),
1550    (151, 151),
1551    (152, 152),
1552    (153, 153),
1553    (154, 154),
1554    (155, 155),
1555    (156, 156),
1556    (157, 157),
1557    (158, 158),
1558    (159, 159),
1559    (160, 160),
1560    (161, 161),
1561    (162, 162),
1562    (163, 163),
1563    (164, 164),
1564    (165, 165),
1565    (166, 166),
1566    (167, 167),
1567    (168, 168),
1568    (169, 169),
1569    (170, 170),
1570    (171, 171),
1571    (172, 172),
1572    (173, 173),
1573    (174, 174),
1574    (175, 175),
1575    (176, 176),
1576    (177, 177),
1577    (178, 178),
1578    (179, 179),
1579    (180, 180),
1580    (181, 181),
1581    (182, 182),
1582    (183, 183),
1583    (184, 184),
1584    (185, 185),
1585    (186, 186),
1586    (187, 187),
1587    (188, 188),
1588    (189, 189),
1589    (190, 190),
1590    (191, 191),
1591    (192, 192),
1592    (193, 193),
1593    (194, 194),
1594    (195, 195),
1595    (196, 196),
1596    (197, 197),
1597    (198, 198),
1598    (199, 199),
1599    (200, 200),
1600    (201, 201),
1601    (202, 202),
1602    (203, 203),
1603    (204, 204),
1604    (205, 205),
1605    (206, 206),
1606    (207, 207),
1607    (209, 209),
1608    (210, 210),
1609    (211, 211),
1610    (212, 212),
1611    (213, 213),
1612    (214, 214),
1613    (215, 215),
1614    (216, 216),
1615    (217, 217),
1616    (218, 218),
1617    (219, 219),
1618    (220, 220),
1619    (223, 223),
1620    (224, 224),
1621    (225, 225),
1622    (226, 226),
1623    (227, 227),
1624    (228, 228),
1625    (229, 229),
1626    (230, 230),
1627    (231, 231),
1628    (232, 232),
1629    (233, 233),
1630    (234, 234),
1631    (235, 235),
1632    (236, 236),
1633    (237, 237),
1634    (238, 238),
1635    (239, 239),
1636    (241, 241),
1637    (242, 242),
1638    (243, 243),
1639    (244, 244),
1640    (245, 245),
1641    (246, 246),
1642    (247, 247),
1643    (248, 248),
1644    (249, 249),
1645    (250, 250),
1646    (251, 251),
1647    (252, 252),
1648    (255, 255),
1649    (286, 208),
1650    (287, 240),
1651    (304, 221),
1652    (305, 253),
1653    (350, 222),
1654    (351, 254),
1655];
1656
1657const ISO_8859_10_TO_UNICODE: [char; 128] = [
1658    '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}',
1659    '\u{89}', '\u{8a}', '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}',
1660    '\u{92}', '\u{93}', '\u{94}', '\u{95}', '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}',
1661    '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}', '\u{104}', '\u{112}', '\u{122}',
1662    '\u{12a}', '\u{128}', '\u{136}', '\u{a7}', '\u{13b}', '\u{110}', '\u{160}', '\u{166}',
1663    '\u{17d}', '\u{ad}', '\u{16a}', '\u{14a}', '\u{b0}', '\u{105}', '\u{113}', '\u{123}',
1664    '\u{12b}', '\u{129}', '\u{137}', '\u{b7}', '\u{13c}', '\u{111}', '\u{161}', '\u{167}',
1665    '\u{17e}', '\u{2015}', '\u{16b}', '\u{14b}', '\u{100}', '\u{c1}', '\u{c2}', '\u{c3}', '\u{c4}',
1666    '\u{c5}', '\u{c6}', '\u{12e}', '\u{10c}', '\u{c9}', '\u{118}', '\u{cb}', '\u{116}', '\u{cd}',
1667    '\u{ce}', '\u{cf}', '\u{d0}', '\u{145}', '\u{14c}', '\u{d3}', '\u{d4}', '\u{d5}', '\u{d6}',
1668    '\u{168}', '\u{d8}', '\u{172}', '\u{da}', '\u{db}', '\u{dc}', '\u{dd}', '\u{de}', '\u{df}',
1669    '\u{101}', '\u{e1}', '\u{e2}', '\u{e3}', '\u{e4}', '\u{e5}', '\u{e6}', '\u{12f}', '\u{10d}',
1670    '\u{e9}', '\u{119}', '\u{eb}', '\u{117}', '\u{ed}', '\u{ee}', '\u{ef}', '\u{f0}', '\u{146}',
1671    '\u{14d}', '\u{f3}', '\u{f4}', '\u{f5}', '\u{f6}', '\u{169}', '\u{f8}', '\u{173}', '\u{fa}',
1672    '\u{fb}', '\u{fc}', '\u{fd}', '\u{fe}', '\u{138}',
1673];
1674
1675const UNICODE_TO_ISO_8859_10: &[(u16, u8)] = &[
1676    (128, 128),
1677    (129, 129),
1678    (130, 130),
1679    (131, 131),
1680    (132, 132),
1681    (133, 133),
1682    (134, 134),
1683    (135, 135),
1684    (136, 136),
1685    (137, 137),
1686    (138, 138),
1687    (139, 139),
1688    (140, 140),
1689    (141, 141),
1690    (142, 142),
1691    (143, 143),
1692    (144, 144),
1693    (145, 145),
1694    (146, 146),
1695    (147, 147),
1696    (148, 148),
1697    (149, 149),
1698    (150, 150),
1699    (151, 151),
1700    (152, 152),
1701    (153, 153),
1702    (154, 154),
1703    (155, 155),
1704    (156, 156),
1705    (157, 157),
1706    (158, 158),
1707    (159, 159),
1708    (160, 160),
1709    (167, 167),
1710    (173, 173),
1711    (176, 176),
1712    (183, 183),
1713    (193, 193),
1714    (194, 194),
1715    (195, 195),
1716    (196, 196),
1717    (197, 197),
1718    (198, 198),
1719    (201, 201),
1720    (203, 203),
1721    (205, 205),
1722    (206, 206),
1723    (207, 207),
1724    (208, 208),
1725    (211, 211),
1726    (212, 212),
1727    (213, 213),
1728    (214, 214),
1729    (216, 216),
1730    (218, 218),
1731    (219, 219),
1732    (220, 220),
1733    (221, 221),
1734    (222, 222),
1735    (223, 223),
1736    (225, 225),
1737    (226, 226),
1738    (227, 227),
1739    (228, 228),
1740    (229, 229),
1741    (230, 230),
1742    (233, 233),
1743    (235, 235),
1744    (237, 237),
1745    (238, 238),
1746    (239, 239),
1747    (240, 240),
1748    (243, 243),
1749    (244, 244),
1750    (245, 245),
1751    (246, 246),
1752    (248, 248),
1753    (250, 250),
1754    (251, 251),
1755    (252, 252),
1756    (253, 253),
1757    (254, 254),
1758    (256, 192),
1759    (257, 224),
1760    (260, 161),
1761    (261, 177),
1762    (268, 200),
1763    (269, 232),
1764    (272, 169),
1765    (273, 185),
1766    (274, 162),
1767    (275, 178),
1768    (278, 204),
1769    (279, 236),
1770    (280, 202),
1771    (281, 234),
1772    (290, 163),
1773    (291, 179),
1774    (296, 165),
1775    (297, 181),
1776    (298, 164),
1777    (299, 180),
1778    (302, 199),
1779    (303, 231),
1780    (310, 166),
1781    (311, 182),
1782    (312, 255),
1783    (315, 168),
1784    (316, 184),
1785    (325, 209),
1786    (326, 241),
1787    (330, 175),
1788    (331, 191),
1789    (332, 210),
1790    (333, 242),
1791    (352, 170),
1792    (353, 186),
1793    (358, 171),
1794    (359, 187),
1795    (360, 215),
1796    (361, 247),
1797    (362, 174),
1798    (363, 190),
1799    (370, 217),
1800    (371, 249),
1801    (381, 172),
1802    (382, 188),
1803    (8213, 189),
1804];
1805
1806const ISO_8859_11_TO_UNICODE: [char; 128] = [
1807    '\u{80}',
1808    '\u{81}',
1809    '\u{82}',
1810    '\u{83}',
1811    '\u{84}',
1812    '\u{85}',
1813    '\u{86}',
1814    '\u{87}',
1815    '\u{88}',
1816    '\u{89}',
1817    '\u{8a}',
1818    '\u{8b}',
1819    '\u{8c}',
1820    '\u{8d}',
1821    '\u{8e}',
1822    '\u{8f}',
1823    '\u{90}',
1824    '\u{91}',
1825    '\u{92}',
1826    '\u{93}',
1827    '\u{94}',
1828    '\u{95}',
1829    '\u{96}',
1830    '\u{97}',
1831    '\u{98}',
1832    '\u{99}',
1833    '\u{9a}',
1834    '\u{9b}',
1835    '\u{9c}',
1836    '\u{9d}',
1837    '\u{9e}',
1838    '\u{9f}',
1839    '\u{a0}',
1840    '\u{e01}',
1841    '\u{e02}',
1842    '\u{e03}',
1843    '\u{e04}',
1844    '\u{e05}',
1845    '\u{e06}',
1846    '\u{e07}',
1847    '\u{e08}',
1848    '\u{e09}',
1849    '\u{e0a}',
1850    '\u{e0b}',
1851    '\u{e0c}',
1852    '\u{e0d}',
1853    '\u{e0e}',
1854    '\u{e0f}',
1855    '\u{e10}',
1856    '\u{e11}',
1857    '\u{e12}',
1858    '\u{e13}',
1859    '\u{e14}',
1860    '\u{e15}',
1861    '\u{e16}',
1862    '\u{e17}',
1863    '\u{e18}',
1864    '\u{e19}',
1865    '\u{e1a}',
1866    '\u{e1b}',
1867    '\u{e1c}',
1868    '\u{e1d}',
1869    '\u{e1e}',
1870    '\u{e1f}',
1871    '\u{e20}',
1872    '\u{e21}',
1873    '\u{e22}',
1874    '\u{e23}',
1875    '\u{e24}',
1876    '\u{e25}',
1877    '\u{e26}',
1878    '\u{e27}',
1879    '\u{e28}',
1880    '\u{e29}',
1881    '\u{e2a}',
1882    '\u{e2b}',
1883    '\u{e2c}',
1884    '\u{e2d}',
1885    '\u{e2e}',
1886    '\u{e2f}',
1887    '\u{e30}',
1888    '\u{e31}',
1889    '\u{e32}',
1890    '\u{e33}',
1891    '\u{e34}',
1892    '\u{e35}',
1893    '\u{e36}',
1894    '\u{e37}',
1895    '\u{e38}',
1896    '\u{e39}',
1897    '\u{e3a}',
1898    char::REPLACEMENT_CHARACTER,
1899    char::REPLACEMENT_CHARACTER,
1900    char::REPLACEMENT_CHARACTER,
1901    char::REPLACEMENT_CHARACTER,
1902    '\u{e3f}',
1903    '\u{e40}',
1904    '\u{e41}',
1905    '\u{e42}',
1906    '\u{e43}',
1907    '\u{e44}',
1908    '\u{e45}',
1909    '\u{e46}',
1910    '\u{e47}',
1911    '\u{e48}',
1912    '\u{e49}',
1913    '\u{e4a}',
1914    '\u{e4b}',
1915    '\u{e4c}',
1916    '\u{e4d}',
1917    '\u{e4e}',
1918    '\u{e4f}',
1919    '\u{e50}',
1920    '\u{e51}',
1921    '\u{e52}',
1922    '\u{e53}',
1923    '\u{e54}',
1924    '\u{e55}',
1925    '\u{e56}',
1926    '\u{e57}',
1927    '\u{e58}',
1928    '\u{e59}',
1929    '\u{e5a}',
1930    '\u{e5b}',
1931    char::REPLACEMENT_CHARACTER,
1932    char::REPLACEMENT_CHARACTER,
1933    char::REPLACEMENT_CHARACTER,
1934    char::REPLACEMENT_CHARACTER,
1935];
1936
1937const UNICODE_TO_ISO_8859_11: &[(u16, u8)] = &[
1938    (128, 128),
1939    (129, 129),
1940    (130, 130),
1941    (131, 131),
1942    (132, 132),
1943    (133, 133),
1944    (134, 134),
1945    (135, 135),
1946    (136, 136),
1947    (137, 137),
1948    (138, 138),
1949    (139, 139),
1950    (140, 140),
1951    (141, 141),
1952    (142, 142),
1953    (143, 143),
1954    (144, 144),
1955    (145, 145),
1956    (146, 146),
1957    (147, 147),
1958    (148, 148),
1959    (149, 149),
1960    (150, 150),
1961    (151, 151),
1962    (152, 152),
1963    (153, 153),
1964    (154, 154),
1965    (155, 155),
1966    (156, 156),
1967    (157, 157),
1968    (158, 158),
1969    (159, 159),
1970    (160, 160),
1971    (3585, 161),
1972    (3586, 162),
1973    (3587, 163),
1974    (3588, 164),
1975    (3589, 165),
1976    (3590, 166),
1977    (3591, 167),
1978    (3592, 168),
1979    (3593, 169),
1980    (3594, 170),
1981    (3595, 171),
1982    (3596, 172),
1983    (3597, 173),
1984    (3598, 174),
1985    (3599, 175),
1986    (3600, 176),
1987    (3601, 177),
1988    (3602, 178),
1989    (3603, 179),
1990    (3604, 180),
1991    (3605, 181),
1992    (3606, 182),
1993    (3607, 183),
1994    (3608, 184),
1995    (3609, 185),
1996    (3610, 186),
1997    (3611, 187),
1998    (3612, 188),
1999    (3613, 189),
2000    (3614, 190),
2001    (3615, 191),
2002    (3616, 192),
2003    (3617, 193),
2004    (3618, 194),
2005    (3619, 195),
2006    (3620, 196),
2007    (3621, 197),
2008    (3622, 198),
2009    (3623, 199),
2010    (3624, 200),
2011    (3625, 201),
2012    (3626, 202),
2013    (3627, 203),
2014    (3628, 204),
2015    (3629, 205),
2016    (3630, 206),
2017    (3631, 207),
2018    (3632, 208),
2019    (3633, 209),
2020    (3634, 210),
2021    (3635, 211),
2022    (3636, 212),
2023    (3637, 213),
2024    (3638, 214),
2025    (3639, 215),
2026    (3640, 216),
2027    (3641, 217),
2028    (3642, 218),
2029    (3647, 223),
2030    (3648, 224),
2031    (3649, 225),
2032    (3650, 226),
2033    (3651, 227),
2034    (3652, 228),
2035    (3653, 229),
2036    (3654, 230),
2037    (3655, 231),
2038    (3656, 232),
2039    (3657, 233),
2040    (3658, 234),
2041    (3659, 235),
2042    (3660, 236),
2043    (3661, 237),
2044    (3662, 238),
2045    (3663, 239),
2046    (3664, 240),
2047    (3665, 241),
2048    (3666, 242),
2049    (3667, 243),
2050    (3668, 244),
2051    (3669, 245),
2052    (3670, 246),
2053    (3671, 247),
2054    (3672, 248),
2055    (3673, 249),
2056    (3674, 250),
2057    (3675, 251),
2058];
2059
2060const ISO_8859_13_TO_UNICODE: [char; 128] = [
2061    '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}',
2062    '\u{89}', '\u{8a}', '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}',
2063    '\u{92}', '\u{93}', '\u{94}', '\u{95}', '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}',
2064    '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}', '\u{201d}', '\u{a2}', '\u{a3}',
2065    '\u{a4}', '\u{201e}', '\u{a6}', '\u{a7}', '\u{d8}', '\u{a9}', '\u{156}', '\u{ab}', '\u{ac}',
2066    '\u{ad}', '\u{ae}', '\u{c6}', '\u{b0}', '\u{b1}', '\u{b2}', '\u{b3}', '\u{201c}', '\u{b5}',
2067    '\u{b6}', '\u{b7}', '\u{f8}', '\u{b9}', '\u{157}', '\u{bb}', '\u{bc}', '\u{bd}', '\u{be}',
2068    '\u{e6}', '\u{104}', '\u{12e}', '\u{100}', '\u{106}', '\u{c4}', '\u{c5}', '\u{118}', '\u{112}',
2069    '\u{10c}', '\u{c9}', '\u{179}', '\u{116}', '\u{122}', '\u{136}', '\u{12a}', '\u{13b}',
2070    '\u{160}', '\u{143}', '\u{145}', '\u{d3}', '\u{14c}', '\u{d5}', '\u{d6}', '\u{d7}', '\u{172}',
2071    '\u{141}', '\u{15a}', '\u{16a}', '\u{dc}', '\u{17b}', '\u{17d}', '\u{df}', '\u{105}',
2072    '\u{12f}', '\u{101}', '\u{107}', '\u{e4}', '\u{e5}', '\u{119}', '\u{113}', '\u{10d}', '\u{e9}',
2073    '\u{17a}', '\u{117}', '\u{123}', '\u{137}', '\u{12b}', '\u{13c}', '\u{161}', '\u{144}',
2074    '\u{146}', '\u{f3}', '\u{14d}', '\u{f5}', '\u{f6}', '\u{f7}', '\u{173}', '\u{142}', '\u{15b}',
2075    '\u{16b}', '\u{fc}', '\u{17c}', '\u{17e}', '\u{2019}',
2076];
2077
2078const UNICODE_TO_ISO_8859_13: &[(u16, u8)] = &[
2079    (128, 128),
2080    (129, 129),
2081    (130, 130),
2082    (131, 131),
2083    (132, 132),
2084    (133, 133),
2085    (134, 134),
2086    (135, 135),
2087    (136, 136),
2088    (137, 137),
2089    (138, 138),
2090    (139, 139),
2091    (140, 140),
2092    (141, 141),
2093    (142, 142),
2094    (143, 143),
2095    (144, 144),
2096    (145, 145),
2097    (146, 146),
2098    (147, 147),
2099    (148, 148),
2100    (149, 149),
2101    (150, 150),
2102    (151, 151),
2103    (152, 152),
2104    (153, 153),
2105    (154, 154),
2106    (155, 155),
2107    (156, 156),
2108    (157, 157),
2109    (158, 158),
2110    (159, 159),
2111    (160, 160),
2112    (162, 162),
2113    (163, 163),
2114    (164, 164),
2115    (166, 166),
2116    (167, 167),
2117    (169, 169),
2118    (171, 171),
2119    (172, 172),
2120    (173, 173),
2121    (174, 174),
2122    (176, 176),
2123    (177, 177),
2124    (178, 178),
2125    (179, 179),
2126    (181, 181),
2127    (182, 182),
2128    (183, 183),
2129    (185, 185),
2130    (187, 187),
2131    (188, 188),
2132    (189, 189),
2133    (190, 190),
2134    (196, 196),
2135    (197, 197),
2136    (198, 175),
2137    (201, 201),
2138    (211, 211),
2139    (213, 213),
2140    (214, 214),
2141    (215, 215),
2142    (216, 168),
2143    (220, 220),
2144    (223, 223),
2145    (228, 228),
2146    (229, 229),
2147    (230, 191),
2148    (233, 233),
2149    (243, 243),
2150    (245, 245),
2151    (246, 246),
2152    (247, 247),
2153    (248, 184),
2154    (252, 252),
2155    (256, 194),
2156    (257, 226),
2157    (260, 192),
2158    (261, 224),
2159    (262, 195),
2160    (263, 227),
2161    (268, 200),
2162    (269, 232),
2163    (274, 199),
2164    (275, 231),
2165    (278, 203),
2166    (279, 235),
2167    (280, 198),
2168    (281, 230),
2169    (290, 204),
2170    (291, 236),
2171    (298, 206),
2172    (299, 238),
2173    (302, 193),
2174    (303, 225),
2175    (310, 205),
2176    (311, 237),
2177    (315, 207),
2178    (316, 239),
2179    (321, 217),
2180    (322, 249),
2181    (323, 209),
2182    (324, 241),
2183    (325, 210),
2184    (326, 242),
2185    (332, 212),
2186    (333, 244),
2187    (342, 170),
2188    (343, 186),
2189    (346, 218),
2190    (347, 250),
2191    (352, 208),
2192    (353, 240),
2193    (362, 219),
2194    (363, 251),
2195    (370, 216),
2196    (371, 248),
2197    (377, 202),
2198    (378, 234),
2199    (379, 221),
2200    (380, 253),
2201    (381, 222),
2202    (382, 254),
2203    (8217, 255),
2204    (8220, 180),
2205    (8221, 161),
2206    (8222, 165),
2207];
2208
2209const ISO_8859_14_TO_UNICODE: [char; 128] = [
2210    '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}',
2211    '\u{89}', '\u{8a}', '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}',
2212    '\u{92}', '\u{93}', '\u{94}', '\u{95}', '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}',
2213    '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}', '\u{1e02}', '\u{1e03}', '\u{a3}',
2214    '\u{10a}', '\u{10b}', '\u{1e0a}', '\u{a7}', '\u{1e80}', '\u{a9}', '\u{1e82}', '\u{1e0b}',
2215    '\u{1ef2}', '\u{ad}', '\u{ae}', '\u{178}', '\u{1e1e}', '\u{1e1f}', '\u{120}', '\u{121}',
2216    '\u{1e40}', '\u{1e41}', '\u{b6}', '\u{1e56}', '\u{1e81}', '\u{1e57}', '\u{1e83}', '\u{1e60}',
2217    '\u{1ef3}', '\u{1e84}', '\u{1e85}', '\u{1e61}', '\u{c0}', '\u{c1}', '\u{c2}', '\u{c3}',
2218    '\u{c4}', '\u{c5}', '\u{c6}', '\u{c7}', '\u{c8}', '\u{c9}', '\u{ca}', '\u{cb}', '\u{cc}',
2219    '\u{cd}', '\u{ce}', '\u{cf}', '\u{174}', '\u{d1}', '\u{d2}', '\u{d3}', '\u{d4}', '\u{d5}',
2220    '\u{d6}', '\u{1e6a}', '\u{d8}', '\u{d9}', '\u{da}', '\u{db}', '\u{dc}', '\u{dd}', '\u{176}',
2221    '\u{df}', '\u{e0}', '\u{e1}', '\u{e2}', '\u{e3}', '\u{e4}', '\u{e5}', '\u{e6}', '\u{e7}',
2222    '\u{e8}', '\u{e9}', '\u{ea}', '\u{eb}', '\u{ec}', '\u{ed}', '\u{ee}', '\u{ef}', '\u{175}',
2223    '\u{f1}', '\u{f2}', '\u{f3}', '\u{f4}', '\u{f5}', '\u{f6}', '\u{1e6b}', '\u{f8}', '\u{f9}',
2224    '\u{fa}', '\u{fb}', '\u{fc}', '\u{fd}', '\u{177}', '\u{ff}',
2225];
2226
2227const UNICODE_TO_ISO_8859_14: &[(u16, u8)] = &[
2228    (128, 128),
2229    (129, 129),
2230    (130, 130),
2231    (131, 131),
2232    (132, 132),
2233    (133, 133),
2234    (134, 134),
2235    (135, 135),
2236    (136, 136),
2237    (137, 137),
2238    (138, 138),
2239    (139, 139),
2240    (140, 140),
2241    (141, 141),
2242    (142, 142),
2243    (143, 143),
2244    (144, 144),
2245    (145, 145),
2246    (146, 146),
2247    (147, 147),
2248    (148, 148),
2249    (149, 149),
2250    (150, 150),
2251    (151, 151),
2252    (152, 152),
2253    (153, 153),
2254    (154, 154),
2255    (155, 155),
2256    (156, 156),
2257    (157, 157),
2258    (158, 158),
2259    (159, 159),
2260    (160, 160),
2261    (163, 163),
2262    (167, 167),
2263    (169, 169),
2264    (173, 173),
2265    (174, 174),
2266    (182, 182),
2267    (192, 192),
2268    (193, 193),
2269    (194, 194),
2270    (195, 195),
2271    (196, 196),
2272    (197, 197),
2273    (198, 198),
2274    (199, 199),
2275    (200, 200),
2276    (201, 201),
2277    (202, 202),
2278    (203, 203),
2279    (204, 204),
2280    (205, 205),
2281    (206, 206),
2282    (207, 207),
2283    (209, 209),
2284    (210, 210),
2285    (211, 211),
2286    (212, 212),
2287    (213, 213),
2288    (214, 214),
2289    (216, 216),
2290    (217, 217),
2291    (218, 218),
2292    (219, 219),
2293    (220, 220),
2294    (221, 221),
2295    (223, 223),
2296    (224, 224),
2297    (225, 225),
2298    (226, 226),
2299    (227, 227),
2300    (228, 228),
2301    (229, 229),
2302    (230, 230),
2303    (231, 231),
2304    (232, 232),
2305    (233, 233),
2306    (234, 234),
2307    (235, 235),
2308    (236, 236),
2309    (237, 237),
2310    (238, 238),
2311    (239, 239),
2312    (241, 241),
2313    (242, 242),
2314    (243, 243),
2315    (244, 244),
2316    (245, 245),
2317    (246, 246),
2318    (248, 248),
2319    (249, 249),
2320    (250, 250),
2321    (251, 251),
2322    (252, 252),
2323    (253, 253),
2324    (255, 255),
2325    (266, 164),
2326    (267, 165),
2327    (288, 178),
2328    (289, 179),
2329    (372, 208),
2330    (373, 240),
2331    (374, 222),
2332    (375, 254),
2333    (376, 175),
2334    (7682, 161),
2335    (7683, 162),
2336    (7690, 166),
2337    (7691, 171),
2338    (7710, 176),
2339    (7711, 177),
2340    (7744, 180),
2341    (7745, 181),
2342    (7766, 183),
2343    (7767, 185),
2344    (7776, 187),
2345    (7777, 191),
2346    (7786, 215),
2347    (7787, 247),
2348    (7808, 168),
2349    (7809, 184),
2350    (7810, 170),
2351    (7811, 186),
2352    (7812, 189),
2353    (7813, 190),
2354    (7922, 172),
2355    (7923, 188),
2356];
2357
2358const ISO_8859_15_TO_UNICODE: [char; 128] = [
2359    '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}',
2360    '\u{89}', '\u{8a}', '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}',
2361    '\u{92}', '\u{93}', '\u{94}', '\u{95}', '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}',
2362    '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}', '\u{a1}', '\u{a2}', '\u{a3}',
2363    '\u{20ac}', '\u{a5}', '\u{160}', '\u{a7}', '\u{161}', '\u{a9}', '\u{aa}', '\u{ab}', '\u{ac}',
2364    '\u{ad}', '\u{ae}', '\u{af}', '\u{b0}', '\u{b1}', '\u{b2}', '\u{b3}', '\u{17d}', '\u{b5}',
2365    '\u{b6}', '\u{b7}', '\u{17e}', '\u{b9}', '\u{ba}', '\u{bb}', '\u{152}', '\u{153}', '\u{178}',
2366    '\u{bf}', '\u{c0}', '\u{c1}', '\u{c2}', '\u{c3}', '\u{c4}', '\u{c5}', '\u{c6}', '\u{c7}',
2367    '\u{c8}', '\u{c9}', '\u{ca}', '\u{cb}', '\u{cc}', '\u{cd}', '\u{ce}', '\u{cf}', '\u{d0}',
2368    '\u{d1}', '\u{d2}', '\u{d3}', '\u{d4}', '\u{d5}', '\u{d6}', '\u{d7}', '\u{d8}', '\u{d9}',
2369    '\u{da}', '\u{db}', '\u{dc}', '\u{dd}', '\u{de}', '\u{df}', '\u{e0}', '\u{e1}', '\u{e2}',
2370    '\u{e3}', '\u{e4}', '\u{e5}', '\u{e6}', '\u{e7}', '\u{e8}', '\u{e9}', '\u{ea}', '\u{eb}',
2371    '\u{ec}', '\u{ed}', '\u{ee}', '\u{ef}', '\u{f0}', '\u{f1}', '\u{f2}', '\u{f3}', '\u{f4}',
2372    '\u{f5}', '\u{f6}', '\u{f7}', '\u{f8}', '\u{f9}', '\u{fa}', '\u{fb}', '\u{fc}', '\u{fd}',
2373    '\u{fe}', '\u{ff}',
2374];
2375
2376const UNICODE_TO_ISO_8859_15: &[(u16, u8)] = &[
2377    (128, 128),
2378    (129, 129),
2379    (130, 130),
2380    (131, 131),
2381    (132, 132),
2382    (133, 133),
2383    (134, 134),
2384    (135, 135),
2385    (136, 136),
2386    (137, 137),
2387    (138, 138),
2388    (139, 139),
2389    (140, 140),
2390    (141, 141),
2391    (142, 142),
2392    (143, 143),
2393    (144, 144),
2394    (145, 145),
2395    (146, 146),
2396    (147, 147),
2397    (148, 148),
2398    (149, 149),
2399    (150, 150),
2400    (151, 151),
2401    (152, 152),
2402    (153, 153),
2403    (154, 154),
2404    (155, 155),
2405    (156, 156),
2406    (157, 157),
2407    (158, 158),
2408    (159, 159),
2409    (160, 160),
2410    (161, 161),
2411    (162, 162),
2412    (163, 163),
2413    (165, 165),
2414    (167, 167),
2415    (169, 169),
2416    (170, 170),
2417    (171, 171),
2418    (172, 172),
2419    (173, 173),
2420    (174, 174),
2421    (175, 175),
2422    (176, 176),
2423    (177, 177),
2424    (178, 178),
2425    (179, 179),
2426    (181, 181),
2427    (182, 182),
2428    (183, 183),
2429    (185, 185),
2430    (186, 186),
2431    (187, 187),
2432    (191, 191),
2433    (192, 192),
2434    (193, 193),
2435    (194, 194),
2436    (195, 195),
2437    (196, 196),
2438    (197, 197),
2439    (198, 198),
2440    (199, 199),
2441    (200, 200),
2442    (201, 201),
2443    (202, 202),
2444    (203, 203),
2445    (204, 204),
2446    (205, 205),
2447    (206, 206),
2448    (207, 207),
2449    (208, 208),
2450    (209, 209),
2451    (210, 210),
2452    (211, 211),
2453    (212, 212),
2454    (213, 213),
2455    (214, 214),
2456    (215, 215),
2457    (216, 216),
2458    (217, 217),
2459    (218, 218),
2460    (219, 219),
2461    (220, 220),
2462    (221, 221),
2463    (222, 222),
2464    (223, 223),
2465    (224, 224),
2466    (225, 225),
2467    (226, 226),
2468    (227, 227),
2469    (228, 228),
2470    (229, 229),
2471    (230, 230),
2472    (231, 231),
2473    (232, 232),
2474    (233, 233),
2475    (234, 234),
2476    (235, 235),
2477    (236, 236),
2478    (237, 237),
2479    (238, 238),
2480    (239, 239),
2481    (240, 240),
2482    (241, 241),
2483    (242, 242),
2484    (243, 243),
2485    (244, 244),
2486    (245, 245),
2487    (246, 246),
2488    (247, 247),
2489    (248, 248),
2490    (249, 249),
2491    (250, 250),
2492    (251, 251),
2493    (252, 252),
2494    (253, 253),
2495    (254, 254),
2496    (255, 255),
2497    (338, 188),
2498    (339, 189),
2499    (352, 166),
2500    (353, 168),
2501    (376, 190),
2502    (381, 180),
2503    (382, 184),
2504    (8364, 164),
2505];
2506
2507const ISO_8859_16_TO_UNICODE: [char; 128] = [
2508    '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}',
2509    '\u{89}', '\u{8a}', '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}',
2510    '\u{92}', '\u{93}', '\u{94}', '\u{95}', '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}',
2511    '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}', '\u{104}', '\u{105}', '\u{141}',
2512    '\u{20ac}', '\u{201e}', '\u{160}', '\u{a7}', '\u{161}', '\u{a9}', '\u{218}', '\u{ab}',
2513    '\u{179}', '\u{ad}', '\u{17a}', '\u{17b}', '\u{b0}', '\u{b1}', '\u{10c}', '\u{142}', '\u{17d}',
2514    '\u{201d}', '\u{b6}', '\u{b7}', '\u{17e}', '\u{10d}', '\u{219}', '\u{bb}', '\u{152}',
2515    '\u{153}', '\u{178}', '\u{17c}', '\u{c0}', '\u{c1}', '\u{c2}', '\u{102}', '\u{c4}', '\u{106}',
2516    '\u{c6}', '\u{c7}', '\u{c8}', '\u{c9}', '\u{ca}', '\u{cb}', '\u{cc}', '\u{cd}', '\u{ce}',
2517    '\u{cf}', '\u{110}', '\u{143}', '\u{d2}', '\u{d3}', '\u{d4}', '\u{150}', '\u{d6}', '\u{15a}',
2518    '\u{170}', '\u{d9}', '\u{da}', '\u{db}', '\u{dc}', '\u{118}', '\u{21a}', '\u{df}', '\u{e0}',
2519    '\u{e1}', '\u{e2}', '\u{103}', '\u{e4}', '\u{107}', '\u{e6}', '\u{e7}', '\u{e8}', '\u{e9}',
2520    '\u{ea}', '\u{eb}', '\u{ec}', '\u{ed}', '\u{ee}', '\u{ef}', '\u{111}', '\u{144}', '\u{f2}',
2521    '\u{f3}', '\u{f4}', '\u{151}', '\u{f6}', '\u{15b}', '\u{171}', '\u{f9}', '\u{fa}', '\u{fb}',
2522    '\u{fc}', '\u{119}', '\u{21b}', '\u{ff}',
2523];
2524
2525const UNICODE_TO_ISO_8859_16: &[(u16, u8)] = &[
2526    (128, 128),
2527    (129, 129),
2528    (130, 130),
2529    (131, 131),
2530    (132, 132),
2531    (133, 133),
2532    (134, 134),
2533    (135, 135),
2534    (136, 136),
2535    (137, 137),
2536    (138, 138),
2537    (139, 139),
2538    (140, 140),
2539    (141, 141),
2540    (142, 142),
2541    (143, 143),
2542    (144, 144),
2543    (145, 145),
2544    (146, 146),
2545    (147, 147),
2546    (148, 148),
2547    (149, 149),
2548    (150, 150),
2549    (151, 151),
2550    (152, 152),
2551    (153, 153),
2552    (154, 154),
2553    (155, 155),
2554    (156, 156),
2555    (157, 157),
2556    (158, 158),
2557    (159, 159),
2558    (160, 160),
2559    (167, 167),
2560    (169, 169),
2561    (171, 171),
2562    (173, 173),
2563    (176, 176),
2564    (177, 177),
2565    (182, 182),
2566    (183, 183),
2567    (187, 187),
2568    (192, 192),
2569    (193, 193),
2570    (194, 194),
2571    (196, 196),
2572    (198, 198),
2573    (199, 199),
2574    (200, 200),
2575    (201, 201),
2576    (202, 202),
2577    (203, 203),
2578    (204, 204),
2579    (205, 205),
2580    (206, 206),
2581    (207, 207),
2582    (210, 210),
2583    (211, 211),
2584    (212, 212),
2585    (214, 214),
2586    (217, 217),
2587    (218, 218),
2588    (219, 219),
2589    (220, 220),
2590    (223, 223),
2591    (224, 224),
2592    (225, 225),
2593    (226, 226),
2594    (228, 228),
2595    (230, 230),
2596    (231, 231),
2597    (232, 232),
2598    (233, 233),
2599    (234, 234),
2600    (235, 235),
2601    (236, 236),
2602    (237, 237),
2603    (238, 238),
2604    (239, 239),
2605    (242, 242),
2606    (243, 243),
2607    (244, 244),
2608    (246, 246),
2609    (249, 249),
2610    (250, 250),
2611    (251, 251),
2612    (252, 252),
2613    (255, 255),
2614    (258, 195),
2615    (259, 227),
2616    (260, 161),
2617    (261, 162),
2618    (262, 197),
2619    (263, 229),
2620    (268, 178),
2621    (269, 185),
2622    (272, 208),
2623    (273, 240),
2624    (280, 221),
2625    (281, 253),
2626    (321, 163),
2627    (322, 179),
2628    (323, 209),
2629    (324, 241),
2630    (336, 213),
2631    (337, 245),
2632    (338, 188),
2633    (339, 189),
2634    (346, 215),
2635    (347, 247),
2636    (352, 166),
2637    (353, 168),
2638    (368, 216),
2639    (369, 248),
2640    (376, 190),
2641    (377, 172),
2642    (378, 174),
2643    (379, 175),
2644    (380, 191),
2645    (381, 180),
2646    (382, 184),
2647    (536, 170),
2648    (537, 186),
2649    (538, 222),
2650    (539, 254),
2651    (8221, 181),
2652    (8222, 165),
2653    (8364, 164),
2654];
2655
2656macro_rules! impl_iso8859_encoder_and_decoder {
2657    ( $name:ident, $encoder:ident, $decoder:ident, $etable:ident, $dtable:ident ) => {
2658        pub struct $encoder;
2659        impl Encoder for $encoder {
2660            fn name(&self) -> &'static str {
2661                $name
2662            }
2663
2664            fn encode(
2665                &mut self,
2666                src: &str,
2667                dst: &mut [u8],
2668                finish: bool,
2669            ) -> Result<(usize, usize), EncodeError> {
2670                if src.is_empty() {
2671                    return if finish {
2672                        Ok((0, 0))
2673                    } else {
2674                        Err(EncodeError::InputIsEmpty)
2675                    };
2676                }
2677
2678                if dst.is_empty() {
2679                    return Err(EncodeError::OutputTooShort);
2680                }
2681
2682                let (mut read, mut write) = (0, 0);
2683                for c in src.chars() {
2684                    let b = c as u32;
2685                    read += c.len_utf8();
2686                    if b < 128 {
2687                        dst[write] = b as u8;
2688                    } else if let Ok(pos) = $etable.binary_search_by_key(&b, |k| k.0 as u32) {
2689                        dst[write] = $etable[pos].1;
2690                    } else {
2691                        return Err(EncodeError::Unmappable { read, write, c });
2692                    }
2693                    write += 1;
2694                    if write == dst.len() {
2695                        break;
2696                    }
2697                }
2698                Ok((read, write))
2699            }
2700        }
2701
2702        pub struct $decoder;
2703        impl Decoder for $decoder {
2704            fn name(&self) -> &'static str {
2705                $name
2706            }
2707
2708            fn decode(
2709                &mut self,
2710                src: &[u8],
2711                dst: &mut String,
2712                finish: bool,
2713            ) -> Result<(usize, usize), DecodeError> {
2714                if src.is_empty() {
2715                    return if finish {
2716                        Ok((0, 0))
2717                    } else {
2718                        Err(DecodeError::InputIsEmpty)
2719                    };
2720                }
2721                let len = dst.capacity() - dst.len();
2722                if len < 4 {
2723                    return Err(DecodeError::OutputTooShort);
2724                }
2725
2726                let (mut read, mut write) = (0, 0);
2727                for &b in src {
2728                    let c = if b < 128 {
2729                        b as char
2730                    } else {
2731                        $dtable[b as usize - 128]
2732                    };
2733                    let l = c.len_utf8();
2734                    if write + l > len {
2735                        break;
2736                    }
2737                    read += 1;
2738                    if c == char::REPLACEMENT_CHARACTER {
2739                        return Err(DecodeError::Malformed {
2740                            read,
2741                            write,
2742                            length: 1,
2743                            offset: 0,
2744                        });
2745                    }
2746                    dst.push(c);
2747                    write += l;
2748                }
2749                Ok((read, write))
2750            }
2751        }
2752    };
2753}
2754
2755impl_iso8859_encoder_and_decoder!(
2756    ISO_8859_2_NAME,
2757    ISO8859_2Encoder,
2758    ISO8859_2Decoder,
2759    UNICODE_TO_ISO_8859_2,
2760    ISO_8859_2_TO_UNICODE
2761);
2762impl_iso8859_encoder_and_decoder!(
2763    ISO_8859_3_NAME,
2764    ISO8859_3Encoder,
2765    ISO8859_3Decoder,
2766    UNICODE_TO_ISO_8859_3,
2767    ISO_8859_3_TO_UNICODE
2768);
2769impl_iso8859_encoder_and_decoder!(
2770    ISO_8859_4_NAME,
2771    ISO8859_4Encoder,
2772    ISO8859_4Decoder,
2773    UNICODE_TO_ISO_8859_4,
2774    ISO_8859_4_TO_UNICODE
2775);
2776impl_iso8859_encoder_and_decoder!(
2777    ISO_8859_5_NAME,
2778    ISO8859_5Encoder,
2779    ISO8859_5Decoder,
2780    UNICODE_TO_ISO_8859_5,
2781    ISO_8859_5_TO_UNICODE
2782);
2783impl_iso8859_encoder_and_decoder!(
2784    ISO_8859_6_NAME,
2785    ISO8859_6Encoder,
2786    ISO8859_6Decoder,
2787    UNICODE_TO_ISO_8859_6,
2788    ISO_8859_6_TO_UNICODE
2789);
2790impl_iso8859_encoder_and_decoder!(
2791    ISO_8859_7_NAME,
2792    ISO8859_7Encoder,
2793    ISO8859_7Decoder,
2794    UNICODE_TO_ISO_8859_7,
2795    ISO_8859_7_TO_UNICODE
2796);
2797impl_iso8859_encoder_and_decoder!(
2798    ISO_8859_8_NAME,
2799    ISO8859_8Encoder,
2800    ISO8859_8Decoder,
2801    UNICODE_TO_ISO_8859_8,
2802    ISO_8859_8_TO_UNICODE
2803);
2804impl_iso8859_encoder_and_decoder!(
2805    ISO_8859_9_NAME,
2806    ISO8859_9Encoder,
2807    ISO8859_9Decoder,
2808    UNICODE_TO_ISO_8859_9,
2809    ISO_8859_9_TO_UNICODE
2810);
2811impl_iso8859_encoder_and_decoder!(
2812    ISO_8859_10_NAME,
2813    ISO8859_10Encoder,
2814    ISO8859_10Decoder,
2815    UNICODE_TO_ISO_8859_10,
2816    ISO_8859_10_TO_UNICODE
2817);
2818impl_iso8859_encoder_and_decoder!(
2819    ISO_8859_11_NAME,
2820    ISO8859_11Encoder,
2821    ISO8859_11Decoder,
2822    UNICODE_TO_ISO_8859_11,
2823    ISO_8859_11_TO_UNICODE
2824);
2825impl_iso8859_encoder_and_decoder!(
2826    ISO_8859_13_NAME,
2827    ISO8859_13Encoder,
2828    ISO8859_13Decoder,
2829    UNICODE_TO_ISO_8859_13,
2830    ISO_8859_13_TO_UNICODE
2831);
2832impl_iso8859_encoder_and_decoder!(
2833    ISO_8859_14_NAME,
2834    ISO8859_14Encoder,
2835    ISO8859_14Decoder,
2836    UNICODE_TO_ISO_8859_14,
2837    ISO_8859_14_TO_UNICODE
2838);
2839impl_iso8859_encoder_and_decoder!(
2840    ISO_8859_15_NAME,
2841    ISO8859_15Encoder,
2842    ISO8859_15Decoder,
2843    UNICODE_TO_ISO_8859_15,
2844    ISO_8859_15_TO_UNICODE
2845);
2846impl_iso8859_encoder_and_decoder!(
2847    ISO_8859_16_NAME,
2848    ISO8859_16Encoder,
2849    ISO8859_16Decoder,
2850    UNICODE_TO_ISO_8859_16,
2851    ISO_8859_16_TO_UNICODE
2852);