Skip to main content

badterm_core/
codepage.rs

1//! The code pages behind CTerm's built-in fonts (IDs 1-31): what a byte in
2//! one is as Unicode, and back, for typing, pasting and copying text when
3//! the BBS shows its screen in one of them. Bytes below 0x80 are ASCII in
4//! all of them. Generated from Python's codec tables, and for haik8 (7),
5//! ARMSCII-8 (15) and CP1131 (31), which it lacks, from SyncTERM's
6//! (`src/conio/utf8_codepages.c`), where bytes with no character of their
7//! own show CP437's, as its fonts draw them.
8
9/// A code page's upper half: the character each byte 0x80-0xFF is.
10#[derive(Debug)]
11pub struct CodePage {
12    pub name: &'static str,
13    /// Bytes below 0x80, where they aren't ASCII (the C64's screen codes).
14    lower: Option<[char; 128]>,
15    upper: [char; 128],
16}
17
18impl CodePage {
19    /// A byte as Unicode (control bytes below 0x20 aren't characters here).
20    pub fn decode(&self, b: u8) -> char {
21        match &self.lower {
22            Some(lower) if b < 0x80 => lower[b as usize],
23            None if b < 0x80 => b as char,
24            _ => self.upper[(b - 0x80) as usize],
25        }
26    }
27
28    /// A character as a byte of this code page, if it has one.
29    pub fn encode(&self, c: char) -> Option<u8> {
30        if let Some(lower) = &self.lower {
31            return lower.iter().position(|&l| l == c).map(|i| i as u8);
32        }
33        if (c as u32) < 0x80 {
34            return Some(c as u8);
35        }
36        self.upper.iter().position(|&u| u == c).map(|i| 0x80 + i as u8)
37    }
38
39    /// Whether every byte is its own character (screen codes), not ASCII
40    /// below 0x80.
41    pub fn screen_codes(&self) -> bool {
42        self.lower.is_some()
43    }
44
45    pub fn encode_str(&self, s: &str) -> Vec<u8> {
46        s.chars().map(|c| self.encode(c).unwrap_or(b'?')).collect()
47    }
48}
49
50/// What the screen codes of the C64's and Atari's fonts (CTerm IDs 32-36)
51/// are, for copying their text; they are not for typing (see
52/// [`crate::petscii`] and [`crate::atascii`] for that).
53pub fn screen_codes(id: u8) -> Option<&'static CodePage> {
54    match id {
55        32 | 34 => Some(&C64_UPPER),
56        33 | 35 => Some(&C64_LOWER),
57        36 => Some(&ATARI),
58        _ => None,
59    }
60}
61
62/// The code page a CTerm font ID shows, if BadTerm knows it.
63pub fn for_font(id: u8) -> Option<&'static CodePage> {
64    Some(match id {
65        1 | 20 => &CP1251,
66        2 | 12 | 22 => &KOI8_R,
67        3 => &ISO_8859_2,
68        4 | 11 | 13 | 23 => &ISO_8859_4,
69        5 | 25 | 27 => &CP866,
70        6 => &ISO_8859_9,
71        8 => &ISO_8859_8,
72        9 => &KOI8_U,
73        10 | 16 => &ISO_8859_15,
74        14 => &ISO_8859_5,
75        17 | 18 => &CP850,
76        19 | 28 => &CP865,
77        21 => &ISO_8859_7,
78        24 | 30 => &ISO_8859_1,
79        29 => &CP866U,
80        7 => &HAIK8,
81        15 => &ARMSCII_8,
82        31 => &CP1131,
83        _ => return None,
84    })
85}
86
87static CP1251: CodePage = CodePage {
88    name: "Windows-1251, Cyrillic",
89    lower: None,
90    upper: [
91        '\u{402}', '\u{403}', '\u{201a}', '\u{453}', '\u{201e}', '\u{2026}', '\u{2020}', '\u{2021}', '\u{20ac}',
92        '\u{2030}', '\u{409}', '\u{2039}', '\u{40a}', '\u{40c}', '\u{40b}', '\u{40f}', '\u{452}', '\u{2018}',
93        '\u{2019}', '\u{201c}', '\u{201d}', '\u{2022}', '\u{2013}', '\u{2014}', '\u{fffd}', '\u{2122}', '\u{459}',
94        '\u{203a}', '\u{45a}', '\u{45c}', '\u{45b}', '\u{45f}', '\u{a0}', '\u{40e}', '\u{45e}', '\u{408}', '\u{a4}',
95        '\u{490}', '\u{a6}', '\u{a7}', '\u{401}', '\u{a9}', '\u{404}', '\u{ab}', '\u{ac}', '\u{ad}', '\u{ae}',
96        '\u{407}', '\u{b0}', '\u{b1}', '\u{406}', '\u{456}', '\u{491}', '\u{b5}', '\u{b6}', '\u{b7}', '\u{451}',
97        '\u{2116}', '\u{454}', '\u{bb}', '\u{458}', '\u{405}', '\u{455}', '\u{457}', '\u{410}', '\u{411}', '\u{412}',
98        '\u{413}', '\u{414}', '\u{415}', '\u{416}', '\u{417}', '\u{418}', '\u{419}', '\u{41a}', '\u{41b}', '\u{41c}',
99        '\u{41d}', '\u{41e}', '\u{41f}', '\u{420}', '\u{421}', '\u{422}', '\u{423}', '\u{424}', '\u{425}', '\u{426}',
100        '\u{427}', '\u{428}', '\u{429}', '\u{42a}', '\u{42b}', '\u{42c}', '\u{42d}', '\u{42e}', '\u{42f}', '\u{430}',
101        '\u{431}', '\u{432}', '\u{433}', '\u{434}', '\u{435}', '\u{436}', '\u{437}', '\u{438}', '\u{439}', '\u{43a}',
102        '\u{43b}', '\u{43c}', '\u{43d}', '\u{43e}', '\u{43f}', '\u{440}', '\u{441}', '\u{442}', '\u{443}', '\u{444}',
103        '\u{445}', '\u{446}', '\u{447}', '\u{448}', '\u{449}', '\u{44a}', '\u{44b}', '\u{44c}', '\u{44d}', '\u{44e}',
104        '\u{44f}',
105    ],
106};
107
108static KOI8_R: CodePage = CodePage {
109    name: "KOI8-R, Russian",
110    lower: None,
111    upper: [
112        '\u{2500}', '\u{2502}', '\u{250c}', '\u{2510}', '\u{2514}', '\u{2518}', '\u{251c}', '\u{2524}', '\u{252c}',
113        '\u{2534}', '\u{253c}', '\u{2580}', '\u{2584}', '\u{2588}', '\u{258c}', '\u{2590}', '\u{2591}', '\u{2592}',
114        '\u{2593}', '\u{2320}', '\u{25a0}', '\u{2219}', '\u{221a}', '\u{2248}', '\u{2264}', '\u{2265}', '\u{a0}',
115        '\u{2321}', '\u{b0}', '\u{b2}', '\u{b7}', '\u{f7}', '\u{2550}', '\u{2551}', '\u{2552}', '\u{451}', '\u{2553}',
116        '\u{2554}', '\u{2555}', '\u{2556}', '\u{2557}', '\u{2558}', '\u{2559}', '\u{255a}', '\u{255b}', '\u{255c}',
117        '\u{255d}', '\u{255e}', '\u{255f}', '\u{2560}', '\u{2561}', '\u{401}', '\u{2562}', '\u{2563}', '\u{2564}',
118        '\u{2565}', '\u{2566}', '\u{2567}', '\u{2568}', '\u{2569}', '\u{256a}', '\u{256b}', '\u{256c}', '\u{a9}',
119        '\u{44e}', '\u{430}', '\u{431}', '\u{446}', '\u{434}', '\u{435}', '\u{444}', '\u{433}', '\u{445}', '\u{438}',
120        '\u{439}', '\u{43a}', '\u{43b}', '\u{43c}', '\u{43d}', '\u{43e}', '\u{43f}', '\u{44f}', '\u{440}', '\u{441}',
121        '\u{442}', '\u{443}', '\u{436}', '\u{432}', '\u{44c}', '\u{44b}', '\u{437}', '\u{448}', '\u{44d}', '\u{449}',
122        '\u{447}', '\u{44a}', '\u{42e}', '\u{410}', '\u{411}', '\u{426}', '\u{414}', '\u{415}', '\u{424}', '\u{413}',
123        '\u{425}', '\u{418}', '\u{419}', '\u{41a}', '\u{41b}', '\u{41c}', '\u{41d}', '\u{41e}', '\u{41f}', '\u{42f}',
124        '\u{420}', '\u{421}', '\u{422}', '\u{423}', '\u{416}', '\u{412}', '\u{42c}', '\u{42b}', '\u{417}', '\u{428}',
125        '\u{42d}', '\u{429}', '\u{427}', '\u{42a}',
126    ],
127};
128
129static ISO_8859_2: CodePage = CodePage {
130    name: "ISO-8859-2, Central European",
131    lower: None,
132    upper: [
133        '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}', '\u{89}', '\u{8a}',
134        '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}', '\u{92}', '\u{93}', '\u{94}', '\u{95}',
135        '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}', '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}',
136        '\u{104}', '\u{2d8}', '\u{141}', '\u{a4}', '\u{13d}', '\u{15a}', '\u{a7}', '\u{a8}', '\u{160}', '\u{15e}',
137        '\u{164}', '\u{179}', '\u{ad}', '\u{17d}', '\u{17b}', '\u{b0}', '\u{105}', '\u{2db}', '\u{142}', '\u{b4}',
138        '\u{13e}', '\u{15b}', '\u{2c7}', '\u{b8}', '\u{161}', '\u{15f}', '\u{165}', '\u{17a}', '\u{2dd}', '\u{17e}',
139        '\u{17c}', '\u{154}', '\u{c1}', '\u{c2}', '\u{102}', '\u{c4}', '\u{139}', '\u{106}', '\u{c7}', '\u{10c}',
140        '\u{c9}', '\u{118}', '\u{cb}', '\u{11a}', '\u{cd}', '\u{ce}', '\u{10e}', '\u{110}', '\u{143}', '\u{147}',
141        '\u{d3}', '\u{d4}', '\u{150}', '\u{d6}', '\u{d7}', '\u{158}', '\u{16e}', '\u{da}', '\u{170}', '\u{dc}',
142        '\u{dd}', '\u{162}', '\u{df}', '\u{155}', '\u{e1}', '\u{e2}', '\u{103}', '\u{e4}', '\u{13a}', '\u{107}',
143        '\u{e7}', '\u{10d}', '\u{e9}', '\u{119}', '\u{eb}', '\u{11b}', '\u{ed}', '\u{ee}', '\u{10f}', '\u{111}',
144        '\u{144}', '\u{148}', '\u{f3}', '\u{f4}', '\u{151}', '\u{f6}', '\u{f7}', '\u{159}', '\u{16f}', '\u{fa}',
145        '\u{171}', '\u{fc}', '\u{fd}', '\u{163}', '\u{2d9}',
146    ],
147};
148
149static ISO_8859_4: CodePage = CodePage {
150    name: "ISO-8859-4, Baltic",
151    lower: None,
152    upper: [
153        '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}', '\u{89}', '\u{8a}',
154        '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}', '\u{92}', '\u{93}', '\u{94}', '\u{95}',
155        '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}', '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}',
156        '\u{104}', '\u{138}', '\u{156}', '\u{a4}', '\u{128}', '\u{13b}', '\u{a7}', '\u{a8}', '\u{160}', '\u{112}',
157        '\u{122}', '\u{166}', '\u{ad}', '\u{17d}', '\u{af}', '\u{b0}', '\u{105}', '\u{2db}', '\u{157}', '\u{b4}',
158        '\u{129}', '\u{13c}', '\u{2c7}', '\u{b8}', '\u{161}', '\u{113}', '\u{123}', '\u{167}', '\u{14a}', '\u{17e}',
159        '\u{14b}', '\u{100}', '\u{c1}', '\u{c2}', '\u{c3}', '\u{c4}', '\u{c5}', '\u{c6}', '\u{12e}', '\u{10c}',
160        '\u{c9}', '\u{118}', '\u{cb}', '\u{116}', '\u{cd}', '\u{ce}', '\u{12a}', '\u{110}', '\u{145}', '\u{14c}',
161        '\u{136}', '\u{d4}', '\u{d5}', '\u{d6}', '\u{d7}', '\u{d8}', '\u{172}', '\u{da}', '\u{db}', '\u{dc}',
162        '\u{168}', '\u{16a}', '\u{df}', '\u{101}', '\u{e1}', '\u{e2}', '\u{e3}', '\u{e4}', '\u{e5}', '\u{e6}',
163        '\u{12f}', '\u{10d}', '\u{e9}', '\u{119}', '\u{eb}', '\u{117}', '\u{ed}', '\u{ee}', '\u{12b}', '\u{111}',
164        '\u{146}', '\u{14d}', '\u{137}', '\u{f4}', '\u{f5}', '\u{f6}', '\u{f7}', '\u{f8}', '\u{173}', '\u{fa}',
165        '\u{fb}', '\u{fc}', '\u{169}', '\u{16b}', '\u{2d9}',
166    ],
167};
168
169static CP866: CodePage = CodePage {
170    name: "CP866, Russian",
171    lower: None,
172    upper: [
173        '\u{410}', '\u{411}', '\u{412}', '\u{413}', '\u{414}', '\u{415}', '\u{416}', '\u{417}', '\u{418}', '\u{419}',
174        '\u{41a}', '\u{41b}', '\u{41c}', '\u{41d}', '\u{41e}', '\u{41f}', '\u{420}', '\u{421}', '\u{422}', '\u{423}',
175        '\u{424}', '\u{425}', '\u{426}', '\u{427}', '\u{428}', '\u{429}', '\u{42a}', '\u{42b}', '\u{42c}', '\u{42d}',
176        '\u{42e}', '\u{42f}', '\u{430}', '\u{431}', '\u{432}', '\u{433}', '\u{434}', '\u{435}', '\u{436}', '\u{437}',
177        '\u{438}', '\u{439}', '\u{43a}', '\u{43b}', '\u{43c}', '\u{43d}', '\u{43e}', '\u{43f}', '\u{2591}', '\u{2592}',
178        '\u{2593}', '\u{2502}', '\u{2524}', '\u{2561}', '\u{2562}', '\u{2556}', '\u{2555}', '\u{2563}', '\u{2551}',
179        '\u{2557}', '\u{255d}', '\u{255c}', '\u{255b}', '\u{2510}', '\u{2514}', '\u{2534}', '\u{252c}', '\u{251c}',
180        '\u{2500}', '\u{253c}', '\u{255e}', '\u{255f}', '\u{255a}', '\u{2554}', '\u{2569}', '\u{2566}', '\u{2560}',
181        '\u{2550}', '\u{256c}', '\u{2567}', '\u{2568}', '\u{2564}', '\u{2565}', '\u{2559}', '\u{2558}', '\u{2552}',
182        '\u{2553}', '\u{256b}', '\u{256a}', '\u{2518}', '\u{250c}', '\u{2588}', '\u{2584}', '\u{258c}', '\u{2590}',
183        '\u{2580}', '\u{440}', '\u{441}', '\u{442}', '\u{443}', '\u{444}', '\u{445}', '\u{446}', '\u{447}', '\u{448}',
184        '\u{449}', '\u{44a}', '\u{44b}', '\u{44c}', '\u{44d}', '\u{44e}', '\u{44f}', '\u{401}', '\u{451}', '\u{404}',
185        '\u{454}', '\u{407}', '\u{457}', '\u{40e}', '\u{45e}', '\u{b0}', '\u{2219}', '\u{b7}', '\u{221a}', '\u{2116}',
186        '\u{a4}', '\u{25a0}', '\u{a0}',
187    ],
188};
189
190static ISO_8859_9: CodePage = CodePage {
191    name: "ISO-8859-9, Turkish",
192    lower: None,
193    upper: [
194        '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}', '\u{89}', '\u{8a}',
195        '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}', '\u{92}', '\u{93}', '\u{94}', '\u{95}',
196        '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}', '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}',
197        '\u{a1}', '\u{a2}', '\u{a3}', '\u{a4}', '\u{a5}', '\u{a6}', '\u{a7}', '\u{a8}', '\u{a9}', '\u{aa}', '\u{ab}',
198        '\u{ac}', '\u{ad}', '\u{ae}', '\u{af}', '\u{b0}', '\u{b1}', '\u{b2}', '\u{b3}', '\u{b4}', '\u{b5}', '\u{b6}',
199        '\u{b7}', '\u{b8}', '\u{b9}', '\u{ba}', '\u{bb}', '\u{bc}', '\u{bd}', '\u{be}', '\u{bf}', '\u{c0}', '\u{c1}',
200        '\u{c2}', '\u{c3}', '\u{c4}', '\u{c5}', '\u{c6}', '\u{c7}', '\u{c8}', '\u{c9}', '\u{ca}', '\u{cb}', '\u{cc}',
201        '\u{cd}', '\u{ce}', '\u{cf}', '\u{11e}', '\u{d1}', '\u{d2}', '\u{d3}', '\u{d4}', '\u{d5}', '\u{d6}', '\u{d7}',
202        '\u{d8}', '\u{d9}', '\u{da}', '\u{db}', '\u{dc}', '\u{130}', '\u{15e}', '\u{df}', '\u{e0}', '\u{e1}', '\u{e2}',
203        '\u{e3}', '\u{e4}', '\u{e5}', '\u{e6}', '\u{e7}', '\u{e8}', '\u{e9}', '\u{ea}', '\u{eb}', '\u{ec}', '\u{ed}',
204        '\u{ee}', '\u{ef}', '\u{11f}', '\u{f1}', '\u{f2}', '\u{f3}', '\u{f4}', '\u{f5}', '\u{f6}', '\u{f7}', '\u{f8}',
205        '\u{f9}', '\u{fa}', '\u{fb}', '\u{fc}', '\u{131}', '\u{15f}', '\u{ff}',
206    ],
207};
208
209static ISO_8859_8: CodePage = CodePage {
210    name: "ISO-8859-8, Hebrew",
211    lower: None,
212    upper: [
213        '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}', '\u{89}', '\u{8a}',
214        '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}', '\u{92}', '\u{93}', '\u{94}', '\u{95}',
215        '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}', '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}',
216        '\u{fffd}', '\u{a2}', '\u{a3}', '\u{a4}', '\u{a5}', '\u{a6}', '\u{a7}', '\u{a8}', '\u{a9}', '\u{d7}', '\u{ab}',
217        '\u{ac}', '\u{ad}', '\u{ae}', '\u{af}', '\u{b0}', '\u{b1}', '\u{b2}', '\u{b3}', '\u{b4}', '\u{b5}', '\u{b6}',
218        '\u{b7}', '\u{b8}', '\u{b9}', '\u{f7}', '\u{bb}', '\u{bc}', '\u{bd}', '\u{be}', '\u{fffd}', '\u{fffd}',
219        '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}',
220        '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}',
221        '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{fffd}',
222        '\u{fffd}', '\u{fffd}', '\u{fffd}', '\u{2017}', '\u{5d0}', '\u{5d1}', '\u{5d2}', '\u{5d3}', '\u{5d4}',
223        '\u{5d5}', '\u{5d6}', '\u{5d7}', '\u{5d8}', '\u{5d9}', '\u{5da}', '\u{5db}', '\u{5dc}', '\u{5dd}', '\u{5de}',
224        '\u{5df}', '\u{5e0}', '\u{5e1}', '\u{5e2}', '\u{5e3}', '\u{5e4}', '\u{5e5}', '\u{5e6}', '\u{5e7}', '\u{5e8}',
225        '\u{5e9}', '\u{5ea}', '\u{fffd}', '\u{fffd}', '\u{200e}', '\u{200f}', '\u{fffd}',
226    ],
227};
228
229static KOI8_U: CodePage = CodePage {
230    name: "KOI8-U, Ukrainian",
231    lower: None,
232    upper: [
233        '\u{2500}', '\u{2502}', '\u{250c}', '\u{2510}', '\u{2514}', '\u{2518}', '\u{251c}', '\u{2524}', '\u{252c}',
234        '\u{2534}', '\u{253c}', '\u{2580}', '\u{2584}', '\u{2588}', '\u{258c}', '\u{2590}', '\u{2591}', '\u{2592}',
235        '\u{2593}', '\u{2320}', '\u{25a0}', '\u{2219}', '\u{221a}', '\u{2248}', '\u{2264}', '\u{2265}', '\u{a0}',
236        '\u{2321}', '\u{b0}', '\u{b2}', '\u{b7}', '\u{f7}', '\u{2550}', '\u{2551}', '\u{2552}', '\u{451}', '\u{454}',
237        '\u{2554}', '\u{456}', '\u{457}', '\u{2557}', '\u{2558}', '\u{2559}', '\u{255a}', '\u{255b}', '\u{491}',
238        '\u{255d}', '\u{255e}', '\u{255f}', '\u{2560}', '\u{2561}', '\u{401}', '\u{404}', '\u{2563}', '\u{406}',
239        '\u{407}', '\u{2566}', '\u{2567}', '\u{2568}', '\u{2569}', '\u{256a}', '\u{490}', '\u{256c}', '\u{a9}',
240        '\u{44e}', '\u{430}', '\u{431}', '\u{446}', '\u{434}', '\u{435}', '\u{444}', '\u{433}', '\u{445}', '\u{438}',
241        '\u{439}', '\u{43a}', '\u{43b}', '\u{43c}', '\u{43d}', '\u{43e}', '\u{43f}', '\u{44f}', '\u{440}', '\u{441}',
242        '\u{442}', '\u{443}', '\u{436}', '\u{432}', '\u{44c}', '\u{44b}', '\u{437}', '\u{448}', '\u{44d}', '\u{449}',
243        '\u{447}', '\u{44a}', '\u{42e}', '\u{410}', '\u{411}', '\u{426}', '\u{414}', '\u{415}', '\u{424}', '\u{413}',
244        '\u{425}', '\u{418}', '\u{419}', '\u{41a}', '\u{41b}', '\u{41c}', '\u{41d}', '\u{41e}', '\u{41f}', '\u{42f}',
245        '\u{420}', '\u{421}', '\u{422}', '\u{423}', '\u{416}', '\u{412}', '\u{42c}', '\u{42b}', '\u{417}', '\u{428}',
246        '\u{42d}', '\u{429}', '\u{427}', '\u{42a}',
247    ],
248};
249
250static ISO_8859_15: CodePage = CodePage {
251    name: "ISO-8859-15, West European",
252    lower: None,
253    upper: [
254        '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}', '\u{89}', '\u{8a}',
255        '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}', '\u{92}', '\u{93}', '\u{94}', '\u{95}',
256        '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}', '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}',
257        '\u{a1}', '\u{a2}', '\u{a3}', '\u{20ac}', '\u{a5}', '\u{160}', '\u{a7}', '\u{161}', '\u{a9}', '\u{aa}',
258        '\u{ab}', '\u{ac}', '\u{ad}', '\u{ae}', '\u{af}', '\u{b0}', '\u{b1}', '\u{b2}', '\u{b3}', '\u{17d}', '\u{b5}',
259        '\u{b6}', '\u{b7}', '\u{17e}', '\u{b9}', '\u{ba}', '\u{bb}', '\u{152}', '\u{153}', '\u{178}', '\u{bf}',
260        '\u{c0}', '\u{c1}', '\u{c2}', '\u{c3}', '\u{c4}', '\u{c5}', '\u{c6}', '\u{c7}', '\u{c8}', '\u{c9}', '\u{ca}',
261        '\u{cb}', '\u{cc}', '\u{cd}', '\u{ce}', '\u{cf}', '\u{d0}', '\u{d1}', '\u{d2}', '\u{d3}', '\u{d4}', '\u{d5}',
262        '\u{d6}', '\u{d7}', '\u{d8}', '\u{d9}', '\u{da}', '\u{db}', '\u{dc}', '\u{dd}', '\u{de}', '\u{df}', '\u{e0}',
263        '\u{e1}', '\u{e2}', '\u{e3}', '\u{e4}', '\u{e5}', '\u{e6}', '\u{e7}', '\u{e8}', '\u{e9}', '\u{ea}', '\u{eb}',
264        '\u{ec}', '\u{ed}', '\u{ee}', '\u{ef}', '\u{f0}', '\u{f1}', '\u{f2}', '\u{f3}', '\u{f4}', '\u{f5}', '\u{f6}',
265        '\u{f7}', '\u{f8}', '\u{f9}', '\u{fa}', '\u{fb}', '\u{fc}', '\u{fd}', '\u{fe}', '\u{ff}',
266    ],
267};
268
269static ISO_8859_5: CodePage = CodePage {
270    name: "ISO-8859-5, Cyrillic",
271    lower: None,
272    upper: [
273        '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}', '\u{89}', '\u{8a}',
274        '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}', '\u{92}', '\u{93}', '\u{94}', '\u{95}',
275        '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}', '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}',
276        '\u{401}', '\u{402}', '\u{403}', '\u{404}', '\u{405}', '\u{406}', '\u{407}', '\u{408}', '\u{409}', '\u{40a}',
277        '\u{40b}', '\u{40c}', '\u{ad}', '\u{40e}', '\u{40f}', '\u{410}', '\u{411}', '\u{412}', '\u{413}', '\u{414}',
278        '\u{415}', '\u{416}', '\u{417}', '\u{418}', '\u{419}', '\u{41a}', '\u{41b}', '\u{41c}', '\u{41d}', '\u{41e}',
279        '\u{41f}', '\u{420}', '\u{421}', '\u{422}', '\u{423}', '\u{424}', '\u{425}', '\u{426}', '\u{427}', '\u{428}',
280        '\u{429}', '\u{42a}', '\u{42b}', '\u{42c}', '\u{42d}', '\u{42e}', '\u{42f}', '\u{430}', '\u{431}', '\u{432}',
281        '\u{433}', '\u{434}', '\u{435}', '\u{436}', '\u{437}', '\u{438}', '\u{439}', '\u{43a}', '\u{43b}', '\u{43c}',
282        '\u{43d}', '\u{43e}', '\u{43f}', '\u{440}', '\u{441}', '\u{442}', '\u{443}', '\u{444}', '\u{445}', '\u{446}',
283        '\u{447}', '\u{448}', '\u{449}', '\u{44a}', '\u{44b}', '\u{44c}', '\u{44d}', '\u{44e}', '\u{44f}', '\u{2116}',
284        '\u{451}', '\u{452}', '\u{453}', '\u{454}', '\u{455}', '\u{456}', '\u{457}', '\u{458}', '\u{459}', '\u{45a}',
285        '\u{45b}', '\u{45c}', '\u{a7}', '\u{45e}', '\u{45f}',
286    ],
287};
288
289static CP850: CodePage = CodePage {
290    name: "CP850, Latin I",
291    lower: None,
292    upper: [
293        '\u{c7}', '\u{fc}', '\u{e9}', '\u{e2}', '\u{e4}', '\u{e0}', '\u{e5}', '\u{e7}', '\u{ea}', '\u{eb}', '\u{e8}',
294        '\u{ef}', '\u{ee}', '\u{ec}', '\u{c4}', '\u{c5}', '\u{c9}', '\u{e6}', '\u{c6}', '\u{f4}', '\u{f6}', '\u{f2}',
295        '\u{fb}', '\u{f9}', '\u{ff}', '\u{d6}', '\u{dc}', '\u{f8}', '\u{a3}', '\u{d8}', '\u{d7}', '\u{192}', '\u{e1}',
296        '\u{ed}', '\u{f3}', '\u{fa}', '\u{f1}', '\u{d1}', '\u{aa}', '\u{ba}', '\u{bf}', '\u{ae}', '\u{ac}', '\u{bd}',
297        '\u{bc}', '\u{a1}', '\u{ab}', '\u{bb}', '\u{2591}', '\u{2592}', '\u{2593}', '\u{2502}', '\u{2524}', '\u{c1}',
298        '\u{c2}', '\u{c0}', '\u{a9}', '\u{2563}', '\u{2551}', '\u{2557}', '\u{255d}', '\u{a2}', '\u{a5}', '\u{2510}',
299        '\u{2514}', '\u{2534}', '\u{252c}', '\u{251c}', '\u{2500}', '\u{253c}', '\u{e3}', '\u{c3}', '\u{255a}',
300        '\u{2554}', '\u{2569}', '\u{2566}', '\u{2560}', '\u{2550}', '\u{256c}', '\u{a4}', '\u{f0}', '\u{d0}', '\u{ca}',
301        '\u{cb}', '\u{c8}', '\u{131}', '\u{cd}', '\u{ce}', '\u{cf}', '\u{2518}', '\u{250c}', '\u{2588}', '\u{2584}',
302        '\u{a6}', '\u{cc}', '\u{2580}', '\u{d3}', '\u{df}', '\u{d4}', '\u{d2}', '\u{f5}', '\u{d5}', '\u{b5}', '\u{fe}',
303        '\u{de}', '\u{da}', '\u{db}', '\u{d9}', '\u{fd}', '\u{dd}', '\u{af}', '\u{b4}', '\u{ad}', '\u{b1}', '\u{2017}',
304        '\u{be}', '\u{b6}', '\u{a7}', '\u{f7}', '\u{b8}', '\u{b0}', '\u{a8}', '\u{b7}', '\u{b9}', '\u{b3}', '\u{b2}',
305        '\u{25a0}', '\u{a0}',
306    ],
307};
308
309static CP865: CodePage = CodePage {
310    name: "CP865, Nordic",
311    lower: None,
312    upper: [
313        '\u{c7}', '\u{fc}', '\u{e9}', '\u{e2}', '\u{e4}', '\u{e0}', '\u{e5}', '\u{e7}', '\u{ea}', '\u{eb}', '\u{e8}',
314        '\u{ef}', '\u{ee}', '\u{ec}', '\u{c4}', '\u{c5}', '\u{c9}', '\u{e6}', '\u{c6}', '\u{f4}', '\u{f6}', '\u{f2}',
315        '\u{fb}', '\u{f9}', '\u{ff}', '\u{d6}', '\u{dc}', '\u{f8}', '\u{a3}', '\u{d8}', '\u{20a7}', '\u{192}',
316        '\u{e1}', '\u{ed}', '\u{f3}', '\u{fa}', '\u{f1}', '\u{d1}', '\u{aa}', '\u{ba}', '\u{bf}', '\u{2310}', '\u{ac}',
317        '\u{bd}', '\u{bc}', '\u{a1}', '\u{ab}', '\u{a4}', '\u{2591}', '\u{2592}', '\u{2593}', '\u{2502}', '\u{2524}',
318        '\u{2561}', '\u{2562}', '\u{2556}', '\u{2555}', '\u{2563}', '\u{2551}', '\u{2557}', '\u{255d}', '\u{255c}',
319        '\u{255b}', '\u{2510}', '\u{2514}', '\u{2534}', '\u{252c}', '\u{251c}', '\u{2500}', '\u{253c}', '\u{255e}',
320        '\u{255f}', '\u{255a}', '\u{2554}', '\u{2569}', '\u{2566}', '\u{2560}', '\u{2550}', '\u{256c}', '\u{2567}',
321        '\u{2568}', '\u{2564}', '\u{2565}', '\u{2559}', '\u{2558}', '\u{2552}', '\u{2553}', '\u{256b}', '\u{256a}',
322        '\u{2518}', '\u{250c}', '\u{2588}', '\u{2584}', '\u{258c}', '\u{2590}', '\u{2580}', '\u{3b1}', '\u{df}',
323        '\u{393}', '\u{3c0}', '\u{3a3}', '\u{3c3}', '\u{b5}', '\u{3c4}', '\u{3a6}', '\u{398}', '\u{3a9}', '\u{3b4}',
324        '\u{221e}', '\u{3c6}', '\u{3b5}', '\u{2229}', '\u{2261}', '\u{b1}', '\u{2265}', '\u{2264}', '\u{2320}',
325        '\u{2321}', '\u{f7}', '\u{2248}', '\u{b0}', '\u{2219}', '\u{b7}', '\u{221a}', '\u{207f}', '\u{b2}', '\u{25a0}',
326        '\u{a0}',
327    ],
328};
329
330static ISO_8859_7: CodePage = CodePage {
331    name: "ISO-8859-7, Greek",
332    lower: None,
333    upper: [
334        '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}', '\u{89}', '\u{8a}',
335        '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}', '\u{92}', '\u{93}', '\u{94}', '\u{95}',
336        '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}', '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}',
337        '\u{2018}', '\u{2019}', '\u{a3}', '\u{20ac}', '\u{20af}', '\u{a6}', '\u{a7}', '\u{a8}', '\u{a9}', '\u{37a}',
338        '\u{ab}', '\u{ac}', '\u{ad}', '\u{fffd}', '\u{2015}', '\u{b0}', '\u{b1}', '\u{b2}', '\u{b3}', '\u{384}',
339        '\u{385}', '\u{386}', '\u{b7}', '\u{388}', '\u{389}', '\u{38a}', '\u{bb}', '\u{38c}', '\u{bd}', '\u{38e}',
340        '\u{38f}', '\u{390}', '\u{391}', '\u{392}', '\u{393}', '\u{394}', '\u{395}', '\u{396}', '\u{397}', '\u{398}',
341        '\u{399}', '\u{39a}', '\u{39b}', '\u{39c}', '\u{39d}', '\u{39e}', '\u{39f}', '\u{3a0}', '\u{3a1}', '\u{fffd}',
342        '\u{3a3}', '\u{3a4}', '\u{3a5}', '\u{3a6}', '\u{3a7}', '\u{3a8}', '\u{3a9}', '\u{3aa}', '\u{3ab}', '\u{3ac}',
343        '\u{3ad}', '\u{3ae}', '\u{3af}', '\u{3b0}', '\u{3b1}', '\u{3b2}', '\u{3b3}', '\u{3b4}', '\u{3b5}', '\u{3b6}',
344        '\u{3b7}', '\u{3b8}', '\u{3b9}', '\u{3ba}', '\u{3bb}', '\u{3bc}', '\u{3bd}', '\u{3be}', '\u{3bf}', '\u{3c0}',
345        '\u{3c1}', '\u{3c2}', '\u{3c3}', '\u{3c4}', '\u{3c5}', '\u{3c6}', '\u{3c7}', '\u{3c8}', '\u{3c9}', '\u{3ca}',
346        '\u{3cb}', '\u{3cc}', '\u{3cd}', '\u{3ce}', '\u{fffd}',
347    ],
348};
349
350static ISO_8859_1: CodePage = CodePage {
351    name: "ISO-8859-1, West European",
352    lower: None,
353    upper: [
354        '\u{80}', '\u{81}', '\u{82}', '\u{83}', '\u{84}', '\u{85}', '\u{86}', '\u{87}', '\u{88}', '\u{89}', '\u{8a}',
355        '\u{8b}', '\u{8c}', '\u{8d}', '\u{8e}', '\u{8f}', '\u{90}', '\u{91}', '\u{92}', '\u{93}', '\u{94}', '\u{95}',
356        '\u{96}', '\u{97}', '\u{98}', '\u{99}', '\u{9a}', '\u{9b}', '\u{9c}', '\u{9d}', '\u{9e}', '\u{9f}', '\u{a0}',
357        '\u{a1}', '\u{a2}', '\u{a3}', '\u{a4}', '\u{a5}', '\u{a6}', '\u{a7}', '\u{a8}', '\u{a9}', '\u{aa}', '\u{ab}',
358        '\u{ac}', '\u{ad}', '\u{ae}', '\u{af}', '\u{b0}', '\u{b1}', '\u{b2}', '\u{b3}', '\u{b4}', '\u{b5}', '\u{b6}',
359        '\u{b7}', '\u{b8}', '\u{b9}', '\u{ba}', '\u{bb}', '\u{bc}', '\u{bd}', '\u{be}', '\u{bf}', '\u{c0}', '\u{c1}',
360        '\u{c2}', '\u{c3}', '\u{c4}', '\u{c5}', '\u{c6}', '\u{c7}', '\u{c8}', '\u{c9}', '\u{ca}', '\u{cb}', '\u{cc}',
361        '\u{cd}', '\u{ce}', '\u{cf}', '\u{d0}', '\u{d1}', '\u{d2}', '\u{d3}', '\u{d4}', '\u{d5}', '\u{d6}', '\u{d7}',
362        '\u{d8}', '\u{d9}', '\u{da}', '\u{db}', '\u{dc}', '\u{dd}', '\u{de}', '\u{df}', '\u{e0}', '\u{e1}', '\u{e2}',
363        '\u{e3}', '\u{e4}', '\u{e5}', '\u{e6}', '\u{e7}', '\u{e8}', '\u{e9}', '\u{ea}', '\u{eb}', '\u{ec}', '\u{ed}',
364        '\u{ee}', '\u{ef}', '\u{f0}', '\u{f1}', '\u{f2}', '\u{f3}', '\u{f4}', '\u{f5}', '\u{f6}', '\u{f7}', '\u{f8}',
365        '\u{f9}', '\u{fa}', '\u{fb}', '\u{fc}', '\u{fd}', '\u{fe}', '\u{ff}',
366    ],
367};
368
369static CP866U: CodePage = CodePage {
370    name: "CP866U (CP1125), Ukrainian",
371    lower: None,
372    upper: [
373        '\u{410}', '\u{411}', '\u{412}', '\u{413}', '\u{414}', '\u{415}', '\u{416}', '\u{417}', '\u{418}', '\u{419}',
374        '\u{41a}', '\u{41b}', '\u{41c}', '\u{41d}', '\u{41e}', '\u{41f}', '\u{420}', '\u{421}', '\u{422}', '\u{423}',
375        '\u{424}', '\u{425}', '\u{426}', '\u{427}', '\u{428}', '\u{429}', '\u{42a}', '\u{42b}', '\u{42c}', '\u{42d}',
376        '\u{42e}', '\u{42f}', '\u{430}', '\u{431}', '\u{432}', '\u{433}', '\u{434}', '\u{435}', '\u{436}', '\u{437}',
377        '\u{438}', '\u{439}', '\u{43a}', '\u{43b}', '\u{43c}', '\u{43d}', '\u{43e}', '\u{43f}', '\u{2591}', '\u{2592}',
378        '\u{2593}', '\u{2502}', '\u{2524}', '\u{2561}', '\u{2562}', '\u{2556}', '\u{2555}', '\u{2563}', '\u{2551}',
379        '\u{2557}', '\u{255d}', '\u{255c}', '\u{255b}', '\u{2510}', '\u{2514}', '\u{2534}', '\u{252c}', '\u{251c}',
380        '\u{2500}', '\u{253c}', '\u{255e}', '\u{255f}', '\u{255a}', '\u{2554}', '\u{2569}', '\u{2566}', '\u{2560}',
381        '\u{2550}', '\u{256c}', '\u{2567}', '\u{2568}', '\u{2564}', '\u{2565}', '\u{2559}', '\u{2558}', '\u{2552}',
382        '\u{2553}', '\u{256b}', '\u{256a}', '\u{2518}', '\u{250c}', '\u{2588}', '\u{2584}', '\u{258c}', '\u{2590}',
383        '\u{2580}', '\u{440}', '\u{441}', '\u{442}', '\u{443}', '\u{444}', '\u{445}', '\u{446}', '\u{447}', '\u{448}',
384        '\u{449}', '\u{44a}', '\u{44b}', '\u{44c}', '\u{44d}', '\u{44e}', '\u{44f}', '\u{401}', '\u{451}', '\u{490}',
385        '\u{491}', '\u{404}', '\u{454}', '\u{406}', '\u{456}', '\u{407}', '\u{457}', '\u{b7}', '\u{221a}', '\u{2116}',
386        '\u{a4}', '\u{25a0}', '\u{a0}',
387    ],
388};
389
390static HAIK8: CodePage = CodePage {
391    name: "haik8, Armenian",
392    lower: None,
393    upper: [
394        '\u{a0}', '\u{58e}', '\u{a7}', '\u{589}', '\u{29}', '\u{2a}', '\u{bb}', '\u{ab}', '\u{2014}', '\u{2e}',
395        '\u{55d}', '\u{2c}', '\u{2013}', '\u{58a}', '\u{2026}', '\u{55c}', '\u{55b}', '\u{55e}', '\u{531}', '\u{561}',
396        '\u{532}', '\u{562}', '\u{533}', '\u{563}', '\u{534}', '\u{564}', '\u{535}', '\u{565}', '\u{536}', '\u{566}',
397        '\u{537}', '\u{567}', '\u{538}', '\u{568}', '\u{539}', '\u{569}', '\u{53a}', '\u{56a}', '\u{53b}', '\u{56b}',
398        '\u{53c}', '\u{56c}', '\u{53d}', '\u{56d}', '\u{53e}', '\u{56e}', '\u{53f}', '\u{56f}', '\u{540}', '\u{570}',
399        '\u{541}', '\u{571}', '\u{542}', '\u{572}', '\u{543}', '\u{573}', '\u{544}', '\u{574}', '\u{545}', '\u{575}',
400        '\u{546}', '\u{576}', '\u{547}', '\u{577}', '\u{2514}', '\u{2534}', '\u{252c}', '\u{251c}', '\u{2500}',
401        '\u{253c}', '\u{255e}', '\u{255f}', '\u{255a}', '\u{2554}', '\u{2569}', '\u{2566}', '\u{2560}', '\u{2550}',
402        '\u{256c}', '\u{2567}', '\u{2568}', '\u{2564}', '\u{2565}', '\u{2559}', '\u{2558}', '\u{2552}', '\u{2553}',
403        '\u{256b}', '\u{256a}', '\u{2518}', '\u{250c}', '\u{2588}', '\u{2584}', '\u{258c}', '\u{2590}', '\u{2580}',
404        '\u{548}', '\u{578}', '\u{549}', '\u{579}', '\u{54a}', '\u{57a}', '\u{54b}', '\u{57b}', '\u{54c}', '\u{57c}',
405        '\u{54d}', '\u{57d}', '\u{54e}', '\u{57e}', '\u{54f}', '\u{57f}', '\u{550}', '\u{580}', '\u{551}', '\u{581}',
406        '\u{552}', '\u{582}', '\u{553}', '\u{583}', '\u{554}', '\u{584}', '\u{555}', '\u{585}', '\u{556}', '\u{586}',
407        '\u{2bc}', '\u{a0}',
408    ],
409};
410
411static ARMSCII_8: CodePage = CodePage {
412    name: "ARMSCII-8, Armenian",
413    lower: None,
414    upper: [
415        '\u{c7}', '\u{fc}', '\u{e9}', '\u{e2}', '\u{e4}', '\u{e0}', '\u{e5}', '\u{e7}', '\u{ea}', '\u{eb}', '\u{e8}',
416        '\u{ef}', '\u{ee}', '\u{ec}', '\u{c4}', '\u{c5}', '\u{c9}', '\u{e6}', '\u{c6}', '\u{f4}', '\u{f6}', '\u{f2}',
417        '\u{fb}', '\u{f9}', '\u{ff}', '\u{d6}', '\u{dc}', '\u{a2}', '\u{a3}', '\u{a5}', '\u{20a7}', '\u{192}',
418        '\u{a0}', '\u{58e}', '\u{a7}', '\u{589}', '\u{29}', '\u{2a}', '\u{bb}', '\u{ab}', '\u{2014}', '\u{2e}',
419        '\u{55d}', '\u{2c}', '\u{2013}', '\u{58a}', '\u{2026}', '\u{55c}', '\u{55b}', '\u{55e}', '\u{531}', '\u{561}',
420        '\u{532}', '\u{562}', '\u{533}', '\u{563}', '\u{534}', '\u{564}', '\u{535}', '\u{565}', '\u{536}', '\u{566}',
421        '\u{537}', '\u{567}', '\u{538}', '\u{568}', '\u{539}', '\u{569}', '\u{53a}', '\u{56a}', '\u{53b}', '\u{56b}',
422        '\u{53c}', '\u{56c}', '\u{53d}', '\u{56d}', '\u{53e}', '\u{56e}', '\u{53f}', '\u{56f}', '\u{540}', '\u{570}',
423        '\u{541}', '\u{571}', '\u{542}', '\u{572}', '\u{543}', '\u{573}', '\u{544}', '\u{574}', '\u{545}', '\u{575}',
424        '\u{546}', '\u{576}', '\u{547}', '\u{577}', '\u{548}', '\u{578}', '\u{549}', '\u{579}', '\u{54a}', '\u{57a}',
425        '\u{54b}', '\u{57b}', '\u{54c}', '\u{57c}', '\u{54d}', '\u{57d}', '\u{54e}', '\u{57e}', '\u{54f}', '\u{57f}',
426        '\u{550}', '\u{580}', '\u{551}', '\u{581}', '\u{552}', '\u{582}', '\u{553}', '\u{583}', '\u{554}', '\u{584}',
427        '\u{555}', '\u{585}', '\u{556}', '\u{586}', '\u{2bc}', '\u{a0}',
428    ],
429};
430
431static CP1131: CodePage = CodePage {
432    name: "CP1131, Belarusian",
433    lower: None,
434    upper: [
435        '\u{410}', '\u{411}', '\u{412}', '\u{413}', '\u{414}', '\u{415}', '\u{416}', '\u{417}', '\u{418}', '\u{419}',
436        '\u{41a}', '\u{41b}', '\u{41c}', '\u{41d}', '\u{41e}', '\u{41f}', '\u{420}', '\u{421}', '\u{422}', '\u{423}',
437        '\u{424}', '\u{425}', '\u{426}', '\u{427}', '\u{428}', '\u{429}', '\u{42a}', '\u{42b}', '\u{42c}', '\u{42d}',
438        '\u{42e}', '\u{42f}', '\u{430}', '\u{431}', '\u{432}', '\u{433}', '\u{434}', '\u{435}', '\u{436}', '\u{437}',
439        '\u{438}', '\u{439}', '\u{43a}', '\u{43b}', '\u{43c}', '\u{43d}', '\u{43e}', '\u{43f}', '\u{2591}', '\u{2592}',
440        '\u{2593}', '\u{2502}', '\u{2524}', '\u{2561}', '\u{2562}', '\u{2556}', '\u{2555}', '\u{2563}', '\u{2551}',
441        '\u{2557}', '\u{255d}', '\u{255c}', '\u{255b}', '\u{2510}', '\u{2514}', '\u{2534}', '\u{252c}', '\u{251c}',
442        '\u{2500}', '\u{253c}', '\u{255e}', '\u{255f}', '\u{255a}', '\u{2554}', '\u{2569}', '\u{2566}', '\u{2560}',
443        '\u{2550}', '\u{256c}', '\u{2567}', '\u{2568}', '\u{2564}', '\u{2565}', '\u{2559}', '\u{2558}', '\u{2552}',
444        '\u{2553}', '\u{256b}', '\u{256a}', '\u{2518}', '\u{250c}', '\u{2588}', '\u{2584}', '\u{258c}', '\u{2590}',
445        '\u{2580}', '\u{440}', '\u{441}', '\u{442}', '\u{443}', '\u{444}', '\u{445}', '\u{446}', '\u{447}', '\u{448}',
446        '\u{449}', '\u{44a}', '\u{44b}', '\u{44c}', '\u{44d}', '\u{44e}', '\u{44f}', '\u{401}', '\u{451}', '\u{404}',
447        '\u{454}', '\u{407}', '\u{457}', '\u{40e}', '\u{45e}', '\u{406}', '\u{456}', '\u{b7}', '\u{221a}', '\u{490}',
448        '\u{491}', '\u{2219}', '\u{a0}',
449    ],
450};
451
452/// Commodore 64, upper case and graphics: screen codes, as BadTerm's font draws them; the upper half
453/// is the same characters in reverse video.
454static C64_UPPER: CodePage = CodePage {
455    name: "Commodore 64, upper case and graphics",
456    lower: Some([
457        '\u{40}',
458        '\u{41}',
459        '\u{42}',
460        '\u{43}',
461        '\u{44}',
462        '\u{45}',
463        '\u{46}',
464        '\u{47}',
465        '\u{48}',
466        '\u{49}',
467        '\u{4a}',
468        '\u{4b}',
469        '\u{4c}',
470        '\u{4d}',
471        '\u{4e}',
472        '\u{4f}',
473        '\u{50}',
474        '\u{51}',
475        '\u{52}',
476        '\u{53}',
477        '\u{54}',
478        '\u{55}',
479        '\u{56}',
480        '\u{57}',
481        '\u{58}',
482        '\u{59}',
483        '\u{5a}',
484        '\u{5b}',
485        '\u{a3}',
486        '\u{5d}',
487        '\u{2191}',
488        '\u{2190}',
489        '\u{20}',
490        '\u{21}',
491        '\u{22}',
492        '\u{23}',
493        '\u{24}',
494        '\u{25}',
495        '\u{26}',
496        '\u{27}',
497        '\u{28}',
498        '\u{29}',
499        '\u{2a}',
500        '\u{2b}',
501        '\u{2c}',
502        '\u{2d}',
503        '\u{2e}',
504        '\u{2f}',
505        '\u{30}',
506        '\u{31}',
507        '\u{32}',
508        '\u{33}',
509        '\u{34}',
510        '\u{35}',
511        '\u{36}',
512        '\u{37}',
513        '\u{38}',
514        '\u{39}',
515        '\u{3a}',
516        '\u{3b}',
517        '\u{3c}',
518        '\u{3d}',
519        '\u{3e}',
520        '\u{3f}',
521        '\u{2500}',
522        '\u{2660}',
523        '\u{1fb72}',
524        '\u{1fb78}',
525        '\u{1fb77}',
526        '\u{1fb76}',
527        '\u{1fb7a}',
528        '\u{1fb71}',
529        '\u{1fb74}',
530        '\u{256e}',
531        '\u{2570}',
532        '\u{256f}',
533        '\u{1fb7c}',
534        '\u{2572}',
535        '\u{2571}',
536        '\u{1fb7d}',
537        '\u{1fb7e}',
538        '\u{25cf}',
539        '\u{1fb7b}',
540        '\u{2665}',
541        '\u{1fb70}',
542        '\u{256d}',
543        '\u{2573}',
544        '\u{25cb}',
545        '\u{2663}',
546        '\u{1fb75}',
547        '\u{2666}',
548        '\u{253c}',
549        '\u{1fb8c}',
550        '\u{2502}',
551        '\u{3c0}',
552        '\u{25e5}',
553        '\u{a0}',
554        '\u{258c}',
555        '\u{2584}',
556        '\u{2594}',
557        '\u{2581}',
558        '\u{258f}',
559        '\u{2592}',
560        '\u{2595}',
561        '\u{1fb8f}',
562        '\u{25e4}',
563        '\u{1fb87}',
564        '\u{251c}',
565        '\u{2597}',
566        '\u{2514}',
567        '\u{2510}',
568        '\u{2582}',
569        '\u{250c}',
570        '\u{2534}',
571        '\u{252c}',
572        '\u{2524}',
573        '\u{258e}',
574        '\u{258d}',
575        '\u{1fb88}',
576        '\u{1fb82}',
577        '\u{1fb83}',
578        '\u{2583}',
579        '\u{1fb7f}',
580        '\u{2596}',
581        '\u{259d}',
582        '\u{2518}',
583        '\u{2598}',
584        '\u{259a}',
585    ]),
586    upper: [
587        '\u{40}',
588        '\u{41}',
589        '\u{42}',
590        '\u{43}',
591        '\u{44}',
592        '\u{45}',
593        '\u{46}',
594        '\u{47}',
595        '\u{48}',
596        '\u{49}',
597        '\u{4a}',
598        '\u{4b}',
599        '\u{4c}',
600        '\u{4d}',
601        '\u{4e}',
602        '\u{4f}',
603        '\u{50}',
604        '\u{51}',
605        '\u{52}',
606        '\u{53}',
607        '\u{54}',
608        '\u{55}',
609        '\u{56}',
610        '\u{57}',
611        '\u{58}',
612        '\u{59}',
613        '\u{5a}',
614        '\u{5b}',
615        '\u{a3}',
616        '\u{5d}',
617        '\u{2191}',
618        '\u{2190}',
619        '\u{20}',
620        '\u{21}',
621        '\u{22}',
622        '\u{23}',
623        '\u{24}',
624        '\u{25}',
625        '\u{26}',
626        '\u{27}',
627        '\u{28}',
628        '\u{29}',
629        '\u{2a}',
630        '\u{2b}',
631        '\u{2c}',
632        '\u{2d}',
633        '\u{2e}',
634        '\u{2f}',
635        '\u{30}',
636        '\u{31}',
637        '\u{32}',
638        '\u{33}',
639        '\u{34}',
640        '\u{35}',
641        '\u{36}',
642        '\u{37}',
643        '\u{38}',
644        '\u{39}',
645        '\u{3a}',
646        '\u{3b}',
647        '\u{3c}',
648        '\u{3d}',
649        '\u{3e}',
650        '\u{3f}',
651        '\u{2500}',
652        '\u{2660}',
653        '\u{1fb72}',
654        '\u{1fb78}',
655        '\u{1fb77}',
656        '\u{1fb76}',
657        '\u{1fb7a}',
658        '\u{1fb71}',
659        '\u{1fb74}',
660        '\u{256e}',
661        '\u{2570}',
662        '\u{256f}',
663        '\u{1fb7c}',
664        '\u{2572}',
665        '\u{2571}',
666        '\u{1fb7d}',
667        '\u{1fb7e}',
668        '\u{25cf}',
669        '\u{1fb7b}',
670        '\u{2665}',
671        '\u{1fb70}',
672        '\u{256d}',
673        '\u{2573}',
674        '\u{25cb}',
675        '\u{2663}',
676        '\u{1fb75}',
677        '\u{2666}',
678        '\u{253c}',
679        '\u{1fb8c}',
680        '\u{2502}',
681        '\u{3c0}',
682        '\u{25e5}',
683        '\u{a0}',
684        '\u{258c}',
685        '\u{2584}',
686        '\u{2594}',
687        '\u{2581}',
688        '\u{258f}',
689        '\u{2592}',
690        '\u{2595}',
691        '\u{1fb8f}',
692        '\u{25e4}',
693        '\u{1fb87}',
694        '\u{251c}',
695        '\u{2597}',
696        '\u{2514}',
697        '\u{2510}',
698        '\u{2582}',
699        '\u{250c}',
700        '\u{2534}',
701        '\u{252c}',
702        '\u{2524}',
703        '\u{258e}',
704        '\u{258d}',
705        '\u{1fb88}',
706        '\u{1fb82}',
707        '\u{1fb83}',
708        '\u{2583}',
709        '\u{1fb7f}',
710        '\u{2596}',
711        '\u{259d}',
712        '\u{2518}',
713        '\u{2598}',
714        '\u{259a}',
715    ],
716};
717
718/// Commodore 64, lower and upper case: screen codes, as BadTerm's font draws them; the upper half
719/// is the same characters in reverse video.
720static C64_LOWER: CodePage = CodePage {
721    name: "Commodore 64, lower and upper case",
722    lower: Some([
723        '\u{40}',
724        '\u{61}',
725        '\u{62}',
726        '\u{63}',
727        '\u{64}',
728        '\u{65}',
729        '\u{66}',
730        '\u{67}',
731        '\u{68}',
732        '\u{69}',
733        '\u{6a}',
734        '\u{6b}',
735        '\u{6c}',
736        '\u{6d}',
737        '\u{6e}',
738        '\u{6f}',
739        '\u{70}',
740        '\u{71}',
741        '\u{72}',
742        '\u{73}',
743        '\u{74}',
744        '\u{75}',
745        '\u{76}',
746        '\u{77}',
747        '\u{78}',
748        '\u{79}',
749        '\u{7a}',
750        '\u{5b}',
751        '\u{a3}',
752        '\u{5d}',
753        '\u{2191}',
754        '\u{2190}',
755        '\u{20}',
756        '\u{21}',
757        '\u{22}',
758        '\u{23}',
759        '\u{24}',
760        '\u{25}',
761        '\u{26}',
762        '\u{27}',
763        '\u{28}',
764        '\u{29}',
765        '\u{2a}',
766        '\u{2b}',
767        '\u{2c}',
768        '\u{2d}',
769        '\u{2e}',
770        '\u{2f}',
771        '\u{30}',
772        '\u{31}',
773        '\u{32}',
774        '\u{33}',
775        '\u{34}',
776        '\u{35}',
777        '\u{36}',
778        '\u{37}',
779        '\u{38}',
780        '\u{39}',
781        '\u{3a}',
782        '\u{3b}',
783        '\u{3c}',
784        '\u{3d}',
785        '\u{3e}',
786        '\u{3f}',
787        '\u{2500}',
788        '\u{41}',
789        '\u{42}',
790        '\u{43}',
791        '\u{44}',
792        '\u{45}',
793        '\u{46}',
794        '\u{47}',
795        '\u{48}',
796        '\u{49}',
797        '\u{4a}',
798        '\u{4b}',
799        '\u{4c}',
800        '\u{4d}',
801        '\u{4e}',
802        '\u{4f}',
803        '\u{50}',
804        '\u{51}',
805        '\u{52}',
806        '\u{53}',
807        '\u{54}',
808        '\u{55}',
809        '\u{56}',
810        '\u{57}',
811        '\u{58}',
812        '\u{59}',
813        '\u{5a}',
814        '\u{253c}',
815        '\u{1fb8c}',
816        '\u{2502}',
817        '\u{1fb96}',
818        '\u{1fb98}',
819        '\u{a0}',
820        '\u{258c}',
821        '\u{2584}',
822        '\u{2594}',
823        '\u{2581}',
824        '\u{258f}',
825        '\u{2592}',
826        '\u{2595}',
827        '\u{1fb8f}',
828        '\u{1fb99}',
829        '\u{1fb87}',
830        '\u{251c}',
831        '\u{2597}',
832        '\u{2514}',
833        '\u{2510}',
834        '\u{2582}',
835        '\u{250c}',
836        '\u{2534}',
837        '\u{252c}',
838        '\u{2524}',
839        '\u{258e}',
840        '\u{258d}',
841        '\u{1fb88}',
842        '\u{1fb82}',
843        '\u{1fb83}',
844        '\u{2583}',
845        '\u{2713}',
846        '\u{2596}',
847        '\u{259d}',
848        '\u{2518}',
849        '\u{2598}',
850        '\u{259a}',
851    ]),
852    upper: [
853        '\u{40}',
854        '\u{61}',
855        '\u{62}',
856        '\u{63}',
857        '\u{64}',
858        '\u{65}',
859        '\u{66}',
860        '\u{67}',
861        '\u{68}',
862        '\u{69}',
863        '\u{6a}',
864        '\u{6b}',
865        '\u{6c}',
866        '\u{6d}',
867        '\u{6e}',
868        '\u{6f}',
869        '\u{70}',
870        '\u{71}',
871        '\u{72}',
872        '\u{73}',
873        '\u{74}',
874        '\u{75}',
875        '\u{76}',
876        '\u{77}',
877        '\u{78}',
878        '\u{79}',
879        '\u{7a}',
880        '\u{5b}',
881        '\u{a3}',
882        '\u{5d}',
883        '\u{2191}',
884        '\u{2190}',
885        '\u{20}',
886        '\u{21}',
887        '\u{22}',
888        '\u{23}',
889        '\u{24}',
890        '\u{25}',
891        '\u{26}',
892        '\u{27}',
893        '\u{28}',
894        '\u{29}',
895        '\u{2a}',
896        '\u{2b}',
897        '\u{2c}',
898        '\u{2d}',
899        '\u{2e}',
900        '\u{2f}',
901        '\u{30}',
902        '\u{31}',
903        '\u{32}',
904        '\u{33}',
905        '\u{34}',
906        '\u{35}',
907        '\u{36}',
908        '\u{37}',
909        '\u{38}',
910        '\u{39}',
911        '\u{3a}',
912        '\u{3b}',
913        '\u{3c}',
914        '\u{3d}',
915        '\u{3e}',
916        '\u{3f}',
917        '\u{2500}',
918        '\u{41}',
919        '\u{42}',
920        '\u{43}',
921        '\u{44}',
922        '\u{45}',
923        '\u{46}',
924        '\u{47}',
925        '\u{48}',
926        '\u{49}',
927        '\u{4a}',
928        '\u{4b}',
929        '\u{4c}',
930        '\u{4d}',
931        '\u{4e}',
932        '\u{4f}',
933        '\u{50}',
934        '\u{51}',
935        '\u{52}',
936        '\u{53}',
937        '\u{54}',
938        '\u{55}',
939        '\u{56}',
940        '\u{57}',
941        '\u{58}',
942        '\u{59}',
943        '\u{5a}',
944        '\u{253c}',
945        '\u{1fb8c}',
946        '\u{2502}',
947        '\u{1fb96}',
948        '\u{1fb98}',
949        '\u{a0}',
950        '\u{258c}',
951        '\u{2584}',
952        '\u{2594}',
953        '\u{2581}',
954        '\u{258f}',
955        '\u{2592}',
956        '\u{2595}',
957        '\u{1fb8f}',
958        '\u{1fb99}',
959        '\u{1fb87}',
960        '\u{251c}',
961        '\u{2597}',
962        '\u{2514}',
963        '\u{2510}',
964        '\u{2582}',
965        '\u{250c}',
966        '\u{2534}',
967        '\u{252c}',
968        '\u{2524}',
969        '\u{258e}',
970        '\u{258d}',
971        '\u{1fb88}',
972        '\u{1fb82}',
973        '\u{1fb83}',
974        '\u{2583}',
975        '\u{2713}',
976        '\u{2596}',
977        '\u{259d}',
978        '\u{2518}',
979        '\u{2598}',
980        '\u{259a}',
981    ],
982};
983
984/// Atari 8-bit (ATASCII): screen codes, as BadTerm's font draws them; the upper half
985/// is the same characters in reverse video.
986static ATARI: CodePage = CodePage {
987    name: "Atari 8-bit (ATASCII)",
988    lower: Some([
989        '\u{2665}',
990        '\u{251c}',
991        '\u{1fb87}',
992        '\u{2518}',
993        '\u{2524}',
994        '\u{2510}',
995        '\u{2571}',
996        '\u{2572}',
997        '\u{25e2}',
998        '\u{2597}',
999        '\u{25e3}',
1000        '\u{259d}',
1001        '\u{2598}',
1002        '\u{1fb82}',
1003        '\u{2582}',
1004        '\u{2596}',
1005        '\u{2663}',
1006        '\u{250c}',
1007        '\u{2500}',
1008        '\u{253c}',
1009        '\u{25cf}',
1010        '\u{2584}',
1011        '\u{258e}',
1012        '\u{252c}',
1013        '\u{2534}',
1014        '\u{258c}',
1015        '\u{2514}',
1016        '\u{241b}',
1017        '\u{2191}',
1018        '\u{2193}',
1019        '\u{2190}',
1020        '\u{2192}',
1021        '\u{20}',
1022        '\u{21}',
1023        '\u{22}',
1024        '\u{23}',
1025        '\u{24}',
1026        '\u{25}',
1027        '\u{26}',
1028        '\u{27}',
1029        '\u{28}',
1030        '\u{29}',
1031        '\u{2a}',
1032        '\u{2b}',
1033        '\u{2c}',
1034        '\u{2d}',
1035        '\u{2e}',
1036        '\u{2f}',
1037        '\u{30}',
1038        '\u{31}',
1039        '\u{32}',
1040        '\u{33}',
1041        '\u{34}',
1042        '\u{35}',
1043        '\u{36}',
1044        '\u{37}',
1045        '\u{38}',
1046        '\u{39}',
1047        '\u{3a}',
1048        '\u{3b}',
1049        '\u{3c}',
1050        '\u{3d}',
1051        '\u{3e}',
1052        '\u{3f}',
1053        '\u{40}',
1054        '\u{41}',
1055        '\u{42}',
1056        '\u{43}',
1057        '\u{44}',
1058        '\u{45}',
1059        '\u{46}',
1060        '\u{47}',
1061        '\u{48}',
1062        '\u{49}',
1063        '\u{4a}',
1064        '\u{4b}',
1065        '\u{4c}',
1066        '\u{4d}',
1067        '\u{4e}',
1068        '\u{4f}',
1069        '\u{50}',
1070        '\u{51}',
1071        '\u{52}',
1072        '\u{53}',
1073        '\u{54}',
1074        '\u{55}',
1075        '\u{56}',
1076        '\u{57}',
1077        '\u{58}',
1078        '\u{59}',
1079        '\u{5a}',
1080        '\u{5b}',
1081        '\u{5c}',
1082        '\u{5d}',
1083        '\u{5e}',
1084        '\u{5f}',
1085        '\u{2666}',
1086        '\u{61}',
1087        '\u{62}',
1088        '\u{63}',
1089        '\u{64}',
1090        '\u{65}',
1091        '\u{66}',
1092        '\u{67}',
1093        '\u{68}',
1094        '\u{69}',
1095        '\u{6a}',
1096        '\u{6b}',
1097        '\u{6c}',
1098        '\u{6d}',
1099        '\u{6e}',
1100        '\u{6f}',
1101        '\u{70}',
1102        '\u{71}',
1103        '\u{72}',
1104        '\u{73}',
1105        '\u{74}',
1106        '\u{75}',
1107        '\u{76}',
1108        '\u{77}',
1109        '\u{78}',
1110        '\u{79}',
1111        '\u{7a}',
1112        '\u{2660}',
1113        '\u{7c}',
1114        '\u{1f8b0}',
1115        '\u{25c0}',
1116        '\u{25b6}',
1117    ]),
1118    upper: [
1119        '\u{2665}',
1120        '\u{251c}',
1121        '\u{1fb87}',
1122        '\u{2518}',
1123        '\u{2524}',
1124        '\u{2510}',
1125        '\u{2571}',
1126        '\u{2572}',
1127        '\u{25e2}',
1128        '\u{2597}',
1129        '\u{25e3}',
1130        '\u{259d}',
1131        '\u{2598}',
1132        '\u{1fb82}',
1133        '\u{2582}',
1134        '\u{2596}',
1135        '\u{2663}',
1136        '\u{250c}',
1137        '\u{2500}',
1138        '\u{253c}',
1139        '\u{25cf}',
1140        '\u{2584}',
1141        '\u{258e}',
1142        '\u{252c}',
1143        '\u{2534}',
1144        '\u{258c}',
1145        '\u{2514}',
1146        '\u{241b}',
1147        '\u{2191}',
1148        '\u{2193}',
1149        '\u{2190}',
1150        '\u{2192}',
1151        '\u{20}',
1152        '\u{21}',
1153        '\u{22}',
1154        '\u{23}',
1155        '\u{24}',
1156        '\u{25}',
1157        '\u{26}',
1158        '\u{27}',
1159        '\u{28}',
1160        '\u{29}',
1161        '\u{2a}',
1162        '\u{2b}',
1163        '\u{2c}',
1164        '\u{2d}',
1165        '\u{2e}',
1166        '\u{2f}',
1167        '\u{30}',
1168        '\u{31}',
1169        '\u{32}',
1170        '\u{33}',
1171        '\u{34}',
1172        '\u{35}',
1173        '\u{36}',
1174        '\u{37}',
1175        '\u{38}',
1176        '\u{39}',
1177        '\u{3a}',
1178        '\u{3b}',
1179        '\u{3c}',
1180        '\u{3d}',
1181        '\u{3e}',
1182        '\u{3f}',
1183        '\u{40}',
1184        '\u{41}',
1185        '\u{42}',
1186        '\u{43}',
1187        '\u{44}',
1188        '\u{45}',
1189        '\u{46}',
1190        '\u{47}',
1191        '\u{48}',
1192        '\u{49}',
1193        '\u{4a}',
1194        '\u{4b}',
1195        '\u{4c}',
1196        '\u{4d}',
1197        '\u{4e}',
1198        '\u{4f}',
1199        '\u{50}',
1200        '\u{51}',
1201        '\u{52}',
1202        '\u{53}',
1203        '\u{54}',
1204        '\u{55}',
1205        '\u{56}',
1206        '\u{57}',
1207        '\u{58}',
1208        '\u{59}',
1209        '\u{5a}',
1210        '\u{5b}',
1211        '\u{5c}',
1212        '\u{5d}',
1213        '\u{5e}',
1214        '\u{5f}',
1215        '\u{2666}',
1216        '\u{61}',
1217        '\u{62}',
1218        '\u{63}',
1219        '\u{64}',
1220        '\u{65}',
1221        '\u{66}',
1222        '\u{67}',
1223        '\u{68}',
1224        '\u{69}',
1225        '\u{6a}',
1226        '\u{6b}',
1227        '\u{6c}',
1228        '\u{6d}',
1229        '\u{6e}',
1230        '\u{6f}',
1231        '\u{70}',
1232        '\u{71}',
1233        '\u{72}',
1234        '\u{73}',
1235        '\u{74}',
1236        '\u{75}',
1237        '\u{76}',
1238        '\u{77}',
1239        '\u{78}',
1240        '\u{79}',
1241        '\u{7a}',
1242        '\u{2660}',
1243        '\u{7c}',
1244        '\u{1f8b0}',
1245        '\u{25c0}',
1246        '\u{25b6}',
1247    ],
1248};
1249
1250#[cfg(test)]
1251mod tests {
1252    use super::*;
1253
1254    #[test]
1255    fn cyrillic_both_ways() {
1256        let cp866 = for_font(25).unwrap();
1257        assert_eq!(cp866.encode_str("Привет!"), [0x8F, 0xE0, 0xA8, 0xA2, 0xA5, 0xE2, b'!']);
1258        assert_eq!(cp866.decode(0x8F), 'П');
1259        let koi = for_font(2).unwrap();
1260        assert_eq!(koi.encode_str("Да"), [0xE4, 0xC1]);
1261        assert_eq!(koi.decode(0xC1), 'а');
1262        // Not in the code page: a question mark.
1263        assert_eq!(for_font(21).unwrap().encode_str("Ω€Ж"), [0xD9, 0xA4, b'?']);
1264        assert!(for_font(0).is_none());
1265        // Armenian and Belarusian: their own letters, CP437's boxes.
1266        let arm = for_font(15).unwrap();
1267        assert_eq!(arm.encode_str("Բարեւ"), [0xB4, 0xB3, 0xF1, 0xBB, 0xF5]);
1268        assert_eq!(for_font(7).unwrap().decode(0xC4), '─');
1269        // The C64's screen codes, either set, and reversed.
1270        let up = screen_codes(32).unwrap();
1271        assert_eq!((up.decode(0x08), up.decode(0x88), up.decode(0x41)), ('H', 'H', '\u{2660}'));
1272        let low = screen_codes(33).unwrap();
1273        assert_eq!((low.decode(0x08), low.decode(0x48)), ('h', 'H'));
1274        let by = for_font(31).unwrap();
1275        assert_eq!(by.encode_str("Ўў"), [0xF6, 0xF7]);
1276    }
1277}