xref: /webtrees/app/Encodings/UTF8.php (revision d11be7027e34e3121be11cc025421873364403f9)
11c6adce8SGreg Roach<?php
21c6adce8SGreg Roach
31c6adce8SGreg Roach/**
41c6adce8SGreg Roach * webtrees: online genealogy
5*d11be702SGreg Roach * Copyright (C) 2023 webtrees development team
61c6adce8SGreg Roach * This program is free software: you can redistribute it and/or modify
71c6adce8SGreg Roach * it under the terms of the GNU General Public License as published by
81c6adce8SGreg Roach * the Free Software Foundation, either version 3 of the License, or
91c6adce8SGreg Roach * (at your option) any later version.
101c6adce8SGreg Roach * This program is distributed in the hope that it will be useful,
111c6adce8SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
121c6adce8SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
131c6adce8SGreg Roach * GNU General Public License for more details.
141c6adce8SGreg Roach * You should have received a copy of the GNU General Public License
151c6adce8SGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>.
161c6adce8SGreg Roach */
171c6adce8SGreg Roach
181c6adce8SGreg Roachdeclare(strict_types=1);
191c6adce8SGreg Roach
201c6adce8SGreg Roachnamespace Fisharebest\Webtrees\Encodings;
211c6adce8SGreg Roach
221c6adce8SGreg Roachuse InvalidArgumentException;
231c6adce8SGreg Roach
241c6adce8SGreg Roachuse function chr;
251c6adce8SGreg Roachuse function mb_substitute_character;
261c6adce8SGreg Roach
271c6adce8SGreg Roach/**
281c6adce8SGreg Roach * Convert between (potentially invalid) UTF-8 and UTF-8.
291c6adce8SGreg Roach */
301c6adce8SGreg Roachclass UTF8 extends AbstractEncoding
311c6adce8SGreg Roach{
321c6adce8SGreg Roach    public const NAME = 'UTF-8';
331c6adce8SGreg Roach
341c6adce8SGreg Roach    public const START_OF_STRING                                       = "\u{0098}";
351c6adce8SGreg Roach    public const STRING_TERMINATOR                                     = "\u{009C}";
361c6adce8SGreg Roach    public const NO_BREAK_SPACE                                        = "\u{00A0}";
371c6adce8SGreg Roach    public const INVERTED_EXCLAMATION_MARK                             = "\u{00A1}";
381c6adce8SGreg Roach    public const CENT_SIGN                                             = "\u{00A2}";
391c6adce8SGreg Roach    public const POUND_SIGN                                            = "\u{00A3}";
401c6adce8SGreg Roach    public const CURRENCY_SIGN                                         = "\u{00A4}";
411c6adce8SGreg Roach    public const YEN_SIGN                                              = "\u{00A5}";
421c6adce8SGreg Roach    public const BROKEN_BAR                                            = "\u{00A6}";
431c6adce8SGreg Roach    public const SECTION_SIGN                                          = "\u{00A7}";
441c6adce8SGreg Roach    public const DIAERESIS                                             = "\u{00A8}";
451c6adce8SGreg Roach    public const COPYRIGHT_SIGN                                        = "\u{00A9}";
461c6adce8SGreg Roach    public const FEMININE_ORDINAL_INDICATOR                            = "\u{00AA}";
471c6adce8SGreg Roach    public const LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK             = "\u{00AB}";
481c6adce8SGreg Roach    public const NOT_SIGN                                              = "\u{00AC}";
491c6adce8SGreg Roach    public const SOFT_HYPHEN                                           = "\u{00AD}";
501c6adce8SGreg Roach    public const REGISTERED_SIGN                                       = "\u{00AE}";
511c6adce8SGreg Roach    public const MACRON                                                = "\u{00AF}";
521c6adce8SGreg Roach    public const DEGREE_SIGN                                           = "\u{00B0}";
531c6adce8SGreg Roach    public const PLUS_MINUS_SIGN                                       = "\u{00B1}";
541c6adce8SGreg Roach    public const SUPERSCRIPT_TWO                                       = "\u{00B2}";
551c6adce8SGreg Roach    public const SUPERSCRIPT_THREE                                     = "\u{00B3}";
561c6adce8SGreg Roach    public const ACUTE_ACCENT                                          = "\u{00B4}";
571c6adce8SGreg Roach    public const MICRO_SIGN                                            = "\u{00B5}";
581c6adce8SGreg Roach    public const PILCROW_SIGN                                          = "\u{00B6}";
591c6adce8SGreg Roach    public const MIDDLE_DOT                                            = "\u{00B7}";
601c6adce8SGreg Roach    public const CEDILLA                                               = "\u{00B8}";
611c6adce8SGreg Roach    public const SUPERSCRIPT_ONE                                       = "\u{00B9}";
621c6adce8SGreg Roach    public const MASCULINE_ORDINAL_INDICATOR                           = "\u{00BA}";
631c6adce8SGreg Roach    public const RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK            = "\u{00BB}";
641c6adce8SGreg Roach    public const VULGAR_FRACTION_ONE_QUARTER                           = "\u{00BC}";
651c6adce8SGreg Roach    public const VULGAR_FRACTION_ONE_HALF                              = "\u{00BD}";
661c6adce8SGreg Roach    public const VULGAR_FRACTION_THREE_QUARTERS                        = "\u{00BE}";
671c6adce8SGreg Roach    public const INVERTED_QUESTION_MARK                                = "\u{00BF}";
681c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_GRAVE                     = "\u{00C0}";
691c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_ACUTE                     = "\u{00C1}";
701c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX                = "\u{00C2}";
711c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_TILDE                     = "\u{00C3}";
721c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS                 = "\u{00C4}";
731c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE                = "\u{00C5}";
741c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_AE                               = "\u{00C6}";
751c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_C_WITH_CEDILLA                   = "\u{00C7}";
761c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_GRAVE                     = "\u{00C8}";
771c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_ACUTE                     = "\u{00C9}";
781c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX                = "\u{00CA}";
791c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS                 = "\u{00CB}";
801c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_GRAVE                     = "\u{00CC}";
811c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_ACUTE                     = "\u{00CD}";
821c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX                = "\u{00CE}";
831c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS                 = "\u{00CF}";
841c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_ETH                              = "\u{00D0}";
851c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_N_WITH_TILDE                     = "\u{00D1}";
861c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_GRAVE                     = "\u{00D2}";
871c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_ACUTE                     = "\u{00D3}";
881c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX                = "\u{00D4}";
891c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_TILDE                     = "\u{00D5}";
901c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS                 = "\u{00D6}";
911c6adce8SGreg Roach    public const MULTIPLICATION_SIGN                                   = "\u{00D7}";
921c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_STROKE                    = "\u{00D8}";
931c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_GRAVE                     = "\u{00D9}";
941c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_ACUTE                     = "\u{00DA}";
951c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX                = "\u{00DB}";
961c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS                 = "\u{00DC}";
971c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Y_WITH_ACUTE                     = "\u{00DD}";
981c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_THORN                            = "\u{00DE}";
991c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_SHARP_S                            = "\u{00DF}";
1001c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_GRAVE                       = "\u{00E0}";
1011c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_ACUTE                       = "\u{00E1}";
1021c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX                  = "\u{00E2}";
1031c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_TILDE                       = "\u{00E3}";
1041c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_DIAERESIS                   = "\u{00E4}";
1051c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_RING_ABOVE                  = "\u{00E5}";
1061c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_AE                                 = "\u{00E6}";
1071c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_C_WITH_CEDILLA                     = "\u{00E7}";
1081c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_GRAVE                       = "\u{00E8}";
1091c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_ACUTE                       = "\u{00E9}";
1101c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX                  = "\u{00EA}";
1111c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_DIAERESIS                   = "\u{00EB}";
1121c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_I_WITH_GRAVE                       = "\u{00EC}";
1131c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_I_WITH_ACUTE                       = "\u{00ED}";
1141c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX                  = "\u{00EE}";
1151c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_I_WITH_DIAERESIS                   = "\u{00EF}";
1161c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_ETH                                = "\u{00F0}";
1171c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_N_WITH_TILDE                       = "\u{00F1}";
1181c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_GRAVE                       = "\u{00F2}";
1191c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_ACUTE                       = "\u{00F3}";
1201c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX                  = "\u{00F4}";
1211c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_TILDE                       = "\u{00F5}";
1221c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_DIAERESIS                   = "\u{00F6}";
1231c6adce8SGreg Roach    public const DIVISION_SIGN                                         = "\u{00F7}";
1241c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_STROKE                      = "\u{00F8}";
1251c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_GRAVE                       = "\u{00F9}";
1261c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_ACUTE                       = "\u{00FA}";
1271c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX                  = "\u{00FB}";
1281c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS                   = "\u{00FC}";
1291c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Y_WITH_ACUTE                       = "\u{00FD}";
1301c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_THORN                              = "\u{00FE}";
1311c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Y_WITH_DIAERESIS                   = "\u{00FF}";
1321c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_MACRON                    = "\u{0100}";
1331c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_MACRON                      = "\u{0101}";
1341c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE                     = "\u{0102}";
1351c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_BREVE                       = "\u{0103}";
1361c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_OGONEK                    = "\u{0104}";
1371c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_OGONEK                      = "\u{0105}";
1381c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_C_WITH_ACUTE                     = "\u{0106}";
1391c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_C_WITH_ACUTE                       = "\u{0107}";
1401c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_C_WITH_CIRCUMFLEX                = "\u{0108}";
1411c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_C_WITH_CIRCUMFLEX                  = "\u{0109}";
1421c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_C_WITH_DOT_ABOVE                 = "\u{010A}";
1431c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_C_WITH_DOT_ABOVE                   = "\u{010B}";
1441c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_C_WITH_CARON                     = "\u{010C}";
1451c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_C_WITH_CARON                       = "\u{010D}";
1461c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_D_WITH_CARON                     = "\u{010E}";
1471c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_D_WITH_CARON                       = "\u{010F}";
1481c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_D_WITH_STROKE                    = "\u{0110}";
1491c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_D_WITH_STROKE                      = "\u{0111}";
1501c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_MACRON                    = "\u{0112}";
1511c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_MACRON                      = "\u{0113}";
1521c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_BREVE                     = "\u{0114}";
1531c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_BREVE                       = "\u{0115}";
1541c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_DOT_ABOVE                 = "\u{0116}";
1551c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_DOT_ABOVE                   = "\u{0117}";
1561c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_OGONEK                    = "\u{0118}";
1571c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_OGONEK                      = "\u{0119}";
1581c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_CARON                     = "\u{011A}";
1591c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_CARON                       = "\u{011B}";
1601c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_G_WITH_CIRCUMFLEX                = "\u{011C}";
1611c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_G_WITH_CIRCUMFLEX                  = "\u{011D}";
1621c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_G_WITH_BREVE                     = "\u{011E}";
1631c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_G_WITH_BREVE                       = "\u{011F}";
1641c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_G_WITH_DOT_ABOVE                 = "\u{0120}";
1651c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_G_WITH_DOT_ABOVE                   = "\u{0121}";
1661c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_G_WITH_CEDILLA                   = "\u{0122}";
1671c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_G_WITH_CEDILLA                     = "\u{0123}";
1681c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_H_WITH_CIRCUMFLEX                = "\u{0124}";
1691c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_H_WITH_CIRCUMFLEX                  = "\u{0125}";
1701c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_H_WITH_STROKE                    = "\u{0126}";
1711c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_H_WITH_STROKE                      = "\u{0127}";
1721c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_TILDE                     = "\u{0128}";
1731c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_I_WITH_TILDE                       = "\u{0129}";
1741c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_MACRON                    = "\u{012A}";
1751c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_I_WITH_MACRON                      = "\u{012B}";
1761c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_BREVE                     = "\u{012C}";
1771c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_I_WITH_BREVE                       = "\u{012D}";
1781c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_OGONEK                    = "\u{012E}";
1791c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_I_WITH_OGONEK                      = "\u{012F}";
1801c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE                 = "\u{0130}";
1811c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_DOTLESS_I                          = "\u{0131}";
1821c6adce8SGreg Roach    public const LATIN_CAPITAL_LIGATURE_IJ                             = "\u{0132}";
1831c6adce8SGreg Roach    public const LATIN_SMALL_LIGATURE_IJ                               = "\u{0133}";
1841c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_J_WITH_CIRCUMFLEX                = "\u{0134}";
1851c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_J_WITH_CIRCUMFLEX                  = "\u{0135}";
1861c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_K_WITH_CEDILLA                   = "\u{0136}";
1871c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_K_WITH_CEDILLA                     = "\u{0137}";
1881c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_KRA                                = "\u{0138}";
1891c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_L_WITH_ACUTE                     = "\u{0139}";
1901c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_L_WITH_ACUTE                       = "\u{013A}";
1911c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_L_WITH_CEDILLA                   = "\u{013B}";
1921c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_L_WITH_CEDILLA                     = "\u{013C}";
1931c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_L_WITH_CARON                     = "\u{013D}";
1941c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_L_WITH_CARON                       = "\u{013E}";
1951c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_L_WITH_MIDDLE_DOT                = "\u{013F}";
1961c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_L_WITH_MIDDLE_DOT                  = "\u{0140}";
1971c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_L_WITH_STROKE                    = "\u{0141}";
1981c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_L_WITH_STROKE                      = "\u{0142}";
1991c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_N_WITH_ACUTE                     = "\u{0143}";
2001c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_N_WITH_ACUTE                       = "\u{0144}";
2011c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_N_WITH_CEDILLA                   = "\u{0145}";
2021c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_N_WITH_CEDILLA                     = "\u{0146}";
2031c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_N_WITH_CARON                     = "\u{0147}";
2041c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_N_WITH_CARON                       = "\u{0148}";
2051c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_N_PRECEDED_BY_APOSTROPHE           = "\u{0149}";
2061c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_ENG                              = "\u{014A}";
2071c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_ENG                                = "\u{014B}";
2081c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_MACRON                    = "\u{014C}";
2091c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_MACRON                      = "\u{014D}";
2101c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_BREVE                     = "\u{014E}";
2111c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_BREVE                       = "\u{014F}";
2121c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_ACUTE              = "\u{0150}";
2131c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_DOUBLE_ACUTE                = "\u{0151}";
2141c6adce8SGreg Roach    public const LATIN_CAPITAL_LIGATURE_OE                             = "\u{0152}";
2151c6adce8SGreg Roach    public const LATIN_SMALL_LIGATURE_OE                               = "\u{0153}";
2161c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_R_WITH_ACUTE                     = "\u{0154}";
2171c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_R_WITH_ACUTE                       = "\u{0155}";
2181c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_R_WITH_CEDILLA                   = "\u{0156}";
2191c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_R_WITH_CEDILLA                     = "\u{0157}";
2201c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_R_WITH_CARON                     = "\u{0158}";
2211c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_R_WITH_CARON                       = "\u{0159}";
2221c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_S_WITH_ACUTE                     = "\u{015A}";
2231c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_S_WITH_ACUTE                       = "\u{015B}";
2241c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_S_WITH_CIRCUMFLEX                = "\u{015C}";
2251c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_S_WITH_CIRCUMFLEX                  = "\u{015D}";
2261c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_S_WITH_CEDILLA                   = "\u{015E}";
2271c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_S_WITH_CEDILLA                     = "\u{015F}";
2281c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_S_WITH_CARON                     = "\u{0160}";
2291c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_S_WITH_CARON                       = "\u{0161}";
2301c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_T_WITH_CEDILLA                   = "\u{0162}";
2311c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_T_WITH_CEDILLA                     = "\u{0163}";
2321c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_T_WITH_CARON                     = "\u{0164}";
2331c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_T_WITH_CARON                       = "\u{0165}";
2341c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_T_WITH_STROKE                    = "\u{0166}";
2351c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_T_WITH_STROKE                      = "\u{0167}";
2361c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_TILDE                     = "\u{0168}";
2371c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_TILDE                       = "\u{0169}";
2381c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_MACRON                    = "\u{016A}";
2391c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_MACRON                      = "\u{016B}";
2401c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_BREVE                     = "\u{016C}";
2411c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_BREVE                       = "\u{016D}";
2421c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_RING_ABOVE                = "\u{016E}";
2431c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_RING_ABOVE                  = "\u{016F}";
2441c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_ACUTE              = "\u{0170}";
2451c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_DOUBLE_ACUTE                = "\u{0171}";
2461c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_OGONEK                    = "\u{0172}";
2471c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_OGONEK                      = "\u{0173}";
2481c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_W_WITH_CIRCUMFLEX                = "\u{0174}";
2491c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_W_WITH_CIRCUMFLEX                  = "\u{0175}";
2501c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Y_WITH_CIRCUMFLEX                = "\u{0176}";
2511c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Y_WITH_CIRCUMFLEX                  = "\u{0177}";
2521c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS                 = "\u{0178}";
2531c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Z_WITH_ACUTE                     = "\u{0179}";
2541c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Z_WITH_ACUTE                       = "\u{017A}";
2551c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Z_WITH_DOT_ABOVE                 = "\u{017B}";
2561c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Z_WITH_DOT_ABOVE                   = "\u{017C}";
2571c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Z_WITH_CARON                     = "\u{017D}";
2581c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Z_WITH_CARON                       = "\u{017E}";
2591c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_LONG_S                             = "\u{017F}";
2601c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_B_WITH_STROKE                      = "\u{0180}";
2611c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_B_WITH_HOOK                      = "\u{0181}";
2621c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_B_WITH_TOPBAR                    = "\u{0182}";
2631c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_B_WITH_TOPBAR                      = "\u{0183}";
2641c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_F_WITH_HOOK                      = "\u{0191}";
2651c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_F_WITH_HOOK                        = "\u{0192}";
2661c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_HORN                        = "\u{01A1}";
2671c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_HORN                      = "\u{01A0}";
2681c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_HORN                      = "\u{01AF}";
2691c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_HORN                        = "\u{01B0}";
2701c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_CARON                     = "\u{01CD}";
2711c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_CARON                       = "\u{01CE}";
2721c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_CARON                     = "\u{01CF}";
2731c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_I_WITH_CARON                       = "\u{01D0}";
2741c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_CARON                     = "\u{01D1}";
2751c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_CARON                       = "\u{01D2}";
2761c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_CARON                     = "\u{01D3}";
2771c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_CARON                       = "\u{01D4}";
2781c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_MACRON      = "\u{01D5}";
2791c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_MACRON        = "\u{01D6}";
2801c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_ACUTE       = "\u{01D7}";
2811c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_ACUTE         = "\u{01D8}";
2821c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_CARON       = "\u{01D9}";
2831c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_CARON         = "\u{01DA}";
2841c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_GRAVE       = "\u{01DB}";
2851c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_GRAVE         = "\u{01DC}";
2861c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS_AND_MACRON      = "\u{01DE}";
2871c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_DIAERESIS_AND_MACRON        = "\u{01DF}";
2881c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON      = "\u{01E0}";
2891c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON        = "\u{01E1}";
2901c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_AE_WITH_MACRON                   = "\u{01E2}";
2911c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_AE_WITH_MACRON                     = "\u{01E3}";
2921c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_G_WITH_CARON                     = "\u{01E6}";
2931c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_G_WITH_CARON                       = "\u{01E7}";
2941c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_K_WITH_CARON                     = "\u{01E8}";
2951c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_K_WITH_CARON                       = "\u{01E9}";
2961c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_OGONEK                    = "\u{01EA}";
2971c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_OGONEK                      = "\u{01EB}";
2981c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_OGONEK_AND_MACRON         = "\u{01EC}";
2991c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_OGONEK_AND_MACRON           = "\u{01ED}";
3001c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_J_WITH_CARON                       = "\u{01F0}";
3011c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_G_WITH_ACUTE                     = "\u{01F4}";
3021c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_G_WITH_ACUTE                       = "\u{01F5}";
3031c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_N_WITH_GRAVE                     = "\u{01F8}";
3041c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_N_WITH_GRAVE                       = "\u{01F9}";
3051c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE      = "\u{01FA}";
3061c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE        = "\u{01FB}";
3071c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_AE_WITH_ACUTE                    = "\u{01FC}";
3081c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_AE_WITH_ACUTE                      = "\u{01FD}";
3091c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_STROKE_AND_ACUTE          = "\u{01FE}";
3101c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_STROKE_AND_ACUTE            = "\u{01FF}";
3111c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_S_WITH_COMMA_BELOW               = "\u{0218}";
3121c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_S_WITH_COMMA_BELOW                 = "\u{0219}";
3131c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_T_WITH_COMMA_BELOW               = "\u{021A}";
3141c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_T_WITH_COMMA_BELOW                 = "\u{021B}";
3151c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_H_WITH_CARON                     = "\u{021E}";
3161c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_H_WITH_CARON                       = "\u{021F}";
3171c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE                 = "\u{0226}";
3181c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE                   = "\u{0227}";
3191c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_CEDILLA                   = "\u{0228}";
3201c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_CEDILLA                     = "\u{0229}";
3211c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS_AND_MACRON      = "\u{022A}";
3221c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_DIAERESIS_AND_MACRON        = "\u{022B}";
3231c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_MACRON          = "\u{022C}";
3241c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_TILDE_AND_MACRON            = "\u{022D}";
3251c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE                 = "\u{022E}";
3261c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE                   = "\u{022F}";
3271c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON      = "\u{0230}";
3281c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON        = "\u{0231}";
3291c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Y_WITH_MACRON                    = "\u{0232}";
3301c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Y_WITH_MACRON                      = "\u{0233}";
3311c6adce8SGreg Roach    public const MODIFIER_LETTER_PRIME                                 = "\u{02B9}";
3321c6adce8SGreg Roach    public const MODIFIER_LETTER_DOUBLE_PRIME                          = "\u{02BA}";
3331c6adce8SGreg Roach    public const MODIFIER_LETTER_TURNED_COMMA                          = "\u{02BB}";
3341c6adce8SGreg Roach    public const MODIFIER_LETTER_APOSTROPHE                            = "\u{02BC}";
3351c6adce8SGreg Roach    public const MODIFIER_LETTER_CIRCUMFLEX_ACCENT                     = "\u{02C6}";
3361c6adce8SGreg Roach    public const CARON                                                 = "\u{02C7}";
3371c6adce8SGreg Roach    public const BREVE                                                 = "\u{02D8}";
3381c6adce8SGreg Roach    public const DOT_ABOVE                                             = "\u{02D9}";
3391c6adce8SGreg Roach    public const RING_ABOVE                                            = "\u{02DA}";
3401c6adce8SGreg Roach    public const OGONEK                                                = "\u{02DB}";
3411c6adce8SGreg Roach    public const SMALL_TILDE                                           = "\u{02DC}";
3421c6adce8SGreg Roach    public const DOUBLE_ACUTE_ACCENT                                   = "\u{02DD}";
3431c6adce8SGreg Roach    public const COMBINING_GRAVE_ACCENT                                = "\u{0300}";
3441c6adce8SGreg Roach    public const COMBINING_ACUTE_ACCENT                                = "\u{0301}";
3451c6adce8SGreg Roach    public const COMBINING_CIRCUMFLEX_ACCENT                           = "\u{0302}";
3461c6adce8SGreg Roach    public const COMBINING_TILDE                                       = "\u{0303}";
3471c6adce8SGreg Roach    public const COMBINING_MACRON                                      = "\u{0304}";
3481c6adce8SGreg Roach    public const COMBINING_OVERLINE                                    = "\u{0305}";
3491c6adce8SGreg Roach    public const COMBINING_BREVE                                       = "\u{0306}";
3501c6adce8SGreg Roach    public const COMBINING_DOT_ABOVE                                   = "\u{0307}";
3511c6adce8SGreg Roach    public const COMBINING_DIAERESIS                                   = "\u{0308}";
3521c6adce8SGreg Roach    public const COMBINING_HOOK_ABOVE                                  = "\u{0309}";
3531c6adce8SGreg Roach    public const COMBINING_RING_ABOVE                                  = "\u{030A}";
3541c6adce8SGreg Roach    public const COMBINING_DOUBLE_ACUTE_ACCENT                         = "\u{030B}";
3551c6adce8SGreg Roach    public const COMBINING_CARON                                       = "\u{030C}";
3561c6adce8SGreg Roach    public const COMBINING_CANDRABINDU                                 = "\u{0310}";
3571c6adce8SGreg Roach    public const COMBINING_COMMA_ABOVE                                 = "\u{0313}";
3581c6adce8SGreg Roach    public const COMBINING_COMMA_ABOVE_RIGHT                           = "\u{0315}";
3591c6adce8SGreg Roach    public const COMBINING_HORN                                        = "\u{031B}";
3601c6adce8SGreg Roach    public const COMBINING_LEFT_HALF_RING_BELOW                        = "\u{031C}";
3611c6adce8SGreg Roach    public const COMBINING_DOT_BELOW                                   = "\u{0323}";
3621c6adce8SGreg Roach    public const COMBINING_DIAERESIS_BELOW                             = "\u{0324}";
3631c6adce8SGreg Roach    public const COMBINING_RING_BELOW                                  = "\u{0325}";
3641c6adce8SGreg Roach    public const COMBINING_COMMA_BELOW                                 = "\u{0326}";
3651c6adce8SGreg Roach    public const COMBINING_CEDILLA                                     = "\u{0327}";
3661c6adce8SGreg Roach    public const COMBINING_OGONEK                                      = "\u{0328}";
3671c6adce8SGreg Roach    public const COMBINING_BRIDGE_BELOW                                = "\u{032A}";
3681c6adce8SGreg Roach    public const COMBINING_BREVE_BELOW                                 = "\u{032E}";
3691c6adce8SGreg Roach    public const COMBINING_LOW_LINE                                    = "\u{0332}";
3701c6adce8SGreg Roach    public const COMBINING_DOUBLE_LOW_LINE                             = "\u{0333}";
37152288ec7SGreg Roach    public const COMBINING_SHORT_STROKE_OVERLAY                        = "\u{0335}";
37252288ec7SGreg Roach    public const COMBINING_LONG_STROKE_OVERLAY                         = "\u{0336}";
37352288ec7SGreg Roach    public const COMBINING_SHORT_SOLIDUS_OVERLAY                       = "\u{0338}";
3741c6adce8SGreg Roach    public const COMBINING_LONG_SOLIDUS_OVERLAY                        = "\u{0338}";
3751c6adce8SGreg Roach    public const COMBINING_DOUBLE_TILDE                                = "\u{0360}";
3761c6adce8SGreg Roach    public const COMBINING_DOUBLE_INVERTED_BREVE                       = "\u{0361}";
3771c6adce8SGreg Roach    public const GREEK_CAPITAL_LETTER_GAMMA                            = "\u{0393}";
3781c6adce8SGreg Roach    public const GREEK_CAPITAL_LETTER_THETA                            = "\u{0398}";
3791c6adce8SGreg Roach    public const GREEK_CAPITAL_LETTER_SIGMA                            = "\u{03A3}";
3801c6adce8SGreg Roach    public const GREEK_CAPITAL_LETTER_PHI                              = "\u{03A6}";
3811c6adce8SGreg Roach    public const GREEK_CAPITAL_LETTER_OMEGA                            = "\u{03A9}";
3821c6adce8SGreg Roach    public const GREEK_SMALL_LETTER_ALPHA                              = "\u{03B1}";
3831c6adce8SGreg Roach    public const GREEK_SMALL_LETTER_DELTA                              = "\u{03B4}";
3841c6adce8SGreg Roach    public const GREEK_SMALL_LETTER_EPSILON                            = "\u{03B5}";
3851c6adce8SGreg Roach    public const GREEK_SMALL_LETTER_PI                                 = "\u{03C0}";
3861c6adce8SGreg Roach    public const GREEK_SMALL_LETTER_SIGMA                              = "\u{03C3}";
3871c6adce8SGreg Roach    public const GREEK_SMALL_LETTER_TAU                                = "\u{03C4}";
3881c6adce8SGreg Roach    public const GREEK_SMALL_LETTER_PHI                                = "\u{03C6}";
3891c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_IO                            = "\u{0401}";
3901c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_DJE                           = "\u{0402}";
3911c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_GJE                           = "\u{0403}";
3921c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_UKRANIAN_IE                   = "\u{0404}";
3931c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_DZE                           = "\u{0405}";
3941c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_BYELORUSSIAN_UKRAINIAN_I      = "\u{0406}";
3951c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_YI                            = "\u{0407}";
3961c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_JE                            = "\u{0408}";
3971c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_LJE                           = "\u{0409}";
3981c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_NJE                           = "\u{040A}";
3991c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_TSHE                          = "\u{040B}";
4001c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_KJE                           = "\u{040C}";
4011c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_SHORT_U                       = "\u{040E}";
4021c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_DZHE                          = "\u{040F}";
4031c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_A                             = "\u{0410}";
4041c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_BE                            = "\u{0411}";
4051c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_VE                            = "\u{0412}";
4061c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_GHE                           = "\u{0413}";
4071c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_DE                            = "\u{0414}";
4081c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_IE                            = "\u{0415}";
4091c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_ZHE                           = "\u{0416}";
4101c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_ZE                            = "\u{0417}";
4111c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_I                             = "\u{0418}";
4121c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_SHORT_I                       = "\u{0419}";
4131c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_KA                            = "\u{041A}";
4141c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_EL                            = "\u{041B}";
4151c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_EM                            = "\u{041C}";
4161c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_EN                            = "\u{041D}";
4171c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_O                             = "\u{041E}";
4181c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_PE                            = "\u{041F}";
4191c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_ER                            = "\u{0420}";
4201c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_ES                            = "\u{0421}";
4211c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_TE                            = "\u{0422}";
4221c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_U                             = "\u{0423}";
4231c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_EF                            = "\u{0424}";
4241c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_HA                            = "\u{0425}";
4251c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_TSE                           = "\u{0426}";
4261c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_CHE                           = "\u{0427}";
4271c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_SHA                           = "\u{0428}";
4281c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_SHCHA                         = "\u{0429}";
4291c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_HARD_SIGN                     = "\u{042A}";
4301c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_YERU                          = "\u{042B}";
4311c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_SOFT_SIGN                     = "\u{042C}";
4321c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_E                             = "\u{042D}";
4331c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_YU                            = "\u{042E}";
4341c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_YA                            = "\u{042F}";
4351c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_A                               = "\u{0430}";
4361c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_BE                              = "\u{0431}";
4371c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_VE                              = "\u{0432}";
4381c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_GHE                             = "\u{0433}";
4391c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_DE                              = "\u{0434}";
4401c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_IE                              = "\u{0435}";
4411c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_ZHE                             = "\u{0436}";
4421c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_ZE                              = "\u{0437}";
4431c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_I                               = "\u{0438}";
4441c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_SHORT_I                         = "\u{0439}";
4451c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_KA                              = "\u{043A}";
4461c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_EL                              = "\u{043B}";
4471c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_EM                              = "\u{043C}";
4481c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_EN                              = "\u{043D}";
4491c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_O                               = "\u{043E}";
4501c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_PE                              = "\u{043F}";
4511c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_ER                              = "\u{0440}";
4521c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_ES                              = "\u{0441}";
4531c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_TE                              = "\u{0442}";
4541c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_U                               = "\u{0443}";
4551c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_EF                              = "\u{0444}";
4561c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_HA                              = "\u{0445}";
4571c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_TSE                             = "\u{0446}";
4581c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_CHE                             = "\u{0447}";
4591c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_SHA                             = "\u{0448}";
4601c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_SHCHA                           = "\u{0449}";
4611c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_HARD_SIGN                       = "\u{044A}";
4621c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_YERU                            = "\u{044B}";
4631c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_SOFT_SIGN                       = "\u{044C}";
4641c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_E                               = "\u{044D}";
4651c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_YU                              = "\u{044E}";
4661c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_YA                              = "\u{044F}";
4671c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_IO                              = "\u{0451}";
4681c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_DJE                             = "\u{0452}";
4691c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_GJE                             = "\u{0453}";
4701c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_UKRANIAN_IE                     = "\u{0454}";
4711c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_DZE                             = "\u{0455}";
4721c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_BYELORUSSIAN_UKRAINIAN_I        = "\u{0456}";
4731c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_YI                              = "\u{0457}";
4741c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_JE                              = "\u{0458}";
4751c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_LJE                             = "\u{0459}";
4761c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_NJE                             = "\u{045A}";
4771c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_TSHE                            = "\u{045B}";
4781c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_KJE                             = "\u{045C}";
4791c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_SHORT_U                         = "\u{045E}";
4801c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_DZHE                            = "\u{045F}";
4811c6adce8SGreg Roach    public const CYRILLIC_CAPITAL_LETTER_GHE_WITH_UPTURN               = "\u{0490}";
4821c6adce8SGreg Roach    public const CYRILLIC_SMALL_LETTER_GHE_WITH_UPTURN                 = "\u{0491}";
48352288ec7SGreg Roach    public const ARABIC_LETTER_HAMZA                                   = "\u{0621}";
48452288ec7SGreg Roach    public const ARABIC_LETTER_ALEF                                    = "\u{0627}";
48552288ec7SGreg Roach    public const ARABIC_LETTER_BEH                                     = "\u{0628}";
48652288ec7SGreg Roach    public const ARABIC_LETTER_TEH_MARBUTA                             = "\u{0629}";
48752288ec7SGreg Roach    public const ARABIC_LETTER_TEH                                     = "\u{062A}";
48852288ec7SGreg Roach    public const ARABIC_LETTER_THEH                                    = "\u{062B}";
48952288ec7SGreg Roach    public const ARABIC_LETTER_JEEM                                    = "\u{062C}";
49052288ec7SGreg Roach    public const ARABIC_LETTER_HAH                                     = "\u{062D}";
49152288ec7SGreg Roach    public const ARABIC_LETTER_KHAH                                    = "\u{062E}";
49252288ec7SGreg Roach    public const ARABIC_LETTER_DAL                                     = "\u{062F}";
49352288ec7SGreg Roach    public const ARABIC_LETTER_THAL                                    = "\u{0630}";
49452288ec7SGreg Roach    public const ARABIC_LETTER_REH                                     = "\u{0631}";
49552288ec7SGreg Roach    public const ARABIC_LETTER_ZAIN                                    = "\u{0632}";
49652288ec7SGreg Roach    public const ARABIC_LETTER_SEEN                                    = "\u{0633}";
49752288ec7SGreg Roach    public const ARABIC_LETTER_SHEEN                                   = "\u{0634}";
49852288ec7SGreg Roach    public const ARABIC_LETTER_SAD                                     = "\u{0635}";
49952288ec7SGreg Roach    public const ARABIC_LETTER_DAD                                     = "\u{0636}";
50052288ec7SGreg Roach    public const ARABIC_LETTER_TAH                                     = "\u{0637}";
50152288ec7SGreg Roach    public const ARABIC_LETTER_ZAH                                     = "\u{0638}";
50252288ec7SGreg Roach    public const ARABIC_LETTER_AIN                                     = "\u{0639}";
50352288ec7SGreg Roach    public const ARABIC_LETTER_GHAIN                                   = "\u{063A}";
50452288ec7SGreg Roach    public const ARABIC_LETTER_FEH                                     = "\u{0641}";
50552288ec7SGreg Roach    public const ARABIC_LETTER_QAF                                     = "\u{0642}";
50652288ec7SGreg Roach    public const ARABIC_LETTER_KAF                                     = "\u{0643}";
50752288ec7SGreg Roach    public const ARABIC_LETTER_LAM                                     = "\u{0644}";
50852288ec7SGreg Roach    public const ARABIC_LETTER_MEEM                                    = "\u{0645}";
50952288ec7SGreg Roach    public const ARABIC_LETTER_NOON                                    = "\u{0646}";
51052288ec7SGreg Roach    public const ARABIC_LETTER_HEH                                     = "\u{0647}";
51152288ec7SGreg Roach    public const ARABIC_LETTER_WAW                                     = "\u{0648}";
51252288ec7SGreg Roach    public const ARABIC_LETTER_ALEF_MAKSURA                            = "\u{0649}";
51352288ec7SGreg Roach    public const ARABIC_LETTER_YEH                                     = "\u{064A}";
5141c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_RING_BELOW                = "\u{1E00}";
5151c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_RING_BELOW                  = "\u{1E01}";
5161c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_B_WITH_DOT_ABOVE                 = "\u{1E02}";
5171c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_B_WITH_DOT_ABOVE                   = "\u{1E03}";
5181c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_B_WITH_DOT_BELOW                 = "\u{1E04}";
5191c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_B_WITH_DOT_BELOW                   = "\u{1E05}";
5201c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_C_WITH_CEDILLA_AND_ACUTE         = "\u{1E08}";
5211c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_C_WITH_CEDILLA_AND_ACUTE           = "\u{1E09}";
5221c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_D_WITH_DOT_ABOVE                 = "\u{1E0A}";
5231c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_D_WITH_DOT_ABOVE                   = "\u{1E0B}";
5241c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_D_WITH_DOT_BELOW                 = "\u{1E0C}";
5251c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_D_WITH_DOT_BELOW                   = "\u{1E0D}";
5261c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_SHARP_S                          = "\u{1E9E}";
5271c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_D_WITH_CEDILLA                   = "\u{1E10}";
5281c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_D_WITH_CEDILLA                     = "\u{1E11}";
5291c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_MACRON_AND_GRAVE          = "\u{1E14}";
5301c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_MACRON_AND_GRAVE            = "\u{1E15}";
5311c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_MACRON_AND_ACUTE          = "\u{1E16}";
5321c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_MACRON_AND_ACUTE            = "\u{1E17}";
5331c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_CEDILLA_AND_BREVE         = "\u{1E1C}";
5341c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_CEDILLA_AND_BREVE           = "\u{1E1D}";
5351c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_F_WITH_DOT_ABOVE                 = "\u{1E1E}";
5361c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_F_WITH_DOT_ABOVE                   = "\u{1E1F}";
5371c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_G_WITH_MACRON                    = "\u{1E20}";
5381c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_G_WITH_MACRON                      = "\u{1E21}";
5391c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_H_WITH_DOT_ABOVE                 = "\u{1E22}";
5401c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_H_WITH_DOT_ABOVE                   = "\u{1E23}";
5411c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_H_WITH_DOT_BELOW                 = "\u{1E24}";
5421c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_H_WITH_DOT_BELOW                   = "\u{1E25}";
5431c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_H_WITH_DIAERESIS                 = "\u{1E26}";
5441c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_H_WITH_DIAERESIS                   = "\u{1E27}";
5451c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_H_WITH_CEDILLA                   = "\u{1E28}";
5461c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_H_WITH_CEDILLA                     = "\u{1E29}";
5471c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_H_WITH_BREVE_BELOW               = "\u{1E2A}";
5481c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_H_WITH_BREVE_BELOW                 = "\u{1E2B}";
5491c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS_AND_ACUTE       = "\u{1E2E}";
5501c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_I_WITH_DIAERESIS_AND_ACUTE         = "\u{1E2F}";
5511c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_K_WITH_ACUTE                     = "\u{1E30}";
5521c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_K_WITH_ACUTE                       = "\u{1E31}";
5531c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_K_WITH_DOT_BELOW                 = "\u{1E32}";
5541c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_K_WITH_DOT_BELOW                   = "\u{1E33}";
5551c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_L_WITH_DOT_BELOW                 = "\u{1E36}";
5561c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_L_WITH_DOT_BELOW                   = "\u{1E37}";
5571c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_L_WITH_DOT_BELOW_AND_MACRON      = "\u{1E38}";
5581c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_L_WITH_DOT_BELOW_AND_MACRON        = "\u{1E39}";
5591c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_M_WITH_ACUTE                     = "\u{1E3E}";
5601c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_M_WITH_ACUTE                       = "\u{1E3F}";
5611c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_M_WITH_DOT_ABOVE                 = "\u{1E40}";
5621c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_M_WITH_DOT_ABOVE                   = "\u{1E41}";
5631c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_M_WITH_DOT_BELOW                 = "\u{1E42}";
5641c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_M_WITH_DOT_BELOW                   = "\u{1E43}";
5651c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_N_WITH_DOT_ABOVE                 = "\u{1E44}";
5661c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_N_WITH_DOT_ABOVE                   = "\u{1E45}";
5671c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_N_WITH_DOT_BELOW                 = "\u{1E46}";
5681c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_N_WITH_DOT_BELOW                   = "\u{1E47}";
5691c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_ACUTE           = "\u{1E4C}";
5701c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_TILDE_AND_ACUTE             = "\u{1E4D}";
5711c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_DIAERESIS       = "\u{1E4E}";
5721c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_TILDE_AND_DIAERESIS         = "\u{1E4F}";
5731c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_MACRON_AND_GRAVE          = "\u{1E50}";
5741c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_MACRON_AND_GRAVE            = "\u{1E51}";
5751c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_MACRON_AND_ACUTE          = "\u{1E52}";
5761c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_MACRON_AND_ACUTE            = "\u{1E53}";
5771c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_P_WITH_ACUTE                     = "\u{1E54}";
5781c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_P_WITH_ACUTE                       = "\u{1E55}";
5791c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_P_WITH_DOT_ABOVE                 = "\u{1E56}";
5801c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_P_WITH_DOT_ABOVE                   = "\u{1E57}";
5811c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_R_WITH_DOT_ABOVE                 = "\u{1E58}";
5821c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_R_WITH_DOT_ABOVE                   = "\u{1E59}";
5831c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_R_WITH_DOT_BELOW                 = "\u{1E5A}";
5841c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_R_WITH_DOT_BELOW                   = "\u{1E5B}";
5851c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_R_WITH_DOT_BELOW_AND_MACRON      = "\u{1E5C}";
5861c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_R_WITH_DOT_BELOW_AND_MACRON        = "\u{1E5D}";
5871c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_S_WITH_DOT_ABOVE                 = "\u{1E60}";
5881c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_S_WITH_DOT_ABOVE                   = "\u{1E61}";
5891c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_S_WITH_DOT_BELOW                 = "\u{1E62}";
5901c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_S_WITH_DOT_BELOW                   = "\u{1E63}";
5911c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_S_WITH_ACUTE_AND_DOT_ABOVE       = "\u{1E64}";
5921c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_S_WITH_ACUTE_AND_DOT_ABOVE         = "\u{1E65}";
5931c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_S_WITH_CARON_AND_DOT_ABOVE       = "\u{1E66}";
5941c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_S_WITH_CARON_AND_DOT_ABOVE         = "\u{1E67}";
5951c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_S_WITH_DOT_BELOW_AND_DOT_ABOVE   = "\u{1E68}";
5961c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_S_WITH_DOT_BELOW_AND_DOT_ABOVE     = "\u{1E69}";
5971c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_T_WITH_DOT_ABOVE                 = "\u{1E6A}";
5981c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_T_WITH_DOT_ABOVE                   = "\u{1E6B}";
5991c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_T_WITH_DOT_BELOW                 = "\u{1E6C}";
6001c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_T_WITH_DOT_BELOW                   = "\u{1E6D}";
6011c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_BELOW           = "\u{1E72}";
6021c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_DIAERESIS_BELOW             = "\u{1E73}";
6031c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_TILDE_AND_ACUTE           = "\u{1E78}";
6041c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_TILDE_AND_ACUTE             = "\u{1E79}";
6051c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_MACRON_AND_DIAERESIS      = "\u{1E7A}";
6061c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_MACRON_AND_DIAERESIS        = "\u{1E7B}";
6071c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_V_WITH_TILDE                     = "\u{1E7C}";
6081c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_V_WITH_TILDE                       = "\u{1E7D}";
6091c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_V_WITH_DOT_BELOW                 = "\u{1E7E}";
6101c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_V_WITH_DOT_BELOW                   = "\u{1E7F}";
6111c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_W_WITH_GRAVE                     = "\u{1E80}";
6121c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_W_WITH_GRAVE                       = "\u{1E81}";
6131c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_W_WITH_ACUTE                     = "\u{1E82}";
6141c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_W_WITH_ACUTE                       = "\u{1E83}";
6151c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_W_WITH_DIAERESIS                 = "\u{1E84}";
6161c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_W_WITH_DIAERESIS                   = "\u{1E85}";
6171c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_W_WITH_DOT_ABOVE                 = "\u{1E86}";
6181c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_W_WITH_DOT_ABOVE                   = "\u{1E87}";
6191c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_W_WITH_DOT_BELOW                 = "\u{1E88}";
6201c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_W_WITH_DOT_BELOW                   = "\u{1E89}";
6211c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_X_WITH_DOT_ABOVE                 = "\u{1E8A}";
6221c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_X_WITH_DOT_ABOVE                   = "\u{1E8B}";
6231c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_X_WITH_DIAERESIS                 = "\u{1E8C}";
6241c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_X_WITH_DIAERESIS                   = "\u{1E8D}";
6251c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Y_WITH_DOT_ABOVE                 = "\u{1E8E}";
6261c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Y_WITH_DOT_ABOVE                   = "\u{1E8F}";
6271c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Z_WITH_CIRCUMFLEX                = "\u{1E90}";
6281c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Z_WITH_CIRCUMFLEX                  = "\u{1E91}";
6291c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Z_WITH_DOT_BELOW                 = "\u{1E92}";
6301c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Z_WITH_DOT_BELOW                   = "\u{1E93}";
6311c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_T_WITH_DIAERESIS                   = "\u{1E97}";
6321c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_W_WITH_RING_ABOVE                  = "\u{1E98}";
6331c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Y_WITH_RING_ABOVE                  = "\u{1E99}";
6341c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_DOT_BELOW                 = "\u{1EA0}";
6351c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_DOT_BELOW                   = "\u{1EA1}";
6361c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_HOOK_ABOVE                = "\u{1EA2}";
6371c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_HOOK_ABOVE                  = "\u{1EA3}";
6381c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_ACUTE      = "\u{1EA4}";
6391c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_ACUTE        = "\u{1EA5}";
6401c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_GRAVE      = "\u{1EA6}";
6411c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_GRAVE        = "\u{1EA7}";
6421c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_HOOK_ABOVE = "\u{1EA8}";
6431c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_HOOK_ABOVE   = "\u{1EA9}";
6441c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_TILDE      = "\u{1EAA}";
6451c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_TILDE        = "\u{1EAB}";
6461c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_DOT_BELOW  = "\u{1EAC}";
6471c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_DOT_BELOW    = "\u{1EAD}";
6481c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_ACUTE           = "\u{1EAE}";
6491c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_ACUTE             = "\u{1EAF}";
6501c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_GRAVE           = "\u{1EB0}";
6511c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_GRAVE             = "\u{1EB1}";
6521c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_HOOK_ABOVE      = "\u{1EB2}";
6531c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_HOOK_ABOVE        = "\u{1EB3}";
6541c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_TILDE           = "\u{1EB4}";
6551c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_TILDE             = "\u{1EB5}";
6561c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_DOT_BELOW       = "\u{1EB6}";
6571c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_A_WITH_BREVE_AND_DOT_BELOW         = "\u{1EB7}";
6581c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_DOT_BELOW                 = "\u{1EB8}";
6591c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_DOT_BELOW                   = "\u{1EB9}";
6601c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_HOOK_ABOVE                = "\u{1EBA}";
6611c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_HOOK_ABOVE                  = "\u{1EBB}";
6621c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_TILDE                     = "\u{1EBC}";
6631c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_TILDE                       = "\u{1EBD}";
6641c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_ACUTE      = "\u{1EBE}";
6651c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_ACUTE        = "\u{1EBF}";
6661c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_GRAVE      = "\u{1EC0}";
6671c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_GRAVE        = "\u{1EC1}";
6681c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_HOOK_ABOVE = "\u{1EC2}";
6691c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_HOOK_ABOVE   = "\u{1EC3}";
6701c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_TILDE      = "\u{1EC4}";
6711c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_TILDE        = "\u{1EC5}";
6721c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_DOT_BELOW  = "\u{1EC6}";
6731c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_DOT_BELOW    = "\u{1EC7}";
6741c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_HOOK_ABOVE                = "\u{1EC8}";
6751c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_I_WITH_HOOK_ABOVE                  = "\u{1EC9}";
6761c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_I_WITH_DOT_BELOW                 = "\u{1ECA}";
6771c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_I_WITH_DOT_BELOW                   = "\u{1ECB}";
6781c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_DOT_BELOW                 = "\u{1ECC}";
6791c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_DOT_BELOW                   = "\u{1ECD}";
6801c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_HOOK_ABOVE                = "\u{1ECE}";
6811c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_HOOK_ABOVE                  = "\u{1ECF}";
6821c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_ACUTE      = "\u{1ED0}";
6831c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_ACUTE        = "\u{1ED1}";
6841c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_GRAVE      = "\u{1ED2}";
6851c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_GRAVE        = "\u{1ED3}";
6861c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_HOOK_ABOVE = "\u{1ED4}";
6871c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_HOOK_ABOVE   = "\u{1ED5}";
6881c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_TILDE      = "\u{1ED6}";
6891c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_TILDE        = "\u{1ED7}";
6901c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_DOT_BELOW  = "\u{1ED8}";
6911c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_DOT_BELOW    = "\u{1ED9}";
6921c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_DOT_BELOW                 = "\u{1EE4}";
6931c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_DOT_BELOW                   = "\u{1EE5}";
6941c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_U_WITH_HOOK_ABOVE                = "\u{1EE6}";
6951c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_U_WITH_HOOK_ABOVE                  = "\u{1EE7}";
6961c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Y_WITH_GRAVE                     = "\u{1EF2}";
6971c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Y_WITH_GRAVE                       = "\u{1EF3}";
6981c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Y_WITH_DOT_BELOW                 = "\u{1EF4}";
6991c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Y_WITH_DOT_BELOW                   = "\u{1EF5}";
7001c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Y_WITH_HOOK_ABOVE                = "\u{1EF6}";
7011c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Y_WITH_HOOK_ABOVE                  = "\u{1EF7}";
7021c6adce8SGreg Roach    public const LATIN_CAPITAL_LETTER_Y_WITH_TILDE                     = "\u{1EF8}";
7031c6adce8SGreg Roach    public const LATIN_SMALL_LETTER_Y_WITH_TILDE                       = "\u{1EF9}";
7041c6adce8SGreg Roach    public const ZERO_WIDTH_NON_JOINER                                 = "\u{200C}";
7051c6adce8SGreg Roach    public const ZERO_WIDTH_JOINER                                     = "\u{200D}";
7061c6adce8SGreg Roach    public const EN_DASH                                               = "\u{2013}";
7071c6adce8SGreg Roach    public const EM_DASH                                               = "\u{2014}";
7081c6adce8SGreg Roach    public const DOUBLE_LOW_LINE                                       = "\u{2017}";
7091c6adce8SGreg Roach    public const LEFT_SINGLE_QUOTATION_MARK                            = "\u{2018}";
7101c6adce8SGreg Roach    public const RIGHT_SINGLE_QUOTATION_MARK                           = "\u{2019}";
7111c6adce8SGreg Roach    public const SINGLE_LOW_9_QUOTATION_MARK                           = "\u{201A}";
7121c6adce8SGreg Roach    public const LEFT_DOUBLE_QUOTATION_MARK                            = "\u{201C}";
7131c6adce8SGreg Roach    public const RIGHT_DOUBLE_QUOTATION_MARK                           = "\u{201D}";
7141c6adce8SGreg Roach    public const DOUBLE_LOW_9_QUOTATION_MARK                           = "\u{201E}";
7151c6adce8SGreg Roach    public const DAGGER                                                = "\u{2020}";
7161c6adce8SGreg Roach    public const DOUBLE_DAGGER                                         = "\u{2021}";
7171c6adce8SGreg Roach    public const BULLET                                                = "\u{2022}";
7181c6adce8SGreg Roach    public const HORIZONTAL_ELLIPSIS                                   = "\u{2026}";
7191c6adce8SGreg Roach    public const PER_MILLE_SIGN                                        = "\u{2030}";
7201c6adce8SGreg Roach    public const SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK             = "\u{2039}";
7211c6adce8SGreg Roach    public const SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK            = "\u{203A}";
7221c6adce8SGreg Roach    public const FRACTION_SLASH                                        = "\u{2044}";
7231c6adce8SGreg Roach    public const SUPERSCRIPT_LATIN_SMALL_LETTER_N                      = "\u{207F}";
7241c6adce8SGreg Roach    public const PESETA_SIGN                                           = "\u{20A7}";
7251c6adce8SGreg Roach    public const EURO_SIGN                                             = "\u{20AC}";
7261c6adce8SGreg Roach    public const SCRIPT_SMALL_L                                        = "\u{2113}";
7271c6adce8SGreg Roach    public const NUMERO_SIGN                                           = "\u{2116}";
7281c6adce8SGreg Roach    public const SOUND_RECORDING_COPYRIGHT                             = "\u{2117}";
7291c6adce8SGreg Roach    public const TRADE_MARK_SIGN                                       = "\u{2122}";
7301c6adce8SGreg Roach    public const PARTIAL_DIFFERENTIAL                                  = "\u{2202}";
7311c6adce8SGreg Roach    public const INCREMENT                                             = "\u{2206}";
7321c6adce8SGreg Roach    public const N_ARY_PRODUCT                                         = "\u{220F}";
7331c6adce8SGreg Roach    public const N_ARY_SUMMATION                                       = "\u{2211}";
7341c6adce8SGreg Roach    public const BULLET_OPERATOR                                       = "\u{2219}";
7351c6adce8SGreg Roach    public const SQUARE_ROOT                                           = "\u{221A}";
7361c6adce8SGreg Roach    public const INFINITY                                              = "\u{221E}";
7371c6adce8SGreg Roach    public const INTERSECTION                                          = "\u{2229}";
7381c6adce8SGreg Roach    public const INTEGRAL                                              = "\u{222B}";
7391c6adce8SGreg Roach    public const ALMOST_EQUAL_TO                                       = "\u{2248}";
7401c6adce8SGreg Roach    public const NOT_EQUAL_TO                                          = "\u{2260}";
7411c6adce8SGreg Roach    public const IDENTICAL_TO                                          = "\u{2261}";
7421c6adce8SGreg Roach    public const LESS_THAN_OR_EQUAL_TO                                 = "\u{2264}";
7431c6adce8SGreg Roach    public const GREATER_THAN_OR_EQUAL_TO                              = "\u{2265}";
7441c6adce8SGreg Roach    public const REVERSED_NOT_SIGN                                     = "\u{2310}";
7451c6adce8SGreg Roach    public const TOP_HALF_INTEGRAL                                     = "\u{2320}";
7461c6adce8SGreg Roach    public const BOTTOM_HALF_INTEGRAL                                  = "\u{2321}";
7471c6adce8SGreg Roach    public const BOX_DRAWINGS_LIGHT_HORIZONTAL                         = "\u{2500}";
7481c6adce8SGreg Roach    public const BOX_DRAWINGS_LIGHT_VERTICAL                           = "\u{2502}";
7491c6adce8SGreg Roach    public const BOX_DRAWINGS_LIGHT_DOWN_AND_RIGHT                     = "\u{250C}";
7501c6adce8SGreg Roach    public const BOX_DRAWINGS_LIGHT_DOWN_AND_LEFT                      = "\u{2510}";
7511c6adce8SGreg Roach    public const BOX_DRAWINGS_LIGHT_UP_AND_LEFT                        = "\u{2518}";
7521c6adce8SGreg Roach    public const BOX_DRAWINGS_LIGHT_UP_AND_RIGHT                       = "\u{2514}";
7531c6adce8SGreg Roach    public const BOX_DRAWINGS_LIGHT_VERTICAL_AND_RIGHT                 = "\u{251C}";
7541c6adce8SGreg Roach    public const BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT                  = "\u{2524}";
7551c6adce8SGreg Roach    public const BOX_DRAWINGS_LIGHT_DOWN_AND_HORIZONTAL                = "\u{252C}";
7561c6adce8SGreg Roach    public const BOX_DRAWINGS_LIGHT_UP_AND_HORIZONTAL                  = "\u{2534}";
7571c6adce8SGreg Roach    public const BOX_DRAWINGS_LIGHT_VERTICAL_AND_HORIZONTAL            = "\u{253C}";
7581c6adce8SGreg Roach    public const BOX_DRAWINGS_DOUBLE_HORIZONTAL                        = "\u{2550}";
7591c6adce8SGreg Roach    public const BOX_DRAWINGS_DOUBLE_VERTICAL                          = "\u{2551}";
7601c6adce8SGreg Roach    public const BOX_DRAWINGS_DOWN_SINGLE_AND_RIGHT_DOUBLE             = "\u{2552}";
7611c6adce8SGreg Roach    public const BOX_DRAWINGS_DOWN_DOUBLE_AND_RIGHT_SINGLE             = "\u{2553}";
7621c6adce8SGreg Roach    public const BOX_DRAWINGS_DOUBLE_DOWN_AND_RIGHT                    = "\u{2554}";
7631c6adce8SGreg Roach    public const BOX_DRAWINGS_DOWN_SINGLE_AND_LEFT_DOUBLE              = "\u{2555}";
7641c6adce8SGreg Roach    public const BOX_DRAWINGS_DOWN_DOUBLE_AND_LEFT_SINGLE              = "\u{2556}";
7651c6adce8SGreg Roach    public const BOX_DRAWINGS_DOUBLE_DOWN_AND_LEFT                     = "\u{2557}";
7661c6adce8SGreg Roach    public const BOX_DRAWINGS_UP_SINGLE_AND_RIGHT_DOUBLE               = "\u{2558}";
7671c6adce8SGreg Roach    public const BOX_DRAWINGS_UP_DOUBLE_AND_RIGHT_SINGLE               = "\u{2559}";
7681c6adce8SGreg Roach    public const BOX_DRAWINGS_DOUBLE_UP_AND_RIGHT                      = "\u{255A}";
7691c6adce8SGreg Roach    public const BOX_DRAWINGS_UP_SINGLE_AND_LEFT_DOUBLE                = "\u{255B}";
7701c6adce8SGreg Roach    public const BOX_DRAWINGS_UP_DOUBLE_AND_LEFT_SINGLE                = "\u{255C}";
7711c6adce8SGreg Roach    public const BOX_DRAWINGS_DOUBLE_UP_AND_LEFT                       = "\u{255D}";
7721c6adce8SGreg Roach    public const BOX_DRAWINGS_VERTICAL_SINGLE_AND_RIGHT_DOUBLE         = "\u{255E}";
7731c6adce8SGreg Roach    public const BOX_DRAWINGS_VERTICAL_DOUBLE_AND_RIGHT_SINGLE         = "\u{255F}";
7741c6adce8SGreg Roach    public const BOX_DRAWINGS_DOUBLE_VERTICAL_AND_RIGHT                = "\u{2560}";
7751c6adce8SGreg Roach    public const BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE          = "\u{2561}";
7761c6adce8SGreg Roach    public const BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE          = "\u{2562}";
7771c6adce8SGreg Roach    public const BOX_DRAWINGS_DOUBLE_VERTICAL_AND_LEFT                 = "\u{2563}";
7781c6adce8SGreg Roach    public const BOX_DRAWINGS_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE        = "\u{2564}";
7791c6adce8SGreg Roach    public const BOX_DRAWINGS_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE        = "\u{2565}";
7801c6adce8SGreg Roach    public const BOX_DRAWINGS_DOUBLE_DOWN_AND_HORIZONTAL               = "\u{2566}";
7811c6adce8SGreg Roach    public const BOX_DRAWINGS_UP_SINGLE_AND_HORIZONTAL_DOUBLE          = "\u{2567}";
7821c6adce8SGreg Roach    public const BOX_DRAWINGS_UP_DOUBLE_AND_HORIZONTAL_SINGLE          = "\u{2568}";
7831c6adce8SGreg Roach    public const BOX_DRAWINGS_BOX_DRAWINGS_DOUBLE_UP_AND_HORIZONTAL    = "\u{2569}";
7841c6adce8SGreg Roach    public const BOX_DRAWINGS_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE    = "\u{256A}";
7851c6adce8SGreg Roach    public const BOX_DRAWINGS_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE    = "\u{256B}";
7861c6adce8SGreg Roach    public const BOX_DRAWINGS_DOUBLE_VERTICAL_AND_HORIZONTAL           = "\u{256C}";
7871c6adce8SGreg Roach    public const UPPER_HALF_BLOCK                                      = "\u{2580}";
7881c6adce8SGreg Roach    public const LOWER_HALF_BLOCK                                      = "\u{2584}";
7891c6adce8SGreg Roach    public const FULL_BLOCK                                            = "\u{2588}";
7901c6adce8SGreg Roach    public const LEFT_HALF_BLOCK                                       = "\u{258C}";
7911c6adce8SGreg Roach    public const RIGHT_HALF_BLOCK                                      = "\u{2590}";
7921c6adce8SGreg Roach    public const LIGHT_SHADE                                           = "\u{2591}";
7931c6adce8SGreg Roach    public const MEDIUM_SHADE                                          = "\u{2592}";
7941c6adce8SGreg Roach    public const DARK_SHADE                                            = "\u{2593}";
7951c6adce8SGreg Roach    public const BLACK_SQUARE                                          = "\u{25A0}";
7961c6adce8SGreg Roach    public const WHITE_SQUARE                                          = "\u{25A1}";
7971c6adce8SGreg Roach    public const LOZENGE                                               = "\u{25CA}";
7981c6adce8SGreg Roach    public const MUSIC_FLAT_SIGN                                       = "\u{266D}";
7991c6adce8SGreg Roach    public const MUSIC_SHARP_SIGN                                      = "\u{266F}";
8001c6adce8SGreg Roach    public const LATIN_SMALL_LIGATURE_FI                               = "\u{FB01}";
8011c6adce8SGreg Roach    public const LATIN_SMALL_LIGATURE_FL                               = "\u{FB02}";
8021c6adce8SGreg Roach    public const BYTE_ORDER_MARK                                       = "\u{FEFF}";
8031c6adce8SGreg Roach    public const REPLACEMENT_CHARACTER                                 = "\u{FFFD}";
8041c6adce8SGreg Roach
8051c6adce8SGreg Roach    /**
8061c6adce8SGreg Roach     * Convert text from (potentially invalid) UTF-8 to UTF-8.
8071c6adce8SGreg Roach     *
8081c6adce8SGreg Roach     * @param string $text
8091c6adce8SGreg Roach     *
8101c6adce8SGreg Roach     * @return string
8111c6adce8SGreg Roach     */
8121c6adce8SGreg Roach    public function fromUtf8(string $text): string
8131c6adce8SGreg Roach    {
8141c6adce8SGreg Roach        if (preg_match('//u', $text) === false) {
8151c6adce8SGreg Roach            // Not UTF8?
8161c6adce8SGreg Roach            mb_substitute_character(0xFFFD);
8171c6adce8SGreg Roach
8181c6adce8SGreg Roach            return mb_convert_encoding($text, 'UTF-8', 'UTF-8');
8191c6adce8SGreg Roach        }
8201c6adce8SGreg Roach
8211c6adce8SGreg Roach        return $text;
8221c6adce8SGreg Roach    }
8231c6adce8SGreg Roach
8241c6adce8SGreg Roach    /**
8251c6adce8SGreg Roach     * Convert text from (potentially invalid) UTF-8 to UTF-8.
8261c6adce8SGreg Roach     *
8271c6adce8SGreg Roach     * @param string $text
8281c6adce8SGreg Roach     *
8291c6adce8SGreg Roach     * @return string
8301c6adce8SGreg Roach     */
8311c6adce8SGreg Roach    public function toUtf8(string $text): string
8321c6adce8SGreg Roach    {
8331c6adce8SGreg Roach        return $this->fromUtf8($text);
8341c6adce8SGreg Roach    }
8351c6adce8SGreg Roach
8361c6adce8SGreg Roach    /**
8371c6adce8SGreg Roach     * Create a UTF8 character from a code.
8381c6adce8SGreg Roach     *
8391c6adce8SGreg Roach     * @param int $code
8401c6adce8SGreg Roach     *
8411c6adce8SGreg Roach     * @return string
8421c6adce8SGreg Roach     */
8431c6adce8SGreg Roach    public static function chr(int $code): string
8441c6adce8SGreg Roach    {
8451c6adce8SGreg Roach        if ($code < 0 || $code > 0x1FFFFF) {
8461c6adce8SGreg Roach            throw new InvalidArgumentException((string)$code);
8471c6adce8SGreg Roach        }
8481c6adce8SGreg Roach
8491c6adce8SGreg Roach        if ($code <= 0x7F) {
8501c6adce8SGreg Roach            return chr($code);
8511c6adce8SGreg Roach        }
8521c6adce8SGreg Roach
8531c6adce8SGreg Roach        if ($code <= 0x7FF) {
8541c6adce8SGreg Roach            return
8551c6adce8SGreg Roach                chr(($code >> 6) + 0xC0) .
8561c6adce8SGreg Roach                chr(($code & 0x3F) + 0x80);
8571c6adce8SGreg Roach        }
8581c6adce8SGreg Roach
8591c6adce8SGreg Roach        if ($code <= 0xFFFF) {
8601c6adce8SGreg Roach            return
8611c6adce8SGreg Roach                chr(($code >> 12) + 0xE0) .
8621c6adce8SGreg Roach                chr((($code >> 6) & 0x3F) + 0x80) .
8631c6adce8SGreg Roach                chr(($code & 0x3F) + 0x80);
8641c6adce8SGreg Roach        }
8651c6adce8SGreg Roach
8661c6adce8SGreg Roach        return
8671c6adce8SGreg Roach            chr(($code >> 18) + 0xF0) .
8681c6adce8SGreg Roach            chr((($code >> 12) & 0x3F) + 0x80) .
8691c6adce8SGreg Roach            chr((($code >> 6) & 0x3F) + 0x80) .
8701c6adce8SGreg Roach            chr(($code & 0x3F) + 0x80);
8711c6adce8SGreg Roach    }
8721c6adce8SGreg Roach}
873