xref: /webtrees/app/Encodings/UTF8.php (revision 5966b7ff5aa7003fbc2931522a3e61c7a35cffec)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * Copyright (C) 2021 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_LONG_SOLIDUS_OVERLAY                        = "\u{0338}";
372    public const COMBINING_DOUBLE_TILDE                                = "\u{0360}";
373    public const COMBINING_DOUBLE_INVERTED_BREVE                       = "\u{0361}";
374    public const GREEK_CAPITAL_LETTER_GAMMA                            = "\u{0393}";
375    public const GREEK_CAPITAL_LETTER_THETA                            = "\u{0398}";
376    public const GREEK_CAPITAL_LETTER_SIGMA                            = "\u{03A3}";
377    public const GREEK_CAPITAL_LETTER_PHI                              = "\u{03A6}";
378    public const GREEK_CAPITAL_LETTER_OMEGA                            = "\u{03A9}";
379    public const GREEK_SMALL_LETTER_ALPHA                              = "\u{03B1}";
380    public const GREEK_SMALL_LETTER_DELTA                              = "\u{03B4}";
381    public const GREEK_SMALL_LETTER_EPSILON                            = "\u{03B5}";
382    public const GREEK_SMALL_LETTER_PI                                 = "\u{03C0}";
383    public const GREEK_SMALL_LETTER_SIGMA                              = "\u{03C3}";
384    public const GREEK_SMALL_LETTER_TAU                                = "\u{03C4}";
385    public const GREEK_SMALL_LETTER_PHI                                = "\u{03C6}";
386    public const CYRILLIC_CAPITAL_LETTER_IO                            = "\u{0401}";
387    public const CYRILLIC_CAPITAL_LETTER_DJE                           = "\u{0402}";
388    public const CYRILLIC_CAPITAL_LETTER_GJE                           = "\u{0403}";
389    public const CYRILLIC_CAPITAL_LETTER_UKRANIAN_IE                   = "\u{0404}";
390    public const CYRILLIC_CAPITAL_LETTER_DZE                           = "\u{0405}";
391    public const CYRILLIC_CAPITAL_LETTER_BYELORUSSIAN_UKRAINIAN_I      = "\u{0406}";
392    public const CYRILLIC_CAPITAL_LETTER_YI                            = "\u{0407}";
393    public const CYRILLIC_CAPITAL_LETTER_JE                            = "\u{0408}";
394    public const CYRILLIC_CAPITAL_LETTER_LJE                           = "\u{0409}";
395    public const CYRILLIC_CAPITAL_LETTER_NJE                           = "\u{040A}";
396    public const CYRILLIC_CAPITAL_LETTER_TSHE                          = "\u{040B}";
397    public const CYRILLIC_CAPITAL_LETTER_KJE                           = "\u{040C}";
398    public const CYRILLIC_CAPITAL_LETTER_SHORT_U                       = "\u{040E}";
399    public const CYRILLIC_CAPITAL_LETTER_DZHE                          = "\u{040F}";
400    public const CYRILLIC_CAPITAL_LETTER_A                             = "\u{0410}";
401    public const CYRILLIC_CAPITAL_LETTER_BE                            = "\u{0411}";
402    public const CYRILLIC_CAPITAL_LETTER_VE                            = "\u{0412}";
403    public const CYRILLIC_CAPITAL_LETTER_GHE                           = "\u{0413}";
404    public const CYRILLIC_CAPITAL_LETTER_DE                            = "\u{0414}";
405    public const CYRILLIC_CAPITAL_LETTER_IE                            = "\u{0415}";
406    public const CYRILLIC_CAPITAL_LETTER_ZHE                           = "\u{0416}";
407    public const CYRILLIC_CAPITAL_LETTER_ZE                            = "\u{0417}";
408    public const CYRILLIC_CAPITAL_LETTER_I                             = "\u{0418}";
409    public const CYRILLIC_CAPITAL_LETTER_SHORT_I                       = "\u{0419}";
410    public const CYRILLIC_CAPITAL_LETTER_KA                            = "\u{041A}";
411    public const CYRILLIC_CAPITAL_LETTER_EL                            = "\u{041B}";
412    public const CYRILLIC_CAPITAL_LETTER_EM                            = "\u{041C}";
413    public const CYRILLIC_CAPITAL_LETTER_EN                            = "\u{041D}";
414    public const CYRILLIC_CAPITAL_LETTER_O                             = "\u{041E}";
415    public const CYRILLIC_CAPITAL_LETTER_PE                            = "\u{041F}";
416    public const CYRILLIC_CAPITAL_LETTER_ER                            = "\u{0420}";
417    public const CYRILLIC_CAPITAL_LETTER_ES                            = "\u{0421}";
418    public const CYRILLIC_CAPITAL_LETTER_TE                            = "\u{0422}";
419    public const CYRILLIC_CAPITAL_LETTER_U                             = "\u{0423}";
420    public const CYRILLIC_CAPITAL_LETTER_EF                            = "\u{0424}";
421    public const CYRILLIC_CAPITAL_LETTER_HA                            = "\u{0425}";
422    public const CYRILLIC_CAPITAL_LETTER_TSE                           = "\u{0426}";
423    public const CYRILLIC_CAPITAL_LETTER_CHE                           = "\u{0427}";
424    public const CYRILLIC_CAPITAL_LETTER_SHA                           = "\u{0428}";
425    public const CYRILLIC_CAPITAL_LETTER_SHCHA                         = "\u{0429}";
426    public const CYRILLIC_CAPITAL_LETTER_HARD_SIGN                     = "\u{042A}";
427    public const CYRILLIC_CAPITAL_LETTER_YERU                          = "\u{042B}";
428    public const CYRILLIC_CAPITAL_LETTER_SOFT_SIGN                     = "\u{042C}";
429    public const CYRILLIC_CAPITAL_LETTER_E                             = "\u{042D}";
430    public const CYRILLIC_CAPITAL_LETTER_YU                            = "\u{042E}";
431    public const CYRILLIC_CAPITAL_LETTER_YA                            = "\u{042F}";
432    public const CYRILLIC_SMALL_LETTER_A                               = "\u{0430}";
433    public const CYRILLIC_SMALL_LETTER_BE                              = "\u{0431}";
434    public const CYRILLIC_SMALL_LETTER_VE                              = "\u{0432}";
435    public const CYRILLIC_SMALL_LETTER_GHE                             = "\u{0433}";
436    public const CYRILLIC_SMALL_LETTER_DE                              = "\u{0434}";
437    public const CYRILLIC_SMALL_LETTER_IE                              = "\u{0435}";
438    public const CYRILLIC_SMALL_LETTER_ZHE                             = "\u{0436}";
439    public const CYRILLIC_SMALL_LETTER_ZE                              = "\u{0437}";
440    public const CYRILLIC_SMALL_LETTER_I                               = "\u{0438}";
441    public const CYRILLIC_SMALL_LETTER_SHORT_I                         = "\u{0439}";
442    public const CYRILLIC_SMALL_LETTER_KA                              = "\u{043A}";
443    public const CYRILLIC_SMALL_LETTER_EL                              = "\u{043B}";
444    public const CYRILLIC_SMALL_LETTER_EM                              = "\u{043C}";
445    public const CYRILLIC_SMALL_LETTER_EN                              = "\u{043D}";
446    public const CYRILLIC_SMALL_LETTER_O                               = "\u{043E}";
447    public const CYRILLIC_SMALL_LETTER_PE                              = "\u{043F}";
448    public const CYRILLIC_SMALL_LETTER_ER                              = "\u{0440}";
449    public const CYRILLIC_SMALL_LETTER_ES                              = "\u{0441}";
450    public const CYRILLIC_SMALL_LETTER_TE                              = "\u{0442}";
451    public const CYRILLIC_SMALL_LETTER_U                               = "\u{0443}";
452    public const CYRILLIC_SMALL_LETTER_EF                              = "\u{0444}";
453    public const CYRILLIC_SMALL_LETTER_HA                              = "\u{0445}";
454    public const CYRILLIC_SMALL_LETTER_TSE                             = "\u{0446}";
455    public const CYRILLIC_SMALL_LETTER_CHE                             = "\u{0447}";
456    public const CYRILLIC_SMALL_LETTER_SHA                             = "\u{0448}";
457    public const CYRILLIC_SMALL_LETTER_SHCHA                           = "\u{0449}";
458    public const CYRILLIC_SMALL_LETTER_HARD_SIGN                       = "\u{044A}";
459    public const CYRILLIC_SMALL_LETTER_YERU                            = "\u{044B}";
460    public const CYRILLIC_SMALL_LETTER_SOFT_SIGN                       = "\u{044C}";
461    public const CYRILLIC_SMALL_LETTER_E                               = "\u{044D}";
462    public const CYRILLIC_SMALL_LETTER_YU                              = "\u{044E}";
463    public const CYRILLIC_SMALL_LETTER_YA                              = "\u{044F}";
464    public const CYRILLIC_SMALL_LETTER_IO                              = "\u{0451}";
465    public const CYRILLIC_SMALL_LETTER_DJE                             = "\u{0452}";
466    public const CYRILLIC_SMALL_LETTER_GJE                             = "\u{0453}";
467    public const CYRILLIC_SMALL_LETTER_UKRANIAN_IE                     = "\u{0454}";
468    public const CYRILLIC_SMALL_LETTER_DZE                             = "\u{0455}";
469    public const CYRILLIC_SMALL_LETTER_BYELORUSSIAN_UKRAINIAN_I        = "\u{0456}";
470    public const CYRILLIC_SMALL_LETTER_YI                              = "\u{0457}";
471    public const CYRILLIC_SMALL_LETTER_JE                              = "\u{0458}";
472    public const CYRILLIC_SMALL_LETTER_LJE                             = "\u{0459}";
473    public const CYRILLIC_SMALL_LETTER_NJE                             = "\u{045A}";
474    public const CYRILLIC_SMALL_LETTER_TSHE                            = "\u{045B}";
475    public const CYRILLIC_SMALL_LETTER_KJE                             = "\u{045C}";
476    public const CYRILLIC_SMALL_LETTER_SHORT_U                         = "\u{045E}";
477    public const CYRILLIC_SMALL_LETTER_DZHE                            = "\u{045F}";
478    public const CYRILLIC_CAPITAL_LETTER_GHE_WITH_UPTURN               = "\u{0490}";
479    public const CYRILLIC_SMALL_LETTER_GHE_WITH_UPTURN                 = "\u{0491}";
480    public const LATIN_CAPITAL_LETTER_A_WITH_RING_BELOW                = "\u{1E00}";
481    public const LATIN_SMALL_LETTER_A_WITH_RING_BELOW                  = "\u{1E01}";
482    public const LATIN_CAPITAL_LETTER_B_WITH_DOT_ABOVE                 = "\u{1E02}";
483    public const LATIN_SMALL_LETTER_B_WITH_DOT_ABOVE                   = "\u{1E03}";
484    public const LATIN_CAPITAL_LETTER_B_WITH_DOT_BELOW                 = "\u{1E04}";
485    public const LATIN_SMALL_LETTER_B_WITH_DOT_BELOW                   = "\u{1E05}";
486    public const LATIN_CAPITAL_LETTER_C_WITH_CEDILLA_AND_ACUTE         = "\u{1E08}";
487    public const LATIN_SMALL_LETTER_C_WITH_CEDILLA_AND_ACUTE           = "\u{1E09}";
488    public const LATIN_CAPITAL_LETTER_D_WITH_DOT_ABOVE                 = "\u{1E0A}";
489    public const LATIN_SMALL_LETTER_D_WITH_DOT_ABOVE                   = "\u{1E0B}";
490    public const LATIN_CAPITAL_LETTER_D_WITH_DOT_BELOW                 = "\u{1E0C}";
491    public const LATIN_SMALL_LETTER_D_WITH_DOT_BELOW                   = "\u{1E0D}";
492    public const LATIN_CAPITAL_LETTER_SHARP_S                          = "\u{1E9E}";
493    public const LATIN_CAPITAL_LETTER_D_WITH_CEDILLA                   = "\u{1E10}";
494    public const LATIN_SMALL_LETTER_D_WITH_CEDILLA                     = "\u{1E11}";
495    public const LATIN_CAPITAL_LETTER_E_WITH_MACRON_AND_GRAVE          = "\u{1E14}";
496    public const LATIN_SMALL_LETTER_E_WITH_MACRON_AND_GRAVE            = "\u{1E15}";
497    public const LATIN_CAPITAL_LETTER_E_WITH_MACRON_AND_ACUTE          = "\u{1E16}";
498    public const LATIN_SMALL_LETTER_E_WITH_MACRON_AND_ACUTE            = "\u{1E17}";
499    public const LATIN_CAPITAL_LETTER_E_WITH_CEDILLA_AND_BREVE         = "\u{1E1C}";
500    public const LATIN_SMALL_LETTER_E_WITH_CEDILLA_AND_BREVE           = "\u{1E1D}";
501    public const LATIN_CAPITAL_LETTER_F_WITH_DOT_ABOVE                 = "\u{1E1E}";
502    public const LATIN_SMALL_LETTER_F_WITH_DOT_ABOVE                   = "\u{1E1F}";
503    public const LATIN_CAPITAL_LETTER_G_WITH_MACRON                    = "\u{1E20}";
504    public const LATIN_SMALL_LETTER_G_WITH_MACRON                      = "\u{1E21}";
505    public const LATIN_CAPITAL_LETTER_H_WITH_DOT_ABOVE                 = "\u{1E22}";
506    public const LATIN_SMALL_LETTER_H_WITH_DOT_ABOVE                   = "\u{1E23}";
507    public const LATIN_CAPITAL_LETTER_H_WITH_DOT_BELOW                 = "\u{1E24}";
508    public const LATIN_SMALL_LETTER_H_WITH_DOT_BELOW                   = "\u{1E25}";
509    public const LATIN_CAPITAL_LETTER_H_WITH_DIAERESIS                 = "\u{1E26}";
510    public const LATIN_SMALL_LETTER_H_WITH_DIAERESIS                   = "\u{1E27}";
511    public const LATIN_CAPITAL_LETTER_H_WITH_CEDILLA                   = "\u{1E28}";
512    public const LATIN_SMALL_LETTER_H_WITH_CEDILLA                     = "\u{1E29}";
513    public const LATIN_CAPITAL_LETTER_H_WITH_BREVE_BELOW               = "\u{1E2A}";
514    public const LATIN_SMALL_LETTER_H_WITH_BREVE_BELOW                 = "\u{1E2B}";
515    public const LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS_AND_ACUTE       = "\u{1E2E}";
516    public const LATIN_SMALL_LETTER_I_WITH_DIAERESIS_AND_ACUTE         = "\u{1E2F}";
517    public const LATIN_CAPITAL_LETTER_K_WITH_ACUTE                     = "\u{1E30}";
518    public const LATIN_SMALL_LETTER_K_WITH_ACUTE                       = "\u{1E31}";
519    public const LATIN_CAPITAL_LETTER_K_WITH_DOT_BELOW                 = "\u{1E32}";
520    public const LATIN_SMALL_LETTER_K_WITH_DOT_BELOW                   = "\u{1E33}";
521    public const LATIN_CAPITAL_LETTER_L_WITH_DOT_BELOW                 = "\u{1E36}";
522    public const LATIN_SMALL_LETTER_L_WITH_DOT_BELOW                   = "\u{1E37}";
523    public const LATIN_CAPITAL_LETTER_L_WITH_DOT_BELOW_AND_MACRON      = "\u{1E38}";
524    public const LATIN_SMALL_LETTER_L_WITH_DOT_BELOW_AND_MACRON        = "\u{1E39}";
525    public const LATIN_CAPITAL_LETTER_M_WITH_ACUTE                     = "\u{1E3E}";
526    public const LATIN_SMALL_LETTER_M_WITH_ACUTE                       = "\u{1E3F}";
527    public const LATIN_CAPITAL_LETTER_M_WITH_DOT_ABOVE                 = "\u{1E40}";
528    public const LATIN_SMALL_LETTER_M_WITH_DOT_ABOVE                   = "\u{1E41}";
529    public const LATIN_CAPITAL_LETTER_M_WITH_DOT_BELOW                 = "\u{1E42}";
530    public const LATIN_SMALL_LETTER_M_WITH_DOT_BELOW                   = "\u{1E43}";
531    public const LATIN_CAPITAL_LETTER_N_WITH_DOT_ABOVE                 = "\u{1E44}";
532    public const LATIN_SMALL_LETTER_N_WITH_DOT_ABOVE                   = "\u{1E45}";
533    public const LATIN_CAPITAL_LETTER_N_WITH_DOT_BELOW                 = "\u{1E46}";
534    public const LATIN_SMALL_LETTER_N_WITH_DOT_BELOW                   = "\u{1E47}";
535    public const LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_ACUTE           = "\u{1E4C}";
536    public const LATIN_SMALL_LETTER_O_WITH_TILDE_AND_ACUTE             = "\u{1E4D}";
537    public const LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_DIAERESIS       = "\u{1E4E}";
538    public const LATIN_SMALL_LETTER_O_WITH_TILDE_AND_DIAERESIS         = "\u{1E4F}";
539    public const LATIN_CAPITAL_LETTER_O_WITH_MACRON_AND_GRAVE          = "\u{1E50}";
540    public const LATIN_SMALL_LETTER_O_WITH_MACRON_AND_GRAVE            = "\u{1E51}";
541    public const LATIN_CAPITAL_LETTER_O_WITH_MACRON_AND_ACUTE          = "\u{1E52}";
542    public const LATIN_SMALL_LETTER_O_WITH_MACRON_AND_ACUTE            = "\u{1E53}";
543    public const LATIN_CAPITAL_LETTER_P_WITH_ACUTE                     = "\u{1E54}";
544    public const LATIN_SMALL_LETTER_P_WITH_ACUTE                       = "\u{1E55}";
545    public const LATIN_CAPITAL_LETTER_P_WITH_DOT_ABOVE                 = "\u{1E56}";
546    public const LATIN_SMALL_LETTER_P_WITH_DOT_ABOVE                   = "\u{1E57}";
547    public const LATIN_CAPITAL_LETTER_R_WITH_DOT_ABOVE                 = "\u{1E58}";
548    public const LATIN_SMALL_LETTER_R_WITH_DOT_ABOVE                   = "\u{1E59}";
549    public const LATIN_CAPITAL_LETTER_R_WITH_DOT_BELOW                 = "\u{1E5A}";
550    public const LATIN_SMALL_LETTER_R_WITH_DOT_BELOW                   = "\u{1E5B}";
551    public const LATIN_CAPITAL_LETTER_R_WITH_DOT_BELOW_AND_MACRON      = "\u{1E5C}";
552    public const LATIN_SMALL_LETTER_R_WITH_DOT_BELOW_AND_MACRON        = "\u{1E5D}";
553    public const LATIN_CAPITAL_LETTER_S_WITH_DOT_ABOVE                 = "\u{1E60}";
554    public const LATIN_SMALL_LETTER_S_WITH_DOT_ABOVE                   = "\u{1E61}";
555    public const LATIN_CAPITAL_LETTER_S_WITH_DOT_BELOW                 = "\u{1E62}";
556    public const LATIN_SMALL_LETTER_S_WITH_DOT_BELOW                   = "\u{1E63}";
557    public const LATIN_CAPITAL_LETTER_S_WITH_ACUTE_AND_DOT_ABOVE       = "\u{1E64}";
558    public const LATIN_SMALL_LETTER_S_WITH_ACUTE_AND_DOT_ABOVE         = "\u{1E65}";
559    public const LATIN_CAPITAL_LETTER_S_WITH_CARON_AND_DOT_ABOVE       = "\u{1E66}";
560    public const LATIN_SMALL_LETTER_S_WITH_CARON_AND_DOT_ABOVE         = "\u{1E67}";
561    public const LATIN_CAPITAL_LETTER_S_WITH_DOT_BELOW_AND_DOT_ABOVE   = "\u{1E68}";
562    public const LATIN_SMALL_LETTER_S_WITH_DOT_BELOW_AND_DOT_ABOVE     = "\u{1E69}";
563    public const LATIN_CAPITAL_LETTER_T_WITH_DOT_ABOVE                 = "\u{1E6A}";
564    public const LATIN_SMALL_LETTER_T_WITH_DOT_ABOVE                   = "\u{1E6B}";
565    public const LATIN_CAPITAL_LETTER_T_WITH_DOT_BELOW                 = "\u{1E6C}";
566    public const LATIN_SMALL_LETTER_T_WITH_DOT_BELOW                   = "\u{1E6D}";
567    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_BELOW           = "\u{1E72}";
568    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS_BELOW             = "\u{1E73}";
569    public const LATIN_CAPITAL_LETTER_U_WITH_TILDE_AND_ACUTE           = "\u{1E78}";
570    public const LATIN_SMALL_LETTER_U_WITH_TILDE_AND_ACUTE             = "\u{1E79}";
571    public const LATIN_CAPITAL_LETTER_U_WITH_MACRON_AND_DIAERESIS      = "\u{1E7A}";
572    public const LATIN_SMALL_LETTER_U_WITH_MACRON_AND_DIAERESIS        = "\u{1E7B}";
573    public const LATIN_CAPITAL_LETTER_V_WITH_TILDE                     = "\u{1E7C}";
574    public const LATIN_SMALL_LETTER_V_WITH_TILDE                       = "\u{1E7D}";
575    public const LATIN_CAPITAL_LETTER_V_WITH_DOT_BELOW                 = "\u{1E7E}";
576    public const LATIN_SMALL_LETTER_V_WITH_DOT_BELOW                   = "\u{1E7F}";
577    public const LATIN_CAPITAL_LETTER_W_WITH_GRAVE                     = "\u{1E80}";
578    public const LATIN_SMALL_LETTER_W_WITH_GRAVE                       = "\u{1E81}";
579    public const LATIN_CAPITAL_LETTER_W_WITH_ACUTE                     = "\u{1E82}";
580    public const LATIN_SMALL_LETTER_W_WITH_ACUTE                       = "\u{1E83}";
581    public const LATIN_CAPITAL_LETTER_W_WITH_DIAERESIS                 = "\u{1E84}";
582    public const LATIN_SMALL_LETTER_W_WITH_DIAERESIS                   = "\u{1E85}";
583    public const LATIN_CAPITAL_LETTER_W_WITH_DOT_ABOVE                 = "\u{1E86}";
584    public const LATIN_SMALL_LETTER_W_WITH_DOT_ABOVE                   = "\u{1E87}";
585    public const LATIN_CAPITAL_LETTER_W_WITH_DOT_BELOW                 = "\u{1E88}";
586    public const LATIN_SMALL_LETTER_W_WITH_DOT_BELOW                   = "\u{1E89}";
587    public const LATIN_CAPITAL_LETTER_X_WITH_DOT_ABOVE                 = "\u{1E8A}";
588    public const LATIN_SMALL_LETTER_X_WITH_DOT_ABOVE                   = "\u{1E8B}";
589    public const LATIN_CAPITAL_LETTER_X_WITH_DIAERESIS                 = "\u{1E8C}";
590    public const LATIN_SMALL_LETTER_X_WITH_DIAERESIS                   = "\u{1E8D}";
591    public const LATIN_CAPITAL_LETTER_Y_WITH_DOT_ABOVE                 = "\u{1E8E}";
592    public const LATIN_SMALL_LETTER_Y_WITH_DOT_ABOVE                   = "\u{1E8F}";
593    public const LATIN_CAPITAL_LETTER_Z_WITH_CIRCUMFLEX                = "\u{1E90}";
594    public const LATIN_SMALL_LETTER_Z_WITH_CIRCUMFLEX                  = "\u{1E91}";
595    public const LATIN_CAPITAL_LETTER_Z_WITH_DOT_BELOW                 = "\u{1E92}";
596    public const LATIN_SMALL_LETTER_Z_WITH_DOT_BELOW                   = "\u{1E93}";
597    public const LATIN_SMALL_LETTER_T_WITH_DIAERESIS                   = "\u{1E97}";
598    public const LATIN_SMALL_LETTER_W_WITH_RING_ABOVE                  = "\u{1E98}";
599    public const LATIN_SMALL_LETTER_Y_WITH_RING_ABOVE                  = "\u{1E99}";
600    public const LATIN_CAPITAL_LETTER_A_WITH_DOT_BELOW                 = "\u{1EA0}";
601    public const LATIN_SMALL_LETTER_A_WITH_DOT_BELOW                   = "\u{1EA1}";
602    public const LATIN_CAPITAL_LETTER_A_WITH_HOOK_ABOVE                = "\u{1EA2}";
603    public const LATIN_SMALL_LETTER_A_WITH_HOOK_ABOVE                  = "\u{1EA3}";
604    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_ACUTE      = "\u{1EA4}";
605    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_ACUTE        = "\u{1EA5}";
606    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_GRAVE      = "\u{1EA6}";
607    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_GRAVE        = "\u{1EA7}";
608    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_HOOK_ABOVE = "\u{1EA8}";
609    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_HOOK_ABOVE   = "\u{1EA9}";
610    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_TILDE      = "\u{1EAA}";
611    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_TILDE        = "\u{1EAB}";
612    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_DOT_BELOW  = "\u{1EAC}";
613    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_DOT_BELOW    = "\u{1EAD}";
614    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_ACUTE           = "\u{1EAE}";
615    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_ACUTE             = "\u{1EAF}";
616    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_GRAVE           = "\u{1EB0}";
617    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_GRAVE             = "\u{1EB1}";
618    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_HOOK_ABOVE      = "\u{1EB2}";
619    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_HOOK_ABOVE        = "\u{1EB3}";
620    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_TILDE           = "\u{1EB4}";
621    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_TILDE             = "\u{1EB5}";
622    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_DOT_BELOW       = "\u{1EB6}";
623    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_DOT_BELOW         = "\u{1EB7}";
624    public const LATIN_CAPITAL_LETTER_E_WITH_DOT_BELOW                 = "\u{1EB8}";
625    public const LATIN_SMALL_LETTER_E_WITH_DOT_BELOW                   = "\u{1EB9}";
626    public const LATIN_CAPITAL_LETTER_E_WITH_HOOK_ABOVE                = "\u{1EBA}";
627    public const LATIN_SMALL_LETTER_E_WITH_HOOK_ABOVE                  = "\u{1EBB}";
628    public const LATIN_CAPITAL_LETTER_E_WITH_TILDE                     = "\u{1EBC}";
629    public const LATIN_SMALL_LETTER_E_WITH_TILDE                       = "\u{1EBD}";
630    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_ACUTE      = "\u{1EBE}";
631    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_ACUTE        = "\u{1EBF}";
632    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_GRAVE      = "\u{1EC0}";
633    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_GRAVE        = "\u{1EC1}";
634    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_HOOK_ABOVE = "\u{1EC2}";
635    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_HOOK_ABOVE   = "\u{1EC3}";
636    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_TILDE      = "\u{1EC4}";
637    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_TILDE        = "\u{1EC5}";
638    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_DOT_BELOW  = "\u{1EC6}";
639    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_DOT_BELOW    = "\u{1EC7}";
640    public const LATIN_CAPITAL_LETTER_I_WITH_HOOK_ABOVE                = "\u{1EC8}";
641    public const LATIN_SMALL_LETTER_I_WITH_HOOK_ABOVE                  = "\u{1EC9}";
642    public const LATIN_CAPITAL_LETTER_I_WITH_DOT_BELOW                 = "\u{1ECA}";
643    public const LATIN_SMALL_LETTER_I_WITH_DOT_BELOW                   = "\u{1ECB}";
644    public const LATIN_CAPITAL_LETTER_O_WITH_DOT_BELOW                 = "\u{1ECC}";
645    public const LATIN_SMALL_LETTER_O_WITH_DOT_BELOW                   = "\u{1ECD}";
646    public const LATIN_CAPITAL_LETTER_O_WITH_HOOK_ABOVE                = "\u{1ECE}";
647    public const LATIN_SMALL_LETTER_O_WITH_HOOK_ABOVE                  = "\u{1ECF}";
648    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_ACUTE      = "\u{1ED0}";
649    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_ACUTE        = "\u{1ED1}";
650    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_GRAVE      = "\u{1ED2}";
651    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_GRAVE        = "\u{1ED3}";
652    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_HOOK_ABOVE = "\u{1ED4}";
653    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_HOOK_ABOVE   = "\u{1ED5}";
654    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_TILDE      = "\u{1ED6}";
655    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_TILDE        = "\u{1ED7}";
656    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_DOT_BELOW  = "\u{1ED8}";
657    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_DOT_BELOW    = "\u{1ED9}";
658    public const LATIN_CAPITAL_LETTER_U_WITH_DOT_BELOW                 = "\u{1EE4}";
659    public const LATIN_SMALL_LETTER_U_WITH_DOT_BELOW                   = "\u{1EE5}";
660    public const LATIN_CAPITAL_LETTER_U_WITH_HOOK_ABOVE                = "\u{1EE6}";
661    public const LATIN_SMALL_LETTER_U_WITH_HOOK_ABOVE                  = "\u{1EE7}";
662    public const LATIN_CAPITAL_LETTER_Y_WITH_GRAVE                     = "\u{1EF2}";
663    public const LATIN_SMALL_LETTER_Y_WITH_GRAVE                       = "\u{1EF3}";
664    public const LATIN_CAPITAL_LETTER_Y_WITH_DOT_BELOW                 = "\u{1EF4}";
665    public const LATIN_SMALL_LETTER_Y_WITH_DOT_BELOW                   = "\u{1EF5}";
666    public const LATIN_CAPITAL_LETTER_Y_WITH_HOOK_ABOVE                = "\u{1EF6}";
667    public const LATIN_SMALL_LETTER_Y_WITH_HOOK_ABOVE                  = "\u{1EF7}";
668    public const LATIN_CAPITAL_LETTER_Y_WITH_TILDE                     = "\u{1EF8}";
669    public const LATIN_SMALL_LETTER_Y_WITH_TILDE                       = "\u{1EF9}";
670    public const ZERO_WIDTH_NON_JOINER                                 = "\u{200C}";
671    public const ZERO_WIDTH_JOINER                                     = "\u{200D}";
672    public const EN_DASH                                               = "\u{2013}";
673    public const EM_DASH                                               = "\u{2014}";
674    public const DOUBLE_LOW_LINE                                       = "\u{2017}";
675    public const LEFT_SINGLE_QUOTATION_MARK                            = "\u{2018}";
676    public const RIGHT_SINGLE_QUOTATION_MARK                           = "\u{2019}";
677    public const SINGLE_LOW_9_QUOTATION_MARK                           = "\u{201A}";
678    public const LEFT_DOUBLE_QUOTATION_MARK                            = "\u{201C}";
679    public const RIGHT_DOUBLE_QUOTATION_MARK                           = "\u{201D}";
680    public const DOUBLE_LOW_9_QUOTATION_MARK                           = "\u{201E}";
681    public const DAGGER                                                = "\u{2020}";
682    public const DOUBLE_DAGGER                                         = "\u{2021}";
683    public const BULLET                                                = "\u{2022}";
684    public const HORIZONTAL_ELLIPSIS                                   = "\u{2026}";
685    public const PER_MILLE_SIGN                                        = "\u{2030}";
686    public const SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK             = "\u{2039}";
687    public const SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK            = "\u{203A}";
688    public const FRACTION_SLASH                                        = "\u{2044}";
689    public const SUPERSCRIPT_LATIN_SMALL_LETTER_N                      = "\u{207F}";
690    public const PESETA_SIGN                                           = "\u{20A7}";
691    public const EURO_SIGN                                             = "\u{20AC}";
692    public const SCRIPT_SMALL_L                                        = "\u{2113}";
693    public const NUMERO_SIGN                                           = "\u{2116}";
694    public const SOUND_RECORDING_COPYRIGHT                             = "\u{2117}";
695    public const TRADE_MARK_SIGN                                       = "\u{2122}";
696    public const PARTIAL_DIFFERENTIAL                                  = "\u{2202}";
697    public const INCREMENT                                             = "\u{2206}";
698    public const N_ARY_PRODUCT                                         = "\u{220F}";
699    public const N_ARY_SUMMATION                                       = "\u{2211}";
700    public const BULLET_OPERATOR                                       = "\u{2219}";
701    public const SQUARE_ROOT                                           = "\u{221A}";
702    public const INFINITY                                              = "\u{221E}";
703    public const INTERSECTION                                          = "\u{2229}";
704    public const INTEGRAL                                              = "\u{222B}";
705    public const ALMOST_EQUAL_TO                                       = "\u{2248}";
706    public const NOT_EQUAL_TO                                          = "\u{2260}";
707    public const IDENTICAL_TO                                          = "\u{2261}";
708    public const LESS_THAN_OR_EQUAL_TO                                 = "\u{2264}";
709    public const GREATER_THAN_OR_EQUAL_TO                              = "\u{2265}";
710    public const REVERSED_NOT_SIGN                                     = "\u{2310}";
711    public const TOP_HALF_INTEGRAL                                     = "\u{2320}";
712    public const BOTTOM_HALF_INTEGRAL                                  = "\u{2321}";
713    public const BOX_DRAWINGS_LIGHT_HORIZONTAL                         = "\u{2500}";
714    public const BOX_DRAWINGS_LIGHT_VERTICAL                           = "\u{2502}";
715    public const BOX_DRAWINGS_LIGHT_DOWN_AND_RIGHT                     = "\u{250C}";
716    public const BOX_DRAWINGS_LIGHT_DOWN_AND_LEFT                      = "\u{2510}";
717    public const BOX_DRAWINGS_LIGHT_UP_AND_LEFT                        = "\u{2518}";
718    public const BOX_DRAWINGS_LIGHT_UP_AND_RIGHT                       = "\u{2514}";
719    public const BOX_DRAWINGS_LIGHT_VERTICAL_AND_RIGHT                 = "\u{251C}";
720    public const BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT                  = "\u{2524}";
721    public const BOX_DRAWINGS_LIGHT_DOWN_AND_HORIZONTAL                = "\u{252C}";
722    public const BOX_DRAWINGS_LIGHT_UP_AND_HORIZONTAL                  = "\u{2534}";
723    public const BOX_DRAWINGS_LIGHT_VERTICAL_AND_HORIZONTAL            = "\u{253C}";
724    public const BOX_DRAWINGS_DOUBLE_HORIZONTAL                        = "\u{2550}";
725    public const BOX_DRAWINGS_DOUBLE_VERTICAL                          = "\u{2551}";
726    public const BOX_DRAWINGS_DOWN_SINGLE_AND_RIGHT_DOUBLE             = "\u{2552}";
727    public const BOX_DRAWINGS_DOWN_DOUBLE_AND_RIGHT_SINGLE             = "\u{2553}";
728    public const BOX_DRAWINGS_DOUBLE_DOWN_AND_RIGHT                    = "\u{2554}";
729    public const BOX_DRAWINGS_DOWN_SINGLE_AND_LEFT_DOUBLE              = "\u{2555}";
730    public const BOX_DRAWINGS_DOWN_DOUBLE_AND_LEFT_SINGLE              = "\u{2556}";
731    public const BOX_DRAWINGS_DOUBLE_DOWN_AND_LEFT                     = "\u{2557}";
732    public const BOX_DRAWINGS_UP_SINGLE_AND_RIGHT_DOUBLE               = "\u{2558}";
733    public const BOX_DRAWINGS_UP_DOUBLE_AND_RIGHT_SINGLE               = "\u{2559}";
734    public const BOX_DRAWINGS_DOUBLE_UP_AND_RIGHT                      = "\u{255A}";
735    public const BOX_DRAWINGS_UP_SINGLE_AND_LEFT_DOUBLE                = "\u{255B}";
736    public const BOX_DRAWINGS_UP_DOUBLE_AND_LEFT_SINGLE                = "\u{255C}";
737    public const BOX_DRAWINGS_DOUBLE_UP_AND_LEFT                       = "\u{255D}";
738    public const BOX_DRAWINGS_VERTICAL_SINGLE_AND_RIGHT_DOUBLE         = "\u{255E}";
739    public const BOX_DRAWINGS_VERTICAL_DOUBLE_AND_RIGHT_SINGLE         = "\u{255F}";
740    public const BOX_DRAWINGS_DOUBLE_VERTICAL_AND_RIGHT                = "\u{2560}";
741    public const BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE          = "\u{2561}";
742    public const BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE          = "\u{2562}";
743    public const BOX_DRAWINGS_DOUBLE_VERTICAL_AND_LEFT                 = "\u{2563}";
744    public const BOX_DRAWINGS_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE        = "\u{2564}";
745    public const BOX_DRAWINGS_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE        = "\u{2565}";
746    public const BOX_DRAWINGS_DOUBLE_DOWN_AND_HORIZONTAL               = "\u{2566}";
747    public const BOX_DRAWINGS_UP_SINGLE_AND_HORIZONTAL_DOUBLE          = "\u{2567}";
748    public const BOX_DRAWINGS_UP_DOUBLE_AND_HORIZONTAL_SINGLE          = "\u{2568}";
749    public const BOX_DRAWINGS_BOX_DRAWINGS_DOUBLE_UP_AND_HORIZONTAL    = "\u{2569}";
750    public const BOX_DRAWINGS_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE    = "\u{256A}";
751    public const BOX_DRAWINGS_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE    = "\u{256B}";
752    public const BOX_DRAWINGS_DOUBLE_VERTICAL_AND_HORIZONTAL           = "\u{256C}";
753    public const UPPER_HALF_BLOCK                                      = "\u{2580}";
754    public const LOWER_HALF_BLOCK                                      = "\u{2584}";
755    public const FULL_BLOCK                                            = "\u{2588}";
756    public const LEFT_HALF_BLOCK                                       = "\u{258C}";
757    public const RIGHT_HALF_BLOCK                                      = "\u{2590}";
758    public const LIGHT_SHADE                                           = "\u{2591}";
759    public const MEDIUM_SHADE                                          = "\u{2592}";
760    public const DARK_SHADE                                            = "\u{2593}";
761    public const BLACK_SQUARE                                          = "\u{25A0}";
762    public const WHITE_SQUARE                                          = "\u{25A1}";
763    public const LOZENGE                                               = "\u{25CA}";
764    public const MUSIC_FLAT_SIGN                                       = "\u{266D}";
765    public const MUSIC_SHARP_SIGN                                      = "\u{266F}";
766    public const LATIN_SMALL_LIGATURE_FI                               = "\u{FB01}";
767    public const LATIN_SMALL_LIGATURE_FL                               = "\u{FB02}";
768    public const BYTE_ORDER_MARK                                       = "\u{FEFF}";
769    public const REPLACEMENT_CHARACTER                                 = "\u{FFFD}";
770
771    public const COMPOSED_CHARACTERS = [
772        'A' . self::COMBINING_ACUTE_ACCENT      => self::LATIN_CAPITAL_LETTER_A_WITH_ACUTE,
773        'A' . self::COMBINING_CIRCUMFLEX_ACCENT => self::LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX,
774        'A' . self::COMBINING_DIAERESIS         => self::LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS,
775        'A' . self::COMBINING_GRAVE_ACCENT      => self::LATIN_CAPITAL_LETTER_A_WITH_GRAVE,
776        'A' . self::COMBINING_RING_ABOVE        => self::LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE,
777        'A' . self::COMBINING_TILDE             => self::LATIN_CAPITAL_LETTER_A_WITH_TILDE,
778        'C' . self::COMBINING_CEDILLA           => self::LATIN_CAPITAL_LETTER_C_WITH_CEDILLA,
779        'E' . self::COMBINING_ACUTE_ACCENT      => self::LATIN_CAPITAL_LETTER_E_WITH_ACUTE,
780        'E' . self::COMBINING_DIAERESIS         => self::LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS,
781        'E' . self::COMBINING_CIRCUMFLEX_ACCENT => self::LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX,
782        'E' . self::COMBINING_GRAVE_ACCENT      => self::LATIN_CAPITAL_LETTER_E_WITH_GRAVE,
783        'a' . self::COMBINING_CIRCUMFLEX_ACCENT => self::LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX,
784        'a' . self::COMBINING_DIAERESIS         => self::LATIN_SMALL_LETTER_A_WITH_DIAERESIS,
785        'e' . self::COMBINING_ACUTE_ACCENT      => self::LATIN_SMALL_LETTER_E_WITH_ACUTE,
786        'u' . self::COMBINING_DIAERESIS         => self::LATIN_SMALL_LETTER_U_WITH_DIAERESIS,
787    ];
788
789    /**
790     * Convert text from (potentially invalid) UTF-8 to UTF-8.
791     *
792     * @param string $text
793     *
794     * @return string
795     */
796    public function fromUtf8(string $text): string
797    {
798        if (preg_match('//u', $text) === false) {
799            // Not UTF8?
800            mb_substitute_character(0xFFFD);
801
802            return mb_convert_encoding($text, 'UTF-8', 'UTF-8');
803        }
804
805        return $text;
806    }
807
808    /**
809     * Convert text from (potentially invalid) UTF-8 to UTF-8.
810     *
811     * @param string $text
812     *
813     * @return string
814     */
815    public function toUtf8(string $text): string
816    {
817        return $this->fromUtf8($text);
818    }
819
820    /**
821     * Create a UTF8 character from a code.
822     *
823     * @param int $code
824     *
825     * @return string
826     */
827    public static function chr(int $code): string
828    {
829        if ($code < 0 || $code > 0x1FFFFF) {
830            throw new InvalidArgumentException((string)$code);
831        }
832
833        if ($code <= 0x7F) {
834            return chr($code);
835        }
836
837        if ($code <= 0x7FF) {
838            return
839                chr(($code >> 6) + 0xC0) .
840                chr(($code & 0x3F) + 0x80);
841        }
842
843        if ($code <= 0xFFFF) {
844            return
845                chr(($code >> 12) + 0xE0) .
846                chr((($code >> 6) & 0x3F) + 0x80) .
847                chr(($code & 0x3F) + 0x80);
848        }
849
850        return
851            chr(($code >> 18) + 0xF0) .
852            chr((($code >> 12) & 0x3F) + 0x80) .
853            chr((($code >> 6) & 0x3F) + 0x80) .
854            chr(($code & 0x3F) + 0x80);
855    }
856}
857