Skip to main content

anyxml_encoding/
iso_8859.rs

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