xref: /webtrees/app/Encodings/UTF8.php (revision b11cdcd45131b1585d66693fab363cfeb18c51a4)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * 'Copyright (C) 2023 webtrees development team
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
18declare(strict_types=1);
19
20namespace Fisharebest\Webtrees\Encodings;
21
22use InvalidArgumentException;
23
24use function chr;
25use function mb_substitute_character;
26
27/**
28 * Convert between (potentially invalid) UTF-8 and UTF-8.
29 */
30class UTF8 extends AbstractEncoding
31{
32    public const NAME = 'UTF-8';
33
34    public const START_OF_STRING                                       = "\u{0098}";
35    public const STRING_TERMINATOR                                     = "\u{009C}";
36    public const NO_BREAK_SPACE                                        = "\u{00A0}";
37    public const INVERTED_EXCLAMATION_MARK                             = "\u{00A1}";
38    public const CENT_SIGN                                             = "\u{00A2}";
39    public const POUND_SIGN                                            = "\u{00A3}";
40    public const CURRENCY_SIGN                                         = "\u{00A4}";
41    public const YEN_SIGN                                              = "\u{00A5}";
42    public const BROKEN_BAR                                            = "\u{00A6}";
43    public const SECTION_SIGN                                          = "\u{00A7}";
44    public const DIAERESIS                                             = "\u{00A8}";
45    public const COPYRIGHT_SIGN                                        = "\u{00A9}";
46    public const FEMININE_ORDINAL_INDICATOR                            = "\u{00AA}";
47    public const LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK             = "\u{00AB}";
48    public const NOT_SIGN                                              = "\u{00AC}";
49    public const SOFT_HYPHEN                                           = "\u{00AD}";
50    public const REGISTERED_SIGN                                       = "\u{00AE}";
51    public const MACRON                                                = "\u{00AF}";
52    public const DEGREE_SIGN                                           = "\u{00B0}";
53    public const PLUS_MINUS_SIGN                                       = "\u{00B1}";
54    public const SUPERSCRIPT_TWO                                       = "\u{00B2}";
55    public const SUPERSCRIPT_THREE                                     = "\u{00B3}";
56    public const ACUTE_ACCENT                                          = "\u{00B4}";
57    public const MICRO_SIGN                                            = "\u{00B5}";
58    public const PILCROW_SIGN                                          = "\u{00B6}";
59    public const MIDDLE_DOT                                            = "\u{00B7}";
60    public const CEDILLA                                               = "\u{00B8}";
61    public const SUPERSCRIPT_ONE                                       = "\u{00B9}";
62    public const MASCULINE_ORDINAL_INDICATOR                           = "\u{00BA}";
63    public const RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK            = "\u{00BB}";
64    public const VULGAR_FRACTION_ONE_QUARTER                           = "\u{00BC}";
65    public const VULGAR_FRACTION_ONE_HALF                              = "\u{00BD}";
66    public const VULGAR_FRACTION_THREE_QUARTERS                        = "\u{00BE}";
67    public const INVERTED_QUESTION_MARK                                = "\u{00BF}";
68    public const LATIN_CAPITAL_LETTER_A_WITH_GRAVE                     = "\u{00C0}";
69    public const LATIN_CAPITAL_LETTER_A_WITH_ACUTE                     = "\u{00C1}";
70    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX                = "\u{00C2}";
71    public const LATIN_CAPITAL_LETTER_A_WITH_TILDE                     = "\u{00C3}";
72    public const LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS                 = "\u{00C4}";
73    public const LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE                = "\u{00C5}";
74    public const LATIN_CAPITAL_LETTER_AE                               = "\u{00C6}";
75    public const LATIN_CAPITAL_LETTER_C_WITH_CEDILLA                   = "\u{00C7}";
76    public const LATIN_CAPITAL_LETTER_E_WITH_GRAVE                     = "\u{00C8}";
77    public const LATIN_CAPITAL_LETTER_E_WITH_ACUTE                     = "\u{00C9}";
78    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX                = "\u{00CA}";
79    public const LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS                 = "\u{00CB}";
80    public const LATIN_CAPITAL_LETTER_I_WITH_GRAVE                     = "\u{00CC}";
81    public const LATIN_CAPITAL_LETTER_I_WITH_ACUTE                     = "\u{00CD}";
82    public const LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX                = "\u{00CE}";
83    public const LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS                 = "\u{00CF}";
84    public const LATIN_CAPITAL_LETTER_ETH                              = "\u{00D0}";
85    public const LATIN_CAPITAL_LETTER_N_WITH_TILDE                     = "\u{00D1}";
86    public const LATIN_CAPITAL_LETTER_O_WITH_GRAVE                     = "\u{00D2}";
87    public const LATIN_CAPITAL_LETTER_O_WITH_ACUTE                     = "\u{00D3}";
88    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX                = "\u{00D4}";
89    public const LATIN_CAPITAL_LETTER_O_WITH_TILDE                     = "\u{00D5}";
90    public const LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS                 = "\u{00D6}";
91    public const MULTIPLICATION_SIGN                                   = "\u{00D7}";
92    public const LATIN_CAPITAL_LETTER_O_WITH_STROKE                    = "\u{00D8}";
93    public const LATIN_CAPITAL_LETTER_U_WITH_GRAVE                     = "\u{00D9}";
94    public const LATIN_CAPITAL_LETTER_U_WITH_ACUTE                     = "\u{00DA}";
95    public const LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX                = "\u{00DB}";
96    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS                 = "\u{00DC}";
97    public const LATIN_CAPITAL_LETTER_Y_WITH_ACUTE                     = "\u{00DD}";
98    public const LATIN_CAPITAL_LETTER_THORN                            = "\u{00DE}";
99    public const LATIN_SMALL_LETTER_SHARP_S                            = "\u{00DF}";
100    public const LATIN_SMALL_LETTER_A_WITH_GRAVE                       = "\u{00E0}";
101    public const LATIN_SMALL_LETTER_A_WITH_ACUTE                       = "\u{00E1}";
102    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX                  = "\u{00E2}";
103    public const LATIN_SMALL_LETTER_A_WITH_TILDE                       = "\u{00E3}";
104    public const LATIN_SMALL_LETTER_A_WITH_DIAERESIS                   = "\u{00E4}";
105    public const LATIN_SMALL_LETTER_A_WITH_RING_ABOVE                  = "\u{00E5}";
106    public const LATIN_SMALL_LETTER_AE                                 = "\u{00E6}";
107    public const LATIN_SMALL_LETTER_C_WITH_CEDILLA                     = "\u{00E7}";
108    public const LATIN_SMALL_LETTER_E_WITH_GRAVE                       = "\u{00E8}";
109    public const LATIN_SMALL_LETTER_E_WITH_ACUTE                       = "\u{00E9}";
110    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX                  = "\u{00EA}";
111    public const LATIN_SMALL_LETTER_E_WITH_DIAERESIS                   = "\u{00EB}";
112    public const LATIN_SMALL_LETTER_I_WITH_GRAVE                       = "\u{00EC}";
113    public const LATIN_SMALL_LETTER_I_WITH_ACUTE                       = "\u{00ED}";
114    public const LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX                  = "\u{00EE}";
115    public const LATIN_SMALL_LETTER_I_WITH_DIAERESIS                   = "\u{00EF}";
116    public const LATIN_SMALL_LETTER_ETH                                = "\u{00F0}";
117    public const LATIN_SMALL_LETTER_N_WITH_TILDE                       = "\u{00F1}";
118    public const LATIN_SMALL_LETTER_O_WITH_GRAVE                       = "\u{00F2}";
119    public const LATIN_SMALL_LETTER_O_WITH_ACUTE                       = "\u{00F3}";
120    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX                  = "\u{00F4}";
121    public const LATIN_SMALL_LETTER_O_WITH_TILDE                       = "\u{00F5}";
122    public const LATIN_SMALL_LETTER_O_WITH_DIAERESIS                   = "\u{00F6}";
123    public const DIVISION_SIGN                                         = "\u{00F7}";
124    public const LATIN_SMALL_LETTER_O_WITH_STROKE                      = "\u{00F8}";
125    public const LATIN_SMALL_LETTER_U_WITH_GRAVE                       = "\u{00F9}";
126    public const LATIN_SMALL_LETTER_U_WITH_ACUTE                       = "\u{00FA}";
127    public const LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX                  = "\u{00FB}";
128    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS                   = "\u{00FC}";
129    public const LATIN_SMALL_LETTER_Y_WITH_ACUTE                       = "\u{00FD}";
130    public const LATIN_SMALL_LETTER_THORN                              = "\u{00FE}";
131    public const LATIN_SMALL_LETTER_Y_WITH_DIAERESIS                   = "\u{00FF}";
132    public const LATIN_CAPITAL_LETTER_A_WITH_MACRON                    = "\u{0100}";
133    public const LATIN_SMALL_LETTER_A_WITH_MACRON                      = "\u{0101}";
134    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE                     = "\u{0102}";
135    public const LATIN_SMALL_LETTER_A_WITH_BREVE                       = "\u{0103}";
136    public const LATIN_CAPITAL_LETTER_A_WITH_OGONEK                    = "\u{0104}";
137    public const LATIN_SMALL_LETTER_A_WITH_OGONEK                      = "\u{0105}";
138    public const LATIN_CAPITAL_LETTER_C_WITH_ACUTE                     = "\u{0106}";
139    public const LATIN_SMALL_LETTER_C_WITH_ACUTE                       = "\u{0107}";
140    public const LATIN_CAPITAL_LETTER_C_WITH_CIRCUMFLEX                = "\u{0108}";
141    public const LATIN_SMALL_LETTER_C_WITH_CIRCUMFLEX                  = "\u{0109}";
142    public const LATIN_CAPITAL_LETTER_C_WITH_DOT_ABOVE                 = "\u{010A}";
143    public const LATIN_SMALL_LETTER_C_WITH_DOT_ABOVE                   = "\u{010B}";
144    public const LATIN_CAPITAL_LETTER_C_WITH_CARON                     = "\u{010C}";
145    public const LATIN_SMALL_LETTER_C_WITH_CARON                       = "\u{010D}";
146    public const LATIN_CAPITAL_LETTER_D_WITH_CARON                     = "\u{010E}";
147    public const LATIN_SMALL_LETTER_D_WITH_CARON                       = "\u{010F}";
148    public const LATIN_CAPITAL_LETTER_D_WITH_STROKE                    = "\u{0110}";
149    public const LATIN_SMALL_LETTER_D_WITH_STROKE                      = "\u{0111}";
150    public const LATIN_CAPITAL_LETTER_E_WITH_MACRON                    = "\u{0112}";
151    public const LATIN_SMALL_LETTER_E_WITH_MACRON                      = "\u{0113}";
152    public const LATIN_CAPITAL_LETTER_E_WITH_BREVE                     = "\u{0114}";
153    public const LATIN_SMALL_LETTER_E_WITH_BREVE                       = "\u{0115}";
154    public const LATIN_CAPITAL_LETTER_E_WITH_DOT_ABOVE                 = "\u{0116}";
155    public const LATIN_SMALL_LETTER_E_WITH_DOT_ABOVE                   = "\u{0117}";
156    public const LATIN_CAPITAL_LETTER_E_WITH_OGONEK                    = "\u{0118}";
157    public const LATIN_SMALL_LETTER_E_WITH_OGONEK                      = "\u{0119}";
158    public const LATIN_CAPITAL_LETTER_E_WITH_CARON                     = "\u{011A}";
159    public const LATIN_SMALL_LETTER_E_WITH_CARON                       = "\u{011B}";
160    public const LATIN_CAPITAL_LETTER_G_WITH_CIRCUMFLEX                = "\u{011C}";
161    public const LATIN_SMALL_LETTER_G_WITH_CIRCUMFLEX                  = "\u{011D}";
162    public const LATIN_CAPITAL_LETTER_G_WITH_BREVE                     = "\u{011E}";
163    public const LATIN_SMALL_LETTER_G_WITH_BREVE                       = "\u{011F}";
164    public const LATIN_CAPITAL_LETTER_G_WITH_DOT_ABOVE                 = "\u{0120}";
165    public const LATIN_SMALL_LETTER_G_WITH_DOT_ABOVE                   = "\u{0121}";
166    public const LATIN_CAPITAL_LETTER_G_WITH_CEDILLA                   = "\u{0122}";
167    public const LATIN_SMALL_LETTER_G_WITH_CEDILLA                     = "\u{0123}";
168    public const LATIN_CAPITAL_LETTER_H_WITH_CIRCUMFLEX                = "\u{0124}";
169    public const LATIN_SMALL_LETTER_H_WITH_CIRCUMFLEX                  = "\u{0125}";
170    public const LATIN_CAPITAL_LETTER_H_WITH_STROKE                    = "\u{0126}";
171    public const LATIN_SMALL_LETTER_H_WITH_STROKE                      = "\u{0127}";
172    public const LATIN_CAPITAL_LETTER_I_WITH_TILDE                     = "\u{0128}";
173    public const LATIN_SMALL_LETTER_I_WITH_TILDE                       = "\u{0129}";
174    public const LATIN_CAPITAL_LETTER_I_WITH_MACRON                    = "\u{012A}";
175    public const LATIN_SMALL_LETTER_I_WITH_MACRON                      = "\u{012B}";
176    public const LATIN_CAPITAL_LETTER_I_WITH_BREVE                     = "\u{012C}";
177    public const LATIN_SMALL_LETTER_I_WITH_BREVE                       = "\u{012D}";
178    public const LATIN_CAPITAL_LETTER_I_WITH_OGONEK                    = "\u{012E}";
179    public const LATIN_SMALL_LETTER_I_WITH_OGONEK                      = "\u{012F}";
180    public const LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE                 = "\u{0130}";
181    public const LATIN_SMALL_LETTER_DOTLESS_I                          = "\u{0131}";
182    public const LATIN_CAPITAL_LIGATURE_IJ                             = "\u{0132}";
183    public const LATIN_SMALL_LIGATURE_IJ                               = "\u{0133}";
184    public const LATIN_CAPITAL_LETTER_J_WITH_CIRCUMFLEX                = "\u{0134}";
185    public const LATIN_SMALL_LETTER_J_WITH_CIRCUMFLEX                  = "\u{0135}";
186    public const LATIN_CAPITAL_LETTER_K_WITH_CEDILLA                   = "\u{0136}";
187    public const LATIN_SMALL_LETTER_K_WITH_CEDILLA                     = "\u{0137}";
188    public const LATIN_SMALL_LETTER_KRA                                = "\u{0138}";
189    public const LATIN_CAPITAL_LETTER_L_WITH_ACUTE                     = "\u{0139}";
190    public const LATIN_SMALL_LETTER_L_WITH_ACUTE                       = "\u{013A}";
191    public const LATIN_CAPITAL_LETTER_L_WITH_CEDILLA                   = "\u{013B}";
192    public const LATIN_SMALL_LETTER_L_WITH_CEDILLA                     = "\u{013C}";
193    public const LATIN_CAPITAL_LETTER_L_WITH_CARON                     = "\u{013D}";
194    public const LATIN_SMALL_LETTER_L_WITH_CARON                       = "\u{013E}";
195    public const LATIN_CAPITAL_LETTER_L_WITH_MIDDLE_DOT                = "\u{013F}";
196    public const LATIN_SMALL_LETTER_L_WITH_MIDDLE_DOT                  = "\u{0140}";
197    public const LATIN_CAPITAL_LETTER_L_WITH_STROKE                    = "\u{0141}";
198    public const LATIN_SMALL_LETTER_L_WITH_STROKE                      = "\u{0142}";
199    public const LATIN_CAPITAL_LETTER_N_WITH_ACUTE                     = "\u{0143}";
200    public const LATIN_SMALL_LETTER_N_WITH_ACUTE                       = "\u{0144}";
201    public const LATIN_CAPITAL_LETTER_N_WITH_CEDILLA                   = "\u{0145}";
202    public const LATIN_SMALL_LETTER_N_WITH_CEDILLA                     = "\u{0146}";
203    public const LATIN_CAPITAL_LETTER_N_WITH_CARON                     = "\u{0147}";
204    public const LATIN_SMALL_LETTER_N_WITH_CARON                       = "\u{0148}";
205    public const LATIN_SMALL_LETTER_N_PRECEDED_BY_APOSTROPHE           = "\u{0149}";
206    public const LATIN_CAPITAL_LETTER_ENG                              = "\u{014A}";
207    public const LATIN_SMALL_LETTER_ENG                                = "\u{014B}";
208    public const LATIN_CAPITAL_LETTER_O_WITH_MACRON                    = "\u{014C}";
209    public const LATIN_SMALL_LETTER_O_WITH_MACRON                      = "\u{014D}";
210    public const LATIN_CAPITAL_LETTER_O_WITH_BREVE                     = "\u{014E}";
211    public const LATIN_SMALL_LETTER_O_WITH_BREVE                       = "\u{014F}";
212    public const LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_ACUTE              = "\u{0150}";
213    public const LATIN_SMALL_LETTER_O_WITH_DOUBLE_ACUTE                = "\u{0151}";
214    public const LATIN_CAPITAL_LIGATURE_OE                             = "\u{0152}";
215    public const LATIN_SMALL_LIGATURE_OE                               = "\u{0153}";
216    public const LATIN_CAPITAL_LETTER_R_WITH_ACUTE                     = "\u{0154}";
217    public const LATIN_SMALL_LETTER_R_WITH_ACUTE                       = "\u{0155}";
218    public const LATIN_CAPITAL_LETTER_R_WITH_CEDILLA                   = "\u{0156}";
219    public const LATIN_SMALL_LETTER_R_WITH_CEDILLA                     = "\u{0157}";
220    public const LATIN_CAPITAL_LETTER_R_WITH_CARON                     = "\u{0158}";
221    public const LATIN_SMALL_LETTER_R_WITH_CARON                       = "\u{0159}";
222    public const LATIN_CAPITAL_LETTER_S_WITH_ACUTE                     = "\u{015A}";
223    public const LATIN_SMALL_LETTER_S_WITH_ACUTE                       = "\u{015B}";
224    public const LATIN_CAPITAL_LETTER_S_WITH_CIRCUMFLEX                = "\u{015C}";
225    public const LATIN_SMALL_LETTER_S_WITH_CIRCUMFLEX                  = "\u{015D}";
226    public const LATIN_CAPITAL_LETTER_S_WITH_CEDILLA                   = "\u{015E}";
227    public const LATIN_SMALL_LETTER_S_WITH_CEDILLA                     = "\u{015F}";
228    public const LATIN_CAPITAL_LETTER_S_WITH_CARON                     = "\u{0160}";
229    public const LATIN_SMALL_LETTER_S_WITH_CARON                       = "\u{0161}";
230    public const LATIN_CAPITAL_LETTER_T_WITH_CEDILLA                   = "\u{0162}";
231    public const LATIN_SMALL_LETTER_T_WITH_CEDILLA                     = "\u{0163}";
232    public const LATIN_CAPITAL_LETTER_T_WITH_CARON                     = "\u{0164}";
233    public const LATIN_SMALL_LETTER_T_WITH_CARON                       = "\u{0165}";
234    public const LATIN_CAPITAL_LETTER_T_WITH_STROKE                    = "\u{0166}";
235    public const LATIN_SMALL_LETTER_T_WITH_STROKE                      = "\u{0167}";
236    public const LATIN_CAPITAL_LETTER_U_WITH_TILDE                     = "\u{0168}";
237    public const LATIN_SMALL_LETTER_U_WITH_TILDE                       = "\u{0169}";
238    public const LATIN_CAPITAL_LETTER_U_WITH_MACRON                    = "\u{016A}";
239    public const LATIN_SMALL_LETTER_U_WITH_MACRON                      = "\u{016B}";
240    public const LATIN_CAPITAL_LETTER_U_WITH_BREVE                     = "\u{016C}";
241    public const LATIN_SMALL_LETTER_U_WITH_BREVE                       = "\u{016D}";
242    public const LATIN_CAPITAL_LETTER_U_WITH_RING_ABOVE                = "\u{016E}";
243    public const LATIN_SMALL_LETTER_U_WITH_RING_ABOVE                  = "\u{016F}";
244    public const LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_ACUTE              = "\u{0170}";
245    public const LATIN_SMALL_LETTER_U_WITH_DOUBLE_ACUTE                = "\u{0171}";
246    public const LATIN_CAPITAL_LETTER_U_WITH_OGONEK                    = "\u{0172}";
247    public const LATIN_SMALL_LETTER_U_WITH_OGONEK                      = "\u{0173}";
248    public const LATIN_CAPITAL_LETTER_W_WITH_CIRCUMFLEX                = "\u{0174}";
249    public const LATIN_SMALL_LETTER_W_WITH_CIRCUMFLEX                  = "\u{0175}";
250    public const LATIN_CAPITAL_LETTER_Y_WITH_CIRCUMFLEX                = "\u{0176}";
251    public const LATIN_SMALL_LETTER_Y_WITH_CIRCUMFLEX                  = "\u{0177}";
252    public const LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS                 = "\u{0178}";
253    public const LATIN_CAPITAL_LETTER_Z_WITH_ACUTE                     = "\u{0179}";
254    public const LATIN_SMALL_LETTER_Z_WITH_ACUTE                       = "\u{017A}";
255    public const LATIN_CAPITAL_LETTER_Z_WITH_DOT_ABOVE                 = "\u{017B}";
256    public const LATIN_SMALL_LETTER_Z_WITH_DOT_ABOVE                   = "\u{017C}";
257    public const LATIN_CAPITAL_LETTER_Z_WITH_CARON                     = "\u{017D}";
258    public const LATIN_SMALL_LETTER_Z_WITH_CARON                       = "\u{017E}";
259    public const LATIN_SMALL_LETTER_LONG_S                             = "\u{017F}";
260    public const LATIN_SMALL_LETTER_B_WITH_STROKE                      = "\u{0180}";
261    public const LATIN_CAPITAL_LETTER_B_WITH_HOOK                      = "\u{0181}";
262    public const LATIN_CAPITAL_LETTER_B_WITH_TOPBAR                    = "\u{0182}";
263    public const LATIN_SMALL_LETTER_B_WITH_TOPBAR                      = "\u{0183}";
264    public const LATIN_CAPITAL_LETTER_F_WITH_HOOK                      = "\u{0191}";
265    public const LATIN_SMALL_LETTER_F_WITH_HOOK                        = "\u{0192}";
266    public const LATIN_SMALL_LETTER_O_WITH_HORN                        = "\u{01A1}";
267    public const LATIN_CAPITAL_LETTER_O_WITH_HORN                      = "\u{01A0}";
268    public const LATIN_CAPITAL_LETTER_U_WITH_HORN                      = "\u{01AF}";
269    public const LATIN_SMALL_LETTER_U_WITH_HORN                        = "\u{01B0}";
270    public const LATIN_CAPITAL_LETTER_A_WITH_CARON                     = "\u{01CD}";
271    public const LATIN_SMALL_LETTER_A_WITH_CARON                       = "\u{01CE}";
272    public const LATIN_CAPITAL_LETTER_I_WITH_CARON                     = "\u{01CF}";
273    public const LATIN_SMALL_LETTER_I_WITH_CARON                       = "\u{01D0}";
274    public const LATIN_CAPITAL_LETTER_O_WITH_CARON                     = "\u{01D1}";
275    public const LATIN_SMALL_LETTER_O_WITH_CARON                       = "\u{01D2}";
276    public const LATIN_CAPITAL_LETTER_U_WITH_CARON                     = "\u{01D3}";
277    public const LATIN_SMALL_LETTER_U_WITH_CARON                       = "\u{01D4}";
278    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_MACRON      = "\u{01D5}";
279    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_MACRON        = "\u{01D6}";
280    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_ACUTE       = "\u{01D7}";
281    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_ACUTE         = "\u{01D8}";
282    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_CARON       = "\u{01D9}";
283    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_CARON         = "\u{01DA}";
284    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_GRAVE       = "\u{01DB}";
285    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_GRAVE         = "\u{01DC}";
286    public const LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS_AND_MACRON      = "\u{01DE}";
287    public const LATIN_SMALL_LETTER_A_WITH_DIAERESIS_AND_MACRON        = "\u{01DF}";
288    public const LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON      = "\u{01E0}";
289    public const LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON        = "\u{01E1}";
290    public const LATIN_CAPITAL_LETTER_AE_WITH_MACRON                   = "\u{01E2}";
291    public const LATIN_SMALL_LETTER_AE_WITH_MACRON                     = "\u{01E3}";
292    public const LATIN_CAPITAL_LETTER_G_WITH_CARON                     = "\u{01E6}";
293    public const LATIN_SMALL_LETTER_G_WITH_CARON                       = "\u{01E7}";
294    public const LATIN_CAPITAL_LETTER_K_WITH_CARON                     = "\u{01E8}";
295    public const LATIN_SMALL_LETTER_K_WITH_CARON                       = "\u{01E9}";
296    public const LATIN_CAPITAL_LETTER_O_WITH_OGONEK                    = "\u{01EA}";
297    public const LATIN_SMALL_LETTER_O_WITH_OGONEK                      = "\u{01EB}";
298    public const LATIN_CAPITAL_LETTER_O_WITH_OGONEK_AND_MACRON         = "\u{01EC}";
299    public const LATIN_SMALL_LETTER_O_WITH_OGONEK_AND_MACRON           = "\u{01ED}";
300    public const LATIN_SMALL_LETTER_J_WITH_CARON                       = "\u{01F0}";
301    public const LATIN_CAPITAL_LETTER_G_WITH_ACUTE                     = "\u{01F4}";
302    public const LATIN_SMALL_LETTER_G_WITH_ACUTE                       = "\u{01F5}";
303    public const LATIN_CAPITAL_LETTER_N_WITH_GRAVE                     = "\u{01F8}";
304    public const LATIN_SMALL_LETTER_N_WITH_GRAVE                       = "\u{01F9}";
305    public const LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE      = "\u{01FA}";
306    public const LATIN_SMALL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE        = "\u{01FB}";
307    public const LATIN_CAPITAL_LETTER_AE_WITH_ACUTE                    = "\u{01FC}";
308    public const LATIN_SMALL_LETTER_AE_WITH_ACUTE                      = "\u{01FD}";
309    public const LATIN_CAPITAL_LETTER_O_WITH_STROKE_AND_ACUTE          = "\u{01FE}";
310    public const LATIN_SMALL_LETTER_O_WITH_STROKE_AND_ACUTE            = "\u{01FF}";
311    public const LATIN_CAPITAL_LETTER_S_WITH_COMMA_BELOW               = "\u{0218}";
312    public const LATIN_SMALL_LETTER_S_WITH_COMMA_BELOW                 = "\u{0219}";
313    public const LATIN_CAPITAL_LETTER_T_WITH_COMMA_BELOW               = "\u{021A}";
314    public const LATIN_SMALL_LETTER_T_WITH_COMMA_BELOW                 = "\u{021B}";
315    public const LATIN_CAPITAL_LETTER_H_WITH_CARON                     = "\u{021E}";
316    public const LATIN_SMALL_LETTER_H_WITH_CARON                       = "\u{021F}";
317    public const LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE                 = "\u{0226}";
318    public const LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE                   = "\u{0227}";
319    public const LATIN_CAPITAL_LETTER_E_WITH_CEDILLA                   = "\u{0228}";
320    public const LATIN_SMALL_LETTER_E_WITH_CEDILLA                     = "\u{0229}";
321    public const LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS_AND_MACRON      = "\u{022A}";
322    public const LATIN_SMALL_LETTER_O_WITH_DIAERESIS_AND_MACRON        = "\u{022B}";
323    public const LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_MACRON          = "\u{022C}";
324    public const LATIN_SMALL_LETTER_O_WITH_TILDE_AND_MACRON            = "\u{022D}";
325    public const LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE                 = "\u{022E}";
326    public const LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE                   = "\u{022F}";
327    public const LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON      = "\u{0230}";
328    public const LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON        = "\u{0231}";
329    public const LATIN_CAPITAL_LETTER_Y_WITH_MACRON                    = "\u{0232}";
330    public const LATIN_SMALL_LETTER_Y_WITH_MACRON                      = "\u{0233}";
331    public const MODIFIER_LETTER_PRIME                                 = "\u{02B9}";
332    public const MODIFIER_LETTER_DOUBLE_PRIME                          = "\u{02BA}";
333    public const MODIFIER_LETTER_TURNED_COMMA                          = "\u{02BB}";
334    public const MODIFIER_LETTER_APOSTROPHE                            = "\u{02BC}";
335    public const MODIFIER_LETTER_CIRCUMFLEX_ACCENT                     = "\u{02C6}";
336    public const CARON                                                 = "\u{02C7}";
337    public const BREVE                                                 = "\u{02D8}";
338    public const DOT_ABOVE                                             = "\u{02D9}";
339    public const RING_ABOVE                                            = "\u{02DA}";
340    public const OGONEK                                                = "\u{02DB}";
341    public const SMALL_TILDE                                           = "\u{02DC}";
342    public const DOUBLE_ACUTE_ACCENT                                   = "\u{02DD}";
343    public const COMBINING_GRAVE_ACCENT                                = "\u{0300}";
344    public const COMBINING_ACUTE_ACCENT                                = "\u{0301}";
345    public const COMBINING_CIRCUMFLEX_ACCENT                           = "\u{0302}";
346    public const COMBINING_TILDE                                       = "\u{0303}";
347    public const COMBINING_MACRON                                      = "\u{0304}";
348    public const COMBINING_OVERLINE                                    = "\u{0305}";
349    public const COMBINING_BREVE                                       = "\u{0306}";
350    public const COMBINING_DOT_ABOVE                                   = "\u{0307}";
351    public const COMBINING_DIAERESIS                                   = "\u{0308}";
352    public const COMBINING_HOOK_ABOVE                                  = "\u{0309}";
353    public const COMBINING_RING_ABOVE                                  = "\u{030A}";
354    public const COMBINING_DOUBLE_ACUTE_ACCENT                         = "\u{030B}";
355    public const COMBINING_CARON                                       = "\u{030C}";
356    public const COMBINING_CANDRABINDU                                 = "\u{0310}";
357    public const COMBINING_COMMA_ABOVE                                 = "\u{0313}";
358    public const COMBINING_COMMA_ABOVE_RIGHT                           = "\u{0315}";
359    public const COMBINING_HORN                                        = "\u{031B}";
360    public const COMBINING_LEFT_HALF_RING_BELOW                        = "\u{031C}";
361    public const COMBINING_DOT_BELOW                                   = "\u{0323}";
362    public const COMBINING_DIAERESIS_BELOW                             = "\u{0324}";
363    public const COMBINING_RING_BELOW                                  = "\u{0325}";
364    public const COMBINING_COMMA_BELOW                                 = "\u{0326}";
365    public const COMBINING_CEDILLA                                     = "\u{0327}";
366    public const COMBINING_OGONEK                                      = "\u{0328}";
367    public const COMBINING_BRIDGE_BELOW                                = "\u{032A}";
368    public const COMBINING_BREVE_BELOW                                 = "\u{032E}";
369    public const COMBINING_LOW_LINE                                    = "\u{0332}";
370    public const COMBINING_DOUBLE_LOW_LINE                             = "\u{0333}";
371    public const COMBINING_SHORT_STROKE_OVERLAY                        = "\u{0335}";
372    public const COMBINING_LONG_STROKE_OVERLAY                         = "\u{0336}";
373    public const COMBINING_SHORT_SOLIDUS_OVERLAY                       = "\u{0338}";
374    public const COMBINING_LONG_SOLIDUS_OVERLAY                        = "\u{0338}";
375    public const COMBINING_DOUBLE_TILDE                                = "\u{0360}";
376    public const COMBINING_DOUBLE_INVERTED_BREVE                       = "\u{0361}";
377    public const GREEK_CAPITAL_LETTER_GAMMA                            = "\u{0393}";
378    public const GREEK_CAPITAL_LETTER_THETA                            = "\u{0398}";
379    public const GREEK_CAPITAL_LETTER_SIGMA                            = "\u{03A3}";
380    public const GREEK_CAPITAL_LETTER_PHI                              = "\u{03A6}";
381    public const GREEK_CAPITAL_LETTER_OMEGA                            = "\u{03A9}";
382    public const GREEK_SMALL_LETTER_ALPHA                              = "\u{03B1}";
383    public const GREEK_SMALL_LETTER_DELTA                              = "\u{03B4}";
384    public const GREEK_SMALL_LETTER_EPSILON                            = "\u{03B5}";
385    public const GREEK_SMALL_LETTER_PI                                 = "\u{03C0}";
386    public const GREEK_SMALL_LETTER_SIGMA                              = "\u{03C3}";
387    public const GREEK_SMALL_LETTER_TAU                                = "\u{03C4}";
388    public const GREEK_SMALL_LETTER_PHI                                = "\u{03C6}";
389    public const CYRILLIC_CAPITAL_LETTER_IO                            = "\u{0401}";
390    public const CYRILLIC_CAPITAL_LETTER_DJE                           = "\u{0402}";
391    public const CYRILLIC_CAPITAL_LETTER_GJE                           = "\u{0403}";
392    public const CYRILLIC_CAPITAL_LETTER_UKRANIAN_IE                   = "\u{0404}";
393    public const CYRILLIC_CAPITAL_LETTER_DZE                           = "\u{0405}";
394    public const CYRILLIC_CAPITAL_LETTER_BYELORUSSIAN_UKRAINIAN_I      = "\u{0406}";
395    public const CYRILLIC_CAPITAL_LETTER_YI                            = "\u{0407}";
396    public const CYRILLIC_CAPITAL_LETTER_JE                            = "\u{0408}";
397    public const CYRILLIC_CAPITAL_LETTER_LJE                           = "\u{0409}";
398    public const CYRILLIC_CAPITAL_LETTER_NJE                           = "\u{040A}";
399    public const CYRILLIC_CAPITAL_LETTER_TSHE                          = "\u{040B}";
400    public const CYRILLIC_CAPITAL_LETTER_KJE                           = "\u{040C}";
401    public const CYRILLIC_CAPITAL_LETTER_SHORT_U                       = "\u{040E}";
402    public const CYRILLIC_CAPITAL_LETTER_DZHE                          = "\u{040F}";
403    public const CYRILLIC_CAPITAL_LETTER_A                             = "\u{0410}";
404    public const CYRILLIC_CAPITAL_LETTER_BE                            = "\u{0411}";
405    public const CYRILLIC_CAPITAL_LETTER_VE                            = "\u{0412}";
406    public const CYRILLIC_CAPITAL_LETTER_GHE                           = "\u{0413}";
407    public const CYRILLIC_CAPITAL_LETTER_DE                            = "\u{0414}";
408    public const CYRILLIC_CAPITAL_LETTER_IE                            = "\u{0415}";
409    public const CYRILLIC_CAPITAL_LETTER_ZHE                           = "\u{0416}";
410    public const CYRILLIC_CAPITAL_LETTER_ZE                            = "\u{0417}";
411    public const CYRILLIC_CAPITAL_LETTER_I                             = "\u{0418}";
412    public const CYRILLIC_CAPITAL_LETTER_SHORT_I                       = "\u{0419}";
413    public const CYRILLIC_CAPITAL_LETTER_KA                            = "\u{041A}";
414    public const CYRILLIC_CAPITAL_LETTER_EL                            = "\u{041B}";
415    public const CYRILLIC_CAPITAL_LETTER_EM                            = "\u{041C}";
416    public const CYRILLIC_CAPITAL_LETTER_EN                            = "\u{041D}";
417    public const CYRILLIC_CAPITAL_LETTER_O                             = "\u{041E}";
418    public const CYRILLIC_CAPITAL_LETTER_PE                            = "\u{041F}";
419    public const CYRILLIC_CAPITAL_LETTER_ER                            = "\u{0420}";
420    public const CYRILLIC_CAPITAL_LETTER_ES                            = "\u{0421}";
421    public const CYRILLIC_CAPITAL_LETTER_TE                            = "\u{0422}";
422    public const CYRILLIC_CAPITAL_LETTER_U                             = "\u{0423}";
423    public const CYRILLIC_CAPITAL_LETTER_EF                            = "\u{0424}";
424    public const CYRILLIC_CAPITAL_LETTER_HA                            = "\u{0425}";
425    public const CYRILLIC_CAPITAL_LETTER_TSE                           = "\u{0426}";
426    public const CYRILLIC_CAPITAL_LETTER_CHE                           = "\u{0427}";
427    public const CYRILLIC_CAPITAL_LETTER_SHA                           = "\u{0428}";
428    public const CYRILLIC_CAPITAL_LETTER_SHCHA                         = "\u{0429}";
429    public const CYRILLIC_CAPITAL_LETTER_HARD_SIGN                     = "\u{042A}";
430    public const CYRILLIC_CAPITAL_LETTER_YERU                          = "\u{042B}";
431    public const CYRILLIC_CAPITAL_LETTER_SOFT_SIGN                     = "\u{042C}";
432    public const CYRILLIC_CAPITAL_LETTER_E                             = "\u{042D}";
433    public const CYRILLIC_CAPITAL_LETTER_YU                            = "\u{042E}";
434    public const CYRILLIC_CAPITAL_LETTER_YA                            = "\u{042F}";
435    public const CYRILLIC_SMALL_LETTER_A                               = "\u{0430}";
436    public const CYRILLIC_SMALL_LETTER_BE                              = "\u{0431}";
437    public const CYRILLIC_SMALL_LETTER_VE                              = "\u{0432}";
438    public const CYRILLIC_SMALL_LETTER_GHE                             = "\u{0433}";
439    public const CYRILLIC_SMALL_LETTER_DE                              = "\u{0434}";
440    public const CYRILLIC_SMALL_LETTER_IE                              = "\u{0435}";
441    public const CYRILLIC_SMALL_LETTER_ZHE                             = "\u{0436}";
442    public const CYRILLIC_SMALL_LETTER_ZE                              = "\u{0437}";
443    public const CYRILLIC_SMALL_LETTER_I                               = "\u{0438}";
444    public const CYRILLIC_SMALL_LETTER_SHORT_I                         = "\u{0439}";
445    public const CYRILLIC_SMALL_LETTER_KA                              = "\u{043A}";
446    public const CYRILLIC_SMALL_LETTER_EL                              = "\u{043B}";
447    public const CYRILLIC_SMALL_LETTER_EM                              = "\u{043C}";
448    public const CYRILLIC_SMALL_LETTER_EN                              = "\u{043D}";
449    public const CYRILLIC_SMALL_LETTER_O                               = "\u{043E}";
450    public const CYRILLIC_SMALL_LETTER_PE                              = "\u{043F}";
451    public const CYRILLIC_SMALL_LETTER_ER                              = "\u{0440}";
452    public const CYRILLIC_SMALL_LETTER_ES                              = "\u{0441}";
453    public const CYRILLIC_SMALL_LETTER_TE                              = "\u{0442}";
454    public const CYRILLIC_SMALL_LETTER_U                               = "\u{0443}";
455    public const CYRILLIC_SMALL_LETTER_EF                              = "\u{0444}";
456    public const CYRILLIC_SMALL_LETTER_HA                              = "\u{0445}";
457    public const CYRILLIC_SMALL_LETTER_TSE                             = "\u{0446}";
458    public const CYRILLIC_SMALL_LETTER_CHE                             = "\u{0447}";
459    public const CYRILLIC_SMALL_LETTER_SHA                             = "\u{0448}";
460    public const CYRILLIC_SMALL_LETTER_SHCHA                           = "\u{0449}";
461    public const CYRILLIC_SMALL_LETTER_HARD_SIGN                       = "\u{044A}";
462    public const CYRILLIC_SMALL_LETTER_YERU                            = "\u{044B}";
463    public const CYRILLIC_SMALL_LETTER_SOFT_SIGN                       = "\u{044C}";
464    public const CYRILLIC_SMALL_LETTER_E                               = "\u{044D}";
465    public const CYRILLIC_SMALL_LETTER_YU                              = "\u{044E}";
466    public const CYRILLIC_SMALL_LETTER_YA                              = "\u{044F}";
467    public const CYRILLIC_SMALL_LETTER_IO                              = "\u{0451}";
468    public const CYRILLIC_SMALL_LETTER_DJE                             = "\u{0452}";
469    public const CYRILLIC_SMALL_LETTER_GJE                             = "\u{0453}";
470    public const CYRILLIC_SMALL_LETTER_UKRANIAN_IE                     = "\u{0454}";
471    public const CYRILLIC_SMALL_LETTER_DZE                             = "\u{0455}";
472    public const CYRILLIC_SMALL_LETTER_BYELORUSSIAN_UKRAINIAN_I        = "\u{0456}";
473    public const CYRILLIC_SMALL_LETTER_YI                              = "\u{0457}";
474    public const CYRILLIC_SMALL_LETTER_JE                              = "\u{0458}";
475    public const CYRILLIC_SMALL_LETTER_LJE                             = "\u{0459}";
476    public const CYRILLIC_SMALL_LETTER_NJE                             = "\u{045A}";
477    public const CYRILLIC_SMALL_LETTER_TSHE                            = "\u{045B}";
478    public const CYRILLIC_SMALL_LETTER_KJE                             = "\u{045C}";
479    public const CYRILLIC_SMALL_LETTER_SHORT_U                         = "\u{045E}";
480    public const CYRILLIC_SMALL_LETTER_DZHE                            = "\u{045F}";
481    public const CYRILLIC_CAPITAL_LETTER_GHE_WITH_UPTURN               = "\u{0490}";
482    public const CYRILLIC_SMALL_LETTER_GHE_WITH_UPTURN                 = "\u{0491}";
483    public const ARABIC_LETTER_HAMZA                                   = "\u{0621}";
484    public const ARABIC_LETTER_ALEF                                    = "\u{0627}";
485    public const ARABIC_LETTER_BEH                                     = "\u{0628}";
486    public const ARABIC_LETTER_TEH_MARBUTA                             = "\u{0629}";
487    public const ARABIC_LETTER_TEH                                     = "\u{062A}";
488    public const ARABIC_LETTER_THEH                                    = "\u{062B}";
489    public const ARABIC_LETTER_JEEM                                    = "\u{062C}";
490    public const ARABIC_LETTER_HAH                                     = "\u{062D}";
491    public const ARABIC_LETTER_KHAH                                    = "\u{062E}";
492    public const ARABIC_LETTER_DAL                                     = "\u{062F}";
493    public const ARABIC_LETTER_THAL                                    = "\u{0630}";
494    public const ARABIC_LETTER_REH                                     = "\u{0631}";
495    public const ARABIC_LETTER_ZAIN                                    = "\u{0632}";
496    public const ARABIC_LETTER_SEEN                                    = "\u{0633}";
497    public const ARABIC_LETTER_SHEEN                                   = "\u{0634}";
498    public const ARABIC_LETTER_SAD                                     = "\u{0635}";
499    public const ARABIC_LETTER_DAD                                     = "\u{0636}";
500    public const ARABIC_LETTER_TAH                                     = "\u{0637}";
501    public const ARABIC_LETTER_ZAH                                     = "\u{0638}";
502    public const ARABIC_LETTER_AIN                                     = "\u{0639}";
503    public const ARABIC_LETTER_GHAIN                                   = "\u{063A}";
504    public const ARABIC_LETTER_FEH                                     = "\u{0641}";
505    public const ARABIC_LETTER_QAF                                     = "\u{0642}";
506    public const ARABIC_LETTER_KAF                                     = "\u{0643}";
507    public const ARABIC_LETTER_LAM                                     = "\u{0644}";
508    public const ARABIC_LETTER_MEEM                                    = "\u{0645}";
509    public const ARABIC_LETTER_NOON                                    = "\u{0646}";
510    public const ARABIC_LETTER_HEH                                     = "\u{0647}";
511    public const ARABIC_LETTER_WAW                                     = "\u{0648}";
512    public const ARABIC_LETTER_ALEF_MAKSURA                            = "\u{0649}";
513    public const ARABIC_LETTER_YEH                                     = "\u{064A}";
514    public const LATIN_CAPITAL_LETTER_A_WITH_RING_BELOW                = "\u{1E00}";
515    public const LATIN_SMALL_LETTER_A_WITH_RING_BELOW                  = "\u{1E01}";
516    public const LATIN_CAPITAL_LETTER_B_WITH_DOT_ABOVE                 = "\u{1E02}";
517    public const LATIN_SMALL_LETTER_B_WITH_DOT_ABOVE                   = "\u{1E03}";
518    public const LATIN_CAPITAL_LETTER_B_WITH_DOT_BELOW                 = "\u{1E04}";
519    public const LATIN_SMALL_LETTER_B_WITH_DOT_BELOW                   = "\u{1E05}";
520    public const LATIN_CAPITAL_LETTER_C_WITH_CEDILLA_AND_ACUTE         = "\u{1E08}";
521    public const LATIN_SMALL_LETTER_C_WITH_CEDILLA_AND_ACUTE           = "\u{1E09}";
522    public const LATIN_CAPITAL_LETTER_D_WITH_DOT_ABOVE                 = "\u{1E0A}";
523    public const LATIN_SMALL_LETTER_D_WITH_DOT_ABOVE                   = "\u{1E0B}";
524    public const LATIN_CAPITAL_LETTER_D_WITH_DOT_BELOW                 = "\u{1E0C}";
525    public const LATIN_SMALL_LETTER_D_WITH_DOT_BELOW                   = "\u{1E0D}";
526    public const LATIN_CAPITAL_LETTER_SHARP_S                          = "\u{1E9E}";
527    public const LATIN_CAPITAL_LETTER_D_WITH_CEDILLA                   = "\u{1E10}";
528    public const LATIN_SMALL_LETTER_D_WITH_CEDILLA                     = "\u{1E11}";
529    public const LATIN_CAPITAL_LETTER_E_WITH_MACRON_AND_GRAVE          = "\u{1E14}";
530    public const LATIN_SMALL_LETTER_E_WITH_MACRON_AND_GRAVE            = "\u{1E15}";
531    public const LATIN_CAPITAL_LETTER_E_WITH_MACRON_AND_ACUTE          = "\u{1E16}";
532    public const LATIN_SMALL_LETTER_E_WITH_MACRON_AND_ACUTE            = "\u{1E17}";
533    public const LATIN_CAPITAL_LETTER_E_WITH_CEDILLA_AND_BREVE         = "\u{1E1C}";
534    public const LATIN_SMALL_LETTER_E_WITH_CEDILLA_AND_BREVE           = "\u{1E1D}";
535    public const LATIN_CAPITAL_LETTER_F_WITH_DOT_ABOVE                 = "\u{1E1E}";
536    public const LATIN_SMALL_LETTER_F_WITH_DOT_ABOVE                   = "\u{1E1F}";
537    public const LATIN_CAPITAL_LETTER_G_WITH_MACRON                    = "\u{1E20}";
538    public const LATIN_SMALL_LETTER_G_WITH_MACRON                      = "\u{1E21}";
539    public const LATIN_CAPITAL_LETTER_H_WITH_DOT_ABOVE                 = "\u{1E22}";
540    public const LATIN_SMALL_LETTER_H_WITH_DOT_ABOVE                   = "\u{1E23}";
541    public const LATIN_CAPITAL_LETTER_H_WITH_DOT_BELOW                 = "\u{1E24}";
542    public const LATIN_SMALL_LETTER_H_WITH_DOT_BELOW                   = "\u{1E25}";
543    public const LATIN_CAPITAL_LETTER_H_WITH_DIAERESIS                 = "\u{1E26}";
544    public const LATIN_SMALL_LETTER_H_WITH_DIAERESIS                   = "\u{1E27}";
545    public const LATIN_CAPITAL_LETTER_H_WITH_CEDILLA                   = "\u{1E28}";
546    public const LATIN_SMALL_LETTER_H_WITH_CEDILLA                     = "\u{1E29}";
547    public const LATIN_CAPITAL_LETTER_H_WITH_BREVE_BELOW               = "\u{1E2A}";
548    public const LATIN_SMALL_LETTER_H_WITH_BREVE_BELOW                 = "\u{1E2B}";
549    public const LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS_AND_ACUTE       = "\u{1E2E}";
550    public const LATIN_SMALL_LETTER_I_WITH_DIAERESIS_AND_ACUTE         = "\u{1E2F}";
551    public const LATIN_CAPITAL_LETTER_K_WITH_ACUTE                     = "\u{1E30}";
552    public const LATIN_SMALL_LETTER_K_WITH_ACUTE                       = "\u{1E31}";
553    public const LATIN_CAPITAL_LETTER_K_WITH_DOT_BELOW                 = "\u{1E32}";
554    public const LATIN_SMALL_LETTER_K_WITH_DOT_BELOW                   = "\u{1E33}";
555    public const LATIN_CAPITAL_LETTER_L_WITH_DOT_BELOW                 = "\u{1E36}";
556    public const LATIN_SMALL_LETTER_L_WITH_DOT_BELOW                   = "\u{1E37}";
557    public const LATIN_CAPITAL_LETTER_L_WITH_DOT_BELOW_AND_MACRON      = "\u{1E38}";
558    public const LATIN_SMALL_LETTER_L_WITH_DOT_BELOW_AND_MACRON        = "\u{1E39}";
559    public const LATIN_CAPITAL_LETTER_M_WITH_ACUTE                     = "\u{1E3E}";
560    public const LATIN_SMALL_LETTER_M_WITH_ACUTE                       = "\u{1E3F}";
561    public const LATIN_CAPITAL_LETTER_M_WITH_DOT_ABOVE                 = "\u{1E40}";
562    public const LATIN_SMALL_LETTER_M_WITH_DOT_ABOVE                   = "\u{1E41}";
563    public const LATIN_CAPITAL_LETTER_M_WITH_DOT_BELOW                 = "\u{1E42}";
564    public const LATIN_SMALL_LETTER_M_WITH_DOT_BELOW                   = "\u{1E43}";
565    public const LATIN_CAPITAL_LETTER_N_WITH_DOT_ABOVE                 = "\u{1E44}";
566    public const LATIN_SMALL_LETTER_N_WITH_DOT_ABOVE                   = "\u{1E45}";
567    public const LATIN_CAPITAL_LETTER_N_WITH_DOT_BELOW                 = "\u{1E46}";
568    public const LATIN_SMALL_LETTER_N_WITH_DOT_BELOW                   = "\u{1E47}";
569    public const LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_ACUTE           = "\u{1E4C}";
570    public const LATIN_SMALL_LETTER_O_WITH_TILDE_AND_ACUTE             = "\u{1E4D}";
571    public const LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_DIAERESIS       = "\u{1E4E}";
572    public const LATIN_SMALL_LETTER_O_WITH_TILDE_AND_DIAERESIS         = "\u{1E4F}";
573    public const LATIN_CAPITAL_LETTER_O_WITH_MACRON_AND_GRAVE          = "\u{1E50}";
574    public const LATIN_SMALL_LETTER_O_WITH_MACRON_AND_GRAVE            = "\u{1E51}";
575    public const LATIN_CAPITAL_LETTER_O_WITH_MACRON_AND_ACUTE          = "\u{1E52}";
576    public const LATIN_SMALL_LETTER_O_WITH_MACRON_AND_ACUTE            = "\u{1E53}";
577    public const LATIN_CAPITAL_LETTER_P_WITH_ACUTE                     = "\u{1E54}";
578    public const LATIN_SMALL_LETTER_P_WITH_ACUTE                       = "\u{1E55}";
579    public const LATIN_CAPITAL_LETTER_P_WITH_DOT_ABOVE                 = "\u{1E56}";
580    public const LATIN_SMALL_LETTER_P_WITH_DOT_ABOVE                   = "\u{1E57}";
581    public const LATIN_CAPITAL_LETTER_R_WITH_DOT_ABOVE                 = "\u{1E58}";
582    public const LATIN_SMALL_LETTER_R_WITH_DOT_ABOVE                   = "\u{1E59}";
583    public const LATIN_CAPITAL_LETTER_R_WITH_DOT_BELOW                 = "\u{1E5A}";
584    public const LATIN_SMALL_LETTER_R_WITH_DOT_BELOW                   = "\u{1E5B}";
585    public const LATIN_CAPITAL_LETTER_R_WITH_DOT_BELOW_AND_MACRON      = "\u{1E5C}";
586    public const LATIN_SMALL_LETTER_R_WITH_DOT_BELOW_AND_MACRON        = "\u{1E5D}";
587    public const LATIN_CAPITAL_LETTER_S_WITH_DOT_ABOVE                 = "\u{1E60}";
588    public const LATIN_SMALL_LETTER_S_WITH_DOT_ABOVE                   = "\u{1E61}";
589    public const LATIN_CAPITAL_LETTER_S_WITH_DOT_BELOW                 = "\u{1E62}";
590    public const LATIN_SMALL_LETTER_S_WITH_DOT_BELOW                   = "\u{1E63}";
591    public const LATIN_CAPITAL_LETTER_S_WITH_ACUTE_AND_DOT_ABOVE       = "\u{1E64}";
592    public const LATIN_SMALL_LETTER_S_WITH_ACUTE_AND_DOT_ABOVE         = "\u{1E65}";
593    public const LATIN_CAPITAL_LETTER_S_WITH_CARON_AND_DOT_ABOVE       = "\u{1E66}";
594    public const LATIN_SMALL_LETTER_S_WITH_CARON_AND_DOT_ABOVE         = "\u{1E67}";
595    public const LATIN_CAPITAL_LETTER_S_WITH_DOT_BELOW_AND_DOT_ABOVE   = "\u{1E68}";
596    public const LATIN_SMALL_LETTER_S_WITH_DOT_BELOW_AND_DOT_ABOVE     = "\u{1E69}";
597    public const LATIN_CAPITAL_LETTER_T_WITH_DOT_ABOVE                 = "\u{1E6A}";
598    public const LATIN_SMALL_LETTER_T_WITH_DOT_ABOVE                   = "\u{1E6B}";
599    public const LATIN_CAPITAL_LETTER_T_WITH_DOT_BELOW                 = "\u{1E6C}";
600    public const LATIN_SMALL_LETTER_T_WITH_DOT_BELOW                   = "\u{1E6D}";
601    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_BELOW           = "\u{1E72}";
602    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS_BELOW             = "\u{1E73}";
603    public const LATIN_CAPITAL_LETTER_U_WITH_TILDE_AND_ACUTE           = "\u{1E78}";
604    public const LATIN_SMALL_LETTER_U_WITH_TILDE_AND_ACUTE             = "\u{1E79}";
605    public const LATIN_CAPITAL_LETTER_U_WITH_MACRON_AND_DIAERESIS      = "\u{1E7A}";
606    public const LATIN_SMALL_LETTER_U_WITH_MACRON_AND_DIAERESIS        = "\u{1E7B}";
607    public const LATIN_CAPITAL_LETTER_V_WITH_TILDE                     = "\u{1E7C}";
608    public const LATIN_SMALL_LETTER_V_WITH_TILDE                       = "\u{1E7D}";
609    public const LATIN_CAPITAL_LETTER_V_WITH_DOT_BELOW                 = "\u{1E7E}";
610    public const LATIN_SMALL_LETTER_V_WITH_DOT_BELOW                   = "\u{1E7F}";
611    public const LATIN_CAPITAL_LETTER_W_WITH_GRAVE                     = "\u{1E80}";
612    public const LATIN_SMALL_LETTER_W_WITH_GRAVE                       = "\u{1E81}";
613    public const LATIN_CAPITAL_LETTER_W_WITH_ACUTE                     = "\u{1E82}";
614    public const LATIN_SMALL_LETTER_W_WITH_ACUTE                       = "\u{1E83}";
615    public const LATIN_CAPITAL_LETTER_W_WITH_DIAERESIS                 = "\u{1E84}";
616    public const LATIN_SMALL_LETTER_W_WITH_DIAERESIS                   = "\u{1E85}";
617    public const LATIN_CAPITAL_LETTER_W_WITH_DOT_ABOVE                 = "\u{1E86}";
618    public const LATIN_SMALL_LETTER_W_WITH_DOT_ABOVE                   = "\u{1E87}";
619    public const LATIN_CAPITAL_LETTER_W_WITH_DOT_BELOW                 = "\u{1E88}";
620    public const LATIN_SMALL_LETTER_W_WITH_DOT_BELOW                   = "\u{1E89}";
621    public const LATIN_CAPITAL_LETTER_X_WITH_DOT_ABOVE                 = "\u{1E8A}";
622    public const LATIN_SMALL_LETTER_X_WITH_DOT_ABOVE                   = "\u{1E8B}";
623    public const LATIN_CAPITAL_LETTER_X_WITH_DIAERESIS                 = "\u{1E8C}";
624    public const LATIN_SMALL_LETTER_X_WITH_DIAERESIS                   = "\u{1E8D}";
625    public const LATIN_CAPITAL_LETTER_Y_WITH_DOT_ABOVE                 = "\u{1E8E}";
626    public const LATIN_SMALL_LETTER_Y_WITH_DOT_ABOVE                   = "\u{1E8F}";
627    public const LATIN_CAPITAL_LETTER_Z_WITH_CIRCUMFLEX                = "\u{1E90}";
628    public const LATIN_SMALL_LETTER_Z_WITH_CIRCUMFLEX                  = "\u{1E91}";
629    public const LATIN_CAPITAL_LETTER_Z_WITH_DOT_BELOW                 = "\u{1E92}";
630    public const LATIN_SMALL_LETTER_Z_WITH_DOT_BELOW                   = "\u{1E93}";
631    public const LATIN_SMALL_LETTER_T_WITH_DIAERESIS                   = "\u{1E97}";
632    public const LATIN_SMALL_LETTER_W_WITH_RING_ABOVE                  = "\u{1E98}";
633    public const LATIN_SMALL_LETTER_Y_WITH_RING_ABOVE                  = "\u{1E99}";
634    public const LATIN_CAPITAL_LETTER_A_WITH_DOT_BELOW                 = "\u{1EA0}";
635    public const LATIN_SMALL_LETTER_A_WITH_DOT_BELOW                   = "\u{1EA1}";
636    public const LATIN_CAPITAL_LETTER_A_WITH_HOOK_ABOVE                = "\u{1EA2}";
637    public const LATIN_SMALL_LETTER_A_WITH_HOOK_ABOVE                  = "\u{1EA3}";
638    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_ACUTE      = "\u{1EA4}";
639    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_ACUTE        = "\u{1EA5}";
640    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_GRAVE      = "\u{1EA6}";
641    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_GRAVE        = "\u{1EA7}";
642    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_HOOK_ABOVE = "\u{1EA8}";
643    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_HOOK_ABOVE   = "\u{1EA9}";
644    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_TILDE      = "\u{1EAA}";
645    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_TILDE        = "\u{1EAB}";
646    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_DOT_BELOW  = "\u{1EAC}";
647    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_DOT_BELOW    = "\u{1EAD}";
648    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_ACUTE           = "\u{1EAE}";
649    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_ACUTE             = "\u{1EAF}";
650    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_GRAVE           = "\u{1EB0}";
651    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_GRAVE             = "\u{1EB1}";
652    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_HOOK_ABOVE      = "\u{1EB2}";
653    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_HOOK_ABOVE        = "\u{1EB3}";
654    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_TILDE           = "\u{1EB4}";
655    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_TILDE             = "\u{1EB5}";
656    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_DOT_BELOW       = "\u{1EB6}";
657    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_DOT_BELOW         = "\u{1EB7}";
658    public const LATIN_CAPITAL_LETTER_E_WITH_DOT_BELOW                 = "\u{1EB8}";
659    public const LATIN_SMALL_LETTER_E_WITH_DOT_BELOW                   = "\u{1EB9}";
660    public const LATIN_CAPITAL_LETTER_E_WITH_HOOK_ABOVE                = "\u{1EBA}";
661    public const LATIN_SMALL_LETTER_E_WITH_HOOK_ABOVE                  = "\u{1EBB}";
662    public const LATIN_CAPITAL_LETTER_E_WITH_TILDE                     = "\u{1EBC}";
663    public const LATIN_SMALL_LETTER_E_WITH_TILDE                       = "\u{1EBD}";
664    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_ACUTE      = "\u{1EBE}";
665    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_ACUTE        = "\u{1EBF}";
666    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_GRAVE      = "\u{1EC0}";
667    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_GRAVE        = "\u{1EC1}";
668    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_HOOK_ABOVE = "\u{1EC2}";
669    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_HOOK_ABOVE   = "\u{1EC3}";
670    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_TILDE      = "\u{1EC4}";
671    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_TILDE        = "\u{1EC5}";
672    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_DOT_BELOW  = "\u{1EC6}";
673    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_DOT_BELOW    = "\u{1EC7}";
674    public const LATIN_CAPITAL_LETTER_I_WITH_HOOK_ABOVE                = "\u{1EC8}";
675    public const LATIN_SMALL_LETTER_I_WITH_HOOK_ABOVE                  = "\u{1EC9}";
676    public const LATIN_CAPITAL_LETTER_I_WITH_DOT_BELOW                 = "\u{1ECA}";
677    public const LATIN_SMALL_LETTER_I_WITH_DOT_BELOW                   = "\u{1ECB}";
678    public const LATIN_CAPITAL_LETTER_O_WITH_DOT_BELOW                 = "\u{1ECC}";
679    public const LATIN_SMALL_LETTER_O_WITH_DOT_BELOW                   = "\u{1ECD}";
680    public const LATIN_CAPITAL_LETTER_O_WITH_HOOK_ABOVE                = "\u{1ECE}";
681    public const LATIN_SMALL_LETTER_O_WITH_HOOK_ABOVE                  = "\u{1ECF}";
682    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_ACUTE      = "\u{1ED0}";
683    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_ACUTE        = "\u{1ED1}";
684    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_GRAVE      = "\u{1ED2}";
685    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_GRAVE        = "\u{1ED3}";
686    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_HOOK_ABOVE = "\u{1ED4}";
687    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_HOOK_ABOVE   = "\u{1ED5}";
688    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_TILDE      = "\u{1ED6}";
689    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_TILDE        = "\u{1ED7}";
690    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_DOT_BELOW  = "\u{1ED8}";
691    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_DOT_BELOW    = "\u{1ED9}";
692    public const LATIN_CAPITAL_LETTER_U_WITH_DOT_BELOW                 = "\u{1EE4}";
693    public const LATIN_SMALL_LETTER_U_WITH_DOT_BELOW                   = "\u{1EE5}";
694    public const LATIN_CAPITAL_LETTER_U_WITH_HOOK_ABOVE                = "\u{1EE6}";
695    public const LATIN_SMALL_LETTER_U_WITH_HOOK_ABOVE                  = "\u{1EE7}";
696    public const LATIN_CAPITAL_LETTER_Y_WITH_GRAVE                     = "\u{1EF2}";
697    public const LATIN_SMALL_LETTER_Y_WITH_GRAVE                       = "\u{1EF3}";
698    public const LATIN_CAPITAL_LETTER_Y_WITH_DOT_BELOW                 = "\u{1EF4}";
699    public const LATIN_SMALL_LETTER_Y_WITH_DOT_BELOW                   = "\u{1EF5}";
700    public const LATIN_CAPITAL_LETTER_Y_WITH_HOOK_ABOVE                = "\u{1EF6}";
701    public const LATIN_SMALL_LETTER_Y_WITH_HOOK_ABOVE                  = "\u{1EF7}";
702    public const LATIN_CAPITAL_LETTER_Y_WITH_TILDE                     = "\u{1EF8}";
703    public const LATIN_SMALL_LETTER_Y_WITH_TILDE                       = "\u{1EF9}";
704    public const ZERO_WIDTH_NON_JOINER                                 = "\u{200C}";
705    public const ZERO_WIDTH_JOINER                                     = "\u{200D}";
706    public const EN_DASH                                               = "\u{2013}";
707    public const EM_DASH                                               = "\u{2014}";
708    public const DOUBLE_LOW_LINE                                       = "\u{2017}";
709    public const LEFT_SINGLE_QUOTATION_MARK                            = "\u{2018}";
710    public const RIGHT_SINGLE_QUOTATION_MARK                           = "\u{2019}";
711    public const SINGLE_LOW_9_QUOTATION_MARK                           = "\u{201A}";
712    public const LEFT_DOUBLE_QUOTATION_MARK                            = "\u{201C}";
713    public const RIGHT_DOUBLE_QUOTATION_MARK                           = "\u{201D}";
714    public const DOUBLE_LOW_9_QUOTATION_MARK                           = "\u{201E}";
715    public const DAGGER                                                = "\u{2020}";
716    public const DOUBLE_DAGGER                                         = "\u{2021}";
717    public const BULLET                                                = "\u{2022}";
718    public const HORIZONTAL_ELLIPSIS                                   = "\u{2026}";
719    public const PER_MILLE_SIGN                                        = "\u{2030}";
720    public const SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK             = "\u{2039}";
721    public const SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK            = "\u{203A}";
722    public const FRACTION_SLASH                                        = "\u{2044}";
723    public const SUPERSCRIPT_LATIN_SMALL_LETTER_N                      = "\u{207F}";
724    public const PESETA_SIGN                                           = "\u{20A7}";
725    public const EURO_SIGN                                             = "\u{20AC}";
726    public const SCRIPT_SMALL_L                                        = "\u{2113}";
727    public const NUMERO_SIGN                                           = "\u{2116}";
728    public const SOUND_RECORDING_COPYRIGHT                             = "\u{2117}";
729    public const TRADE_MARK_SIGN                                       = "\u{2122}";
730    public const PARTIAL_DIFFERENTIAL                                  = "\u{2202}";
731    public const INCREMENT                                             = "\u{2206}";
732    public const N_ARY_PRODUCT                                         = "\u{220F}";
733    public const N_ARY_SUMMATION                                       = "\u{2211}";
734    public const BULLET_OPERATOR                                       = "\u{2219}";
735    public const SQUARE_ROOT                                           = "\u{221A}";
736    public const INFINITY                                              = "\u{221E}";
737    public const INTERSECTION                                          = "\u{2229}";
738    public const INTEGRAL                                              = "\u{222B}";
739    public const ALMOST_EQUAL_TO                                       = "\u{2248}";
740    public const NOT_EQUAL_TO                                          = "\u{2260}";
741    public const IDENTICAL_TO                                          = "\u{2261}";
742    public const LESS_THAN_OR_EQUAL_TO                                 = "\u{2264}";
743    public const GREATER_THAN_OR_EQUAL_TO                              = "\u{2265}";
744    public const REVERSED_NOT_SIGN                                     = "\u{2310}";
745    public const TOP_HALF_INTEGRAL                                     = "\u{2320}";
746    public const BOTTOM_HALF_INTEGRAL                                  = "\u{2321}";
747    public const BOX_DRAWINGS_LIGHT_HORIZONTAL                         = "\u{2500}";
748    public const BOX_DRAWINGS_LIGHT_VERTICAL                           = "\u{2502}";
749    public const BOX_DRAWINGS_LIGHT_DOWN_AND_RIGHT                     = "\u{250C}";
750    public const BOX_DRAWINGS_LIGHT_DOWN_AND_LEFT                      = "\u{2510}";
751    public const BOX_DRAWINGS_LIGHT_UP_AND_LEFT                        = "\u{2518}";
752    public const BOX_DRAWINGS_LIGHT_UP_AND_RIGHT                       = "\u{2514}";
753    public const BOX_DRAWINGS_LIGHT_VERTICAL_AND_RIGHT                 = "\u{251C}";
754    public const BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT                  = "\u{2524}";
755    public const BOX_DRAWINGS_LIGHT_DOWN_AND_HORIZONTAL                = "\u{252C}";
756    public const BOX_DRAWINGS_LIGHT_UP_AND_HORIZONTAL                  = "\u{2534}";
757    public const BOX_DRAWINGS_LIGHT_VERTICAL_AND_HORIZONTAL            = "\u{253C}";
758    public const BOX_DRAWINGS_DOUBLE_HORIZONTAL                        = "\u{2550}";
759    public const BOX_DRAWINGS_DOUBLE_VERTICAL                          = "\u{2551}";
760    public const BOX_DRAWINGS_DOWN_SINGLE_AND_RIGHT_DOUBLE             = "\u{2552}";
761    public const BOX_DRAWINGS_DOWN_DOUBLE_AND_RIGHT_SINGLE             = "\u{2553}";
762    public const BOX_DRAWINGS_DOUBLE_DOWN_AND_RIGHT                    = "\u{2554}";
763    public const BOX_DRAWINGS_DOWN_SINGLE_AND_LEFT_DOUBLE              = "\u{2555}";
764    public const BOX_DRAWINGS_DOWN_DOUBLE_AND_LEFT_SINGLE              = "\u{2556}";
765    public const BOX_DRAWINGS_DOUBLE_DOWN_AND_LEFT                     = "\u{2557}";
766    public const BOX_DRAWINGS_UP_SINGLE_AND_RIGHT_DOUBLE               = "\u{2558}";
767    public const BOX_DRAWINGS_UP_DOUBLE_AND_RIGHT_SINGLE               = "\u{2559}";
768    public const BOX_DRAWINGS_DOUBLE_UP_AND_RIGHT                      = "\u{255A}";
769    public const BOX_DRAWINGS_UP_SINGLE_AND_LEFT_DOUBLE                = "\u{255B}";
770    public const BOX_DRAWINGS_UP_DOUBLE_AND_LEFT_SINGLE                = "\u{255C}";
771    public const BOX_DRAWINGS_DOUBLE_UP_AND_LEFT                       = "\u{255D}";
772    public const BOX_DRAWINGS_VERTICAL_SINGLE_AND_RIGHT_DOUBLE         = "\u{255E}";
773    public const BOX_DRAWINGS_VERTICAL_DOUBLE_AND_RIGHT_SINGLE         = "\u{255F}";
774    public const BOX_DRAWINGS_DOUBLE_VERTICAL_AND_RIGHT                = "\u{2560}";
775    public const BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE          = "\u{2561}";
776    public const BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE          = "\u{2562}";
777    public const BOX_DRAWINGS_DOUBLE_VERTICAL_AND_LEFT                 = "\u{2563}";
778    public const BOX_DRAWINGS_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE        = "\u{2564}";
779    public const BOX_DRAWINGS_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE        = "\u{2565}";
780    public const BOX_DRAWINGS_DOUBLE_DOWN_AND_HORIZONTAL               = "\u{2566}";
781    public const BOX_DRAWINGS_UP_SINGLE_AND_HORIZONTAL_DOUBLE          = "\u{2567}";
782    public const BOX_DRAWINGS_UP_DOUBLE_AND_HORIZONTAL_SINGLE          = "\u{2568}";
783    public const BOX_DRAWINGS_BOX_DRAWINGS_DOUBLE_UP_AND_HORIZONTAL    = "\u{2569}";
784    public const BOX_DRAWINGS_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE    = "\u{256A}";
785    public const BOX_DRAWINGS_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE    = "\u{256B}";
786    public const BOX_DRAWINGS_DOUBLE_VERTICAL_AND_HORIZONTAL           = "\u{256C}";
787    public const UPPER_HALF_BLOCK                                      = "\u{2580}";
788    public const LOWER_HALF_BLOCK                                      = "\u{2584}";
789    public const FULL_BLOCK                                            = "\u{2588}";
790    public const LEFT_HALF_BLOCK                                       = "\u{258C}";
791    public const RIGHT_HALF_BLOCK                                      = "\u{2590}";
792    public const LIGHT_SHADE                                           = "\u{2591}";
793    public const MEDIUM_SHADE                                          = "\u{2592}";
794    public const DARK_SHADE                                            = "\u{2593}";
795    public const BLACK_SQUARE                                          = "\u{25A0}";
796    public const WHITE_SQUARE                                          = "\u{25A1}";
797    public const LOZENGE                                               = "\u{25CA}";
798    public const MUSIC_FLAT_SIGN                                       = "\u{266D}";
799    public const MUSIC_SHARP_SIGN                                      = "\u{266F}";
800    public const LATIN_SMALL_LIGATURE_FI                               = "\u{FB01}";
801    public const LATIN_SMALL_LIGATURE_FL                               = "\u{FB02}";
802    public const BYTE_ORDER_MARK                                       = "\u{FEFF}";
803    public const REPLACEMENT_CHARACTER                                 = "\u{FFFD}";
804
805    /**
806     * Convert text from (potentially invalid) UTF-8 to UTF-8.
807     *
808     * @param string $text
809     *
810     * @return string
811     */
812    public function fromUtf8(string $text): string
813    {
814        if (preg_match('//u', $text) === false) {
815            // Not UTF8?
816            mb_substitute_character(0xFFFD);
817
818            return mb_convert_encoding($text, 'UTF-8', 'UTF-8');
819        }
820
821        return $text;
822    }
823
824    /**
825     * Convert text from (potentially invalid) UTF-8 to UTF-8.
826     *
827     * @param string $text
828     *
829     * @return string
830     */
831    public function toUtf8(string $text): string
832    {
833        return $this->fromUtf8($text);
834    }
835
836    /**
837     * Create a UTF8 character from a code.
838     *
839     * @param int $code
840     *
841     * @return string
842     */
843    public static function chr(int $code): string
844    {
845        if ($code < 0 || $code > 0x1FFFFF) {
846            throw new InvalidArgumentException((string)$code);
847        }
848
849        if ($code <= 0x7F) {
850            return chr($code);
851        }
852
853        if ($code <= 0x7FF) {
854            return
855                chr(($code >> 6) + 0xC0) .
856                chr(($code & 0x3F) + 0x80);
857        }
858
859        if ($code <= 0xFFFF) {
860            return
861                chr(($code >> 12) + 0xE0) .
862                chr((($code >> 6) & 0x3F) + 0x80) .
863                chr(($code & 0x3F) + 0x80);
864        }
865
866        return
867            chr(($code >> 18) + 0xF0) .
868            chr((($code >> 12) & 0x3F) + 0x80) .
869            chr((($code >> 6) & 0x3F) + 0x80) .
870            chr(($code & 0x3F) + 0x80);
871    }
872}
873