Advertisement
fortsoft

ASCII

Oct 21st, 2022 (edited)
1,365
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 146.57 KB | Source Code | 0 0
  1. /**
  2.  * This is open-source software licensed under the terms of the MIT License.
  3.  *
  4.  * Copyright (c) 2022-2023 Petr Červinka - FortSoft <[email protected]>
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a copy
  7.  * of this software and associated documentation files (the "Software"), to deal
  8.  * in the Software without restriction, including without limitation the rights
  9.  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10.  * copies of the Software, and to permit persons to whom the Software is
  11.  * furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice shall be included in all
  14.  * copies or substantial portions of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19.  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22.  * SOFTWARE.
  23.  **
  24.  * Version 2.0.2.0
  25.  */
  26.  
  27. using System;
  28. using System.Collections.Generic;
  29. using System.Diagnostics;
  30. using System.Globalization;
  31. using System.IO;
  32. using System.Linq;
  33. using System.Text;
  34.  
  35. namespace FortSoft.Tools {
  36.  
  37.     /// <summary>
  38.     /// Implements the conversion of Unicode characters and strings to ASCII-only
  39.     /// string. Text is converted character-by-character without considering the
  40.     /// context. The mappings for each non-ASCII character is based on its
  41.     /// pronunciation in the associated language with English notation in mind.
  42.     /// Symbolic characters are converted based on their meaning or appearance.
  43.     /// Unknown characters and some known characters are replaced with an empty
  44.     /// string and removed.
  45.     /// </summary>
  46.     public static class ASCII {
  47.  
  48.         /// <summary>
  49.         /// Checks if the provided character is an ASCII character.
  50.         /// </summary>
  51.         /// <param name="c">Character to check.</param>
  52.         /// <returns>True if the provided character is an ASCII character.
  53.         /// </returns>
  54.         public static bool IsASCII(char c) => c < '\u0080';
  55.  
  56.         /// <summary>
  57.         /// Checks if the provided string contains only ASCII characters.
  58.         /// </summary>
  59.         /// <param name="str">String to check.</param>
  60.         /// <param name="encoding">Input encoding.</param>
  61.         /// <returns>True if the provided string contains only ASCII characters.
  62.         /// </returns>
  63.         public static bool IsASCII(string str, Encoding encoding) {
  64.             byte[] bytes = Encoding.Convert(encoding, Encoding.Unicode, encoding.GetBytes(str));
  65.             foreach (char c in Encoding.Unicode.GetChars(bytes)) {
  66.                 if (!IsASCII(c)) {
  67.                     return false;
  68.                 }
  69.             }
  70.             return true;
  71.         }
  72.  
  73.         /// <summary>
  74.         /// Checks if the provided string contains only ASCII characters.
  75.         /// </summary>
  76.         /// <param name="str">String to check. Provided string will be treated as
  77.         /// a Unicode string.</param>
  78.         /// <returns>True if the provided string contains only ASCII characters.
  79.         /// </returns>
  80.         public static bool IsASCII(string str) {
  81.             foreach (char c in str.ToCharArray()) {
  82.                 if (!IsASCII(c)) {
  83.                     return false;
  84.                 }
  85.             }
  86.             return true;
  87.         }
  88.  
  89.         /// <summary>
  90.         /// Converts the provided Unicode character to the corresponding ASCII
  91.         /// string according to the pronunciation in the associated language with
  92.         /// English notation in mind. Symbolic characters are converted based on
  93.         /// their meaning or appearance.
  94.         /// </summary>
  95.         /// <param name="c">Character to convert.</param>
  96.         /// <returns>Output string.</returns>
  97.         public static string Convert(char c) {
  98.             if (IsASCII(c)) {
  99.                 return c.ToString();
  100.             }
  101.             switch (c) {
  102.                 case '\u00C0': // À  [LATIN CAPITAL LETTER A WITH GRAVE]
  103.                 case '\u00C1': // Á  [LATIN CAPITAL LETTER A WITH ACUTE]
  104.                 case '\u00C2': // Â  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX]
  105.                 case '\u00C3': // Ã  [LATIN CAPITAL LETTER A WITH TILDE]
  106.                 case '\u00C4': // Ä  [LATIN CAPITAL LETTER A WITH DIAERESIS]
  107.                 case '\u00C5': // Å  [LATIN CAPITAL LETTER A WITH RING ABOVE]
  108.                 case '\u0100': // Ā  [LATIN CAPITAL LETTER A WITH MACRON]
  109.                 case '\u0102': // Ă  [LATIN CAPITAL LETTER A WITH BREVE]
  110.                 case '\u0104': // Ą  [LATIN CAPITAL LETTER A WITH OGONEK]
  111.                 case '\u01CD': // Ǎ  [LATIN CAPITAL LETTER A WITH CARON]
  112.                 case '\u01DE': // Ǟ  [LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON]
  113.                 case '\u01E0': // Ǡ  [LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON]
  114.                 case '\u01FA': // Ǻ  [LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE]
  115.                 case '\u0200': // Ȁ  [LATIN CAPITAL LETTER A WITH DOUBLE GRAVE]
  116.                 case '\u0202': // Ȃ  [LATIN CAPITAL LETTER A WITH INVERTED BREVE]
  117.                 case '\u0226': // Ȧ  [LATIN CAPITAL LETTER A WITH DOT ABOVE]
  118.                 case '\u023A': // Ⱥ  [LATIN CAPITAL LETTER A WITH STROKE]
  119.                 case '\u1D00': // ᴀ  [LATIN LETTER SMALL CAPITAL A]
  120.                 case '\u1E00': // Ḁ  [LATIN CAPITAL LETTER A WITH RING BELOW]
  121.                 case '\u1EA0': // Ạ  [LATIN CAPITAL LETTER A WITH DOT BELOW]
  122.                 case '\u1EA2': // Ả  [LATIN CAPITAL LETTER A WITH HOOK ABOVE]
  123.                 case '\u1EA4': // Ấ  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE]
  124.                 case '\u1EA6': // Ầ  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE]
  125.                 case '\u1EA8': // Ẩ  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE]
  126.                 case '\u1EAA': // Ẫ  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE]
  127.                 case '\u1EAC': // Ậ  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW]
  128.                 case '\u1EAE': // Ắ  [LATIN CAPITAL LETTER A WITH BREVE AND ACUTE]
  129.                 case '\u1EB0': // Ằ  [LATIN CAPITAL LETTER A WITH BREVE AND GRAVE]
  130.                 case '\u1EB2': // Ẳ  [LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE]
  131.                 case '\u1EB4': // Ẵ  [LATIN CAPITAL LETTER A WITH BREVE AND TILDE]
  132.                 case '\u1EB6': // Ặ  [LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW]
  133.                 case '\u24B6': // Ⓐ  [CIRCLED LATIN CAPITAL LETTER A]
  134.                 case '\uFF21': // A  [FULLWIDTH LATIN CAPITAL LETTER A]
  135.                 case '\u0391': // Α  [GREEK CAPITAL LETTER ALPHA]
  136.                 case '\u0386': // Ά  [GREEK CAPITAL LETTER ALPHA WITH TONOS]
  137.                 case '\u2C80': // Ⲁ  [COPTIC CAPITAL LETTER ALFA]
  138.                 case '\u2C6D': // Ɑ  [LATIN CAPITAL LETTER ALPHA]
  139.                 case '\u0410': // А  [CYRILLIC CAPITAL LETTER A]
  140.                 case '\u2C00': // Ⰰ  [GLAGOLITIC CAPITAL LETTER AZU]
  141.                 case '\u2C2D': // Ⱝ  [GLAGOLITIC CAPITAL LETTER TROKUTASTI A]
  142.                 case '\u16A8': // ᚨ  [RUNIC LETTER ANSUZ A]
  143.                 case '\u16AA': // ᚪ  [RUNIC LETTER AC A]
  144.                 case '\u16AB': // ᚫ  [RUNIC LETTER AESC]
  145.                 case '\u16AC': // ᚬ  [RUNIC LETTER LONG-BRANCH-OSS O]
  146.                 case '\u16AD': // ᚭ  [RUNIC LETTER SHORT-TWIG-OSS O]
  147.                 case '\u16C6': // ᛆ  [RUNIC LETTER SHORT-TWIG-AR A]
  148.                 case '\u16F8': // ᛸ  [RUNIC LETTER FRANKS CASKET AESC]
  149.                     return "A";
  150.                 case '\u00E0': // à  [LATIN SMALL LETTER A WITH GRAVE]
  151.                 case '\u00E1': // á  [LATIN SMALL LETTER A WITH ACUTE]
  152.                 case '\u00E2': // â  [LATIN SMALL LETTER A WITH CIRCUMFLEX]
  153.                 case '\u00E3': // ã  [LATIN SMALL LETTER A WITH TILDE]
  154.                 case '\u00E4': // ä  [LATIN SMALL LETTER A WITH DIAERESIS]
  155.                 case '\u00E5': // å  [LATIN SMALL LETTER A WITH RING ABOVE]
  156.                 case '\u0101': // ā  [LATIN SMALL LETTER A WITH MACRON]
  157.                 case '\u0103': // ă  [LATIN SMALL LETTER A WITH BREVE]
  158.                 case '\u0105': // ą  [LATIN SMALL LETTER A WITH OGONEK]
  159.                 case '\u01CE': // ǎ  [LATIN SMALL LETTER A WITH CARON]
  160.                 case '\u01DF': // ǟ  [LATIN SMALL LETTER A WITH DIAERESIS AND MACRON]
  161.                 case '\u01E1': // ǡ  [LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON]
  162.                 case '\u01FB': // ǻ  [LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE]
  163.                 case '\u0201': // ȁ  [LATIN SMALL LETTER A WITH DOUBLE GRAVE]
  164.                 case '\u0203': // ȃ  [LATIN SMALL LETTER A WITH INVERTED BREVE]
  165.                 case '\u0227': // ȧ  [LATIN SMALL LETTER A WITH DOT ABOVE]
  166.                 case '\u0250': // ɐ  [LATIN SMALL LETTER TURNED A]
  167.                 case '\u1D8F': // ᶏ  [LATIN SMALL LETTER A WITH RETROFLEX HOOK]
  168.                 case '\u1E01': // ḁ  [LATIN SMALL LETTER A WITH RING BELOW]
  169.                 case '\u1E9A': // ẚ  [LATIN SMALL LETTER A WITH RIGHT HALF RING]
  170.                 case '\u1EA1': // ạ  [LATIN SMALL LETTER A WITH DOT BELOW]
  171.                 case '\u1EA3': // ả  [LATIN SMALL LETTER A WITH HOOK ABOVE]
  172.                 case '\u1EA5': // ấ  [LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE]
  173.                 case '\u1EA7': // ầ  [LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE]
  174.                 case '\u1EA9': // ẩ  [LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE]
  175.                 case '\u1EAB': // ẫ  [LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE]
  176.                 case '\u1EAD': // ậ  [LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW]
  177.                 case '\u1EAF': // ắ  [LATIN SMALL LETTER A WITH BREVE AND ACUTE]
  178.                 case '\u1EB1': // ằ  [LATIN SMALL LETTER A WITH BREVE AND GRAVE]
  179.                 case '\u1EB3': // ẳ  [LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE]
  180.                 case '\u1EB5': // ẵ  [LATIN SMALL LETTER A WITH BREVE AND TILDE]
  181.                 case '\u1EB7': // ặ  [LATIN SMALL LETTER A WITH BREVE AND DOT BELOW]
  182.                 case '\u2090': // ₐ  [LATIN SUBSCRIPT SMALL LETTER A]
  183.                 case '\u24D0': // ⓐ  [CIRCLED LATIN SMALL LETTER A]
  184.                 case '\u2C65': // ⱥ  [LATIN SMALL LETTER A WITH STROKE]
  185.                 case '\u2C6F': // Ɐ  [LATIN CAPITAL LETTER TURNED A]
  186.                 case '\uFF41': // a  [FULLWIDTH LATIN SMALL LETTER A]
  187.                 case '\u00AA': // ª  [FEMININE ORDINAL INDICATOR]
  188.                 case '\u03B1': // α  [GREEK SMALL LETTER ALPHA]
  189.                 case '\u03AC': // ά  [GREEK SMALL LETTER ALPHA WITH TONOS]
  190.                 case '\u2C81': // ⲁ  [COPTIC SMALL LETTER ALFA]
  191.                 case '\u0251': // ɑ  [LATIN SMALL LETTER ALPHA]
  192.                 case '\u0252': // ɒ  [LATIN SMALL LETTER TURNED ALPHA]
  193.                 case '\u1D90': // ᶐ  [LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK]
  194.                 case '\u1D45': // ᵅ  [MODIFIER LETTER SMALL ALPHA]
  195.                 case '\u1D9B': // ᶛ  [MODIFIER LETTER SMALL TURNED ALPHA]
  196.                 case '\u0430': // а  [CYRILLIC SMALL LETTER A]
  197.                 case '\u2C30': // ⰰ  [GLAGOLITIC SMALL LETTER AZU]
  198.                 case '\u2C5D': // ⱝ  [GLAGOLITIC SMALL LETTER TROKUTASTI A]
  199.                     return "a";
  200.                 case '\uA732': // Ꜳ  [LATIN CAPITAL LETTER AA]
  201.                     return "AA";
  202.                 case '\u16F7': // ᛷ  [RUNIC LETTER FRANKS CASKET AC]
  203.                     return "AC";
  204.                 case '\u00C6': // Æ  [LATIN CAPITAL LETTER AE]
  205.                 case '\u01E2': // Ǣ  [LATIN CAPITAL LETTER AE WITH MACRON]
  206.                 case '\u01FC': // Ǽ  [LATIN CAPITAL LETTER AE WITH ACUTE]
  207.                 case '\u1D01': // ᴁ  [LATIN LETTER SMALL CAPITAL AE]
  208.                 case '\u16C5': // ᛅ  [RUNIC LETTER LONG-BRANCH-AR AE]
  209.                     return "AE";
  210.                 case '\uA734': // Ꜵ  [LATIN CAPITAL LETTER AO]
  211.                     return "AO";
  212.                 case '\uA736': // Ꜷ  [LATIN CAPITAL LETTER AU]
  213.                     return "AU";
  214.                 case '\uA738': // Ꜹ  [LATIN CAPITAL LETTER AV]
  215.                 case '\uA73A': // Ꜻ  [LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR]
  216.                     return "AV";
  217.                 case '\uA73C': // Ꜽ  [LATIN CAPITAL LETTER AY]
  218.                     return "AY";
  219.                 case '\u249C': // ⒜  [PARENTHESIZED LATIN SMALL LETTER A]
  220.                     return "(a)";
  221.                 case '\uA733': // ꜳ  [LATIN SMALL LETTER AA]
  222.                     return "aa";
  223.                 case '\u00E6': // æ  [LATIN SMALL LETTER AE]
  224.                 case '\u01E3': // ǣ  [LATIN SMALL LETTER AE WITH MACRON]
  225.                 case '\u01FD': // ǽ  [LATIN SMALL LETTER AE WITH ACUTE]
  226.                 case '\u1D02': // ᴂ  [LATIN SMALL LETTER TURNED AE]
  227.                     return "ae";
  228.                 case '\uA735': // ꜵ  [LATIN SMALL LETTER AO]
  229.                     return "ao";
  230.                 case '\uA737': // ꜷ  [LATIN SMALL LETTER AU]
  231.                     return "au";
  232.                 case '\uA739': // ꜹ  [LATIN SMALL LETTER AV]
  233.                 case '\uA73B': // ꜻ  [LATIN SMALL LETTER AV WITH HORIZONTAL BAR]
  234.                     return "av";
  235.                 case '\uA73D': // ꜽ  [LATIN SMALL LETTER AY]
  236.                     return "ay";
  237.                 case '\u0181': // Ɓ  [LATIN CAPITAL LETTER B WITH HOOK]
  238.                 case '\u0182': // Ƃ  [LATIN CAPITAL LETTER B WITH TOPBAR]
  239.                 case '\u0243': // Ƀ  [LATIN CAPITAL LETTER B WITH STROKE]
  240.                 case '\u0299': // ʙ  [LATIN LETTER SMALL CAPITAL B]
  241.                 case '\u1D03': // ᴃ  [LATIN LETTER SMALL CAPITAL BARRED B]
  242.                 case '\u1E02': // Ḃ  [LATIN CAPITAL LETTER B WITH DOT ABOVE]
  243.                 case '\u1E04': // Ḅ  [LATIN CAPITAL LETTER B WITH DOT BELOW]
  244.                 case '\u1E06': // Ḇ  [LATIN CAPITAL LETTER B WITH LINE BELOW]
  245.                 case '\u24B7': // Ⓑ  [CIRCLED LATIN CAPITAL LETTER B]
  246.                 case '\uFF22': // B  [FULLWIDTH LATIN CAPITAL LETTER B]
  247.                 case '\u0392': // Β  [GREEK CAPITAL LETTER BETA]
  248.                 case '\uA7B4': // Ꞵ  [LATIN CAPITAL LETTER BETA]
  249.                 case '\u0411': // Б  [CYRILLIC CAPITAL LETTER BE]
  250.                 case '\u2C01': // Ⰱ  [GLAGOLITIC CAPITAL LETTER BUKY]
  251.                 case '\u16D2': // ᛒ  [RUNIC LETTER BERKANAN BEORC BJARKAN B]
  252.                 case '\u16D3': // ᛓ  [RUNIC LETTER SHORT-TWIG-BJARKAN B]
  253.                     return "B";
  254.                 case '\u0180': // ƀ  [LATIN SMALL LETTER B WITH STROKE]
  255.                 case '\u0183': // ƃ  [LATIN SMALL LETTER B WITH TOPBAR]
  256.                 case '\u0253': // ɓ  [LATIN SMALL LETTER B WITH HOOK]
  257.                 case '\u1D6C': // ᵬ  [LATIN SMALL LETTER B WITH MIDDLE TILDE]
  258.                 case '\u1D80': // ᶀ  [LATIN SMALL LETTER B WITH PALATAL HOOK]
  259.                 case '\u1E03': // ḃ  [LATIN SMALL LETTER B WITH DOT ABOVE]
  260.                 case '\u1E05': // ḅ  [LATIN SMALL LETTER B WITH DOT BELOW]
  261.                 case '\u1E07': // ḇ  [LATIN SMALL LETTER B WITH LINE BELOW]
  262.                 case '\u24D1': // ⓑ  [CIRCLED LATIN SMALL LETTER B]
  263.                 case '\uFF42': // b  [FULLWIDTH LATIN SMALL LETTER B]
  264.                 case '\u03B2': // β  [GREEK SMALL LETTER BETA]
  265.                 case '\u03D0': // ϐ  [GREEK BETA SYMBOL]
  266.                 case '\u1D5D': // ᵝ  [MODIFIER LETTER SMALL BETA]
  267.                 case '\u1D66': // ᵦ  [GREEK SUBSCRIPT SMALL LETTER BETA]
  268.                 case '\uA7B5': // ꞵ  [LATIN SMALL LETTER BETA]
  269.                 case '\u0431': // б  [CYRILLIC SMALL LETTER BE]
  270.                 case '\u2C31': // ⰱ  [GLAGOLITIC SMALL LETTER BUKY]
  271.                     return "b";
  272.                 case '\u249D': // ⒝  [PARENTHESIZED LATIN SMALL LETTER B]
  273.                     return "(b)";
  274.                 case '\u00C7': // Ç  [LATIN CAPITAL LETTER C WITH CEDILLA]
  275.                 case '\u0106': // Ć  [LATIN CAPITAL LETTER C WITH ACUTE]
  276.                 case '\u0108': // Ĉ  [LATIN CAPITAL LETTER C WITH CIRCUMFLEX]
  277.                 case '\u010A': // Ċ  [LATIN CAPITAL LETTER C WITH DOT ABOVE]
  278.                 case '\u010C': // Č  [LATIN CAPITAL LETTER C WITH CARON]
  279.                 case '\u0187': // Ƈ  [LATIN CAPITAL LETTER C WITH HOOK]
  280.                 case '\u023B': // Ȼ  [LATIN CAPITAL LETTER C WITH STROKE]
  281.                 case '\u0297': // ʗ  [LATIN LETTER STRETCHED C]
  282.                 case '\u1D04': // ᴄ  [LATIN LETTER SMALL CAPITAL C]
  283.                 case '\u1E08': // Ḉ  [LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE]
  284.                 case '\u24B8': // Ⓒ  [CIRCLED LATIN CAPITAL LETTER C]
  285.                 case '\uFF23': // C  [FULLWIDTH LATIN CAPITAL LETTER C]
  286.                 case '\u16CD': // ᛍ  [RUNIC LETTER C]
  287.                 case '\u16B3': // ᚳ  [RUNIC LETTER CEN]
  288.                     return "C";
  289.                 case '\u00E7': // ç  [LATIN SMALL LETTER C WITH CEDILLA]
  290.                 case '\u0107': // ć  [LATIN SMALL LETTER C WITH ACUTE]
  291.                 case '\u0109': // ĉ  [LATIN SMALL LETTER C WITH CIRCUMFLEX]
  292.                 case '\u010B': // ċ  [LATIN SMALL LETTER C WITH DOT ABOVE]
  293.                 case '\u010D': // č  [LATIN SMALL LETTER C WITH CARON]
  294.                 case '\u0188': // ƈ  [LATIN SMALL LETTER C WITH HOOK]
  295.                 case '\u023C': // ȼ  [LATIN SMALL LETTER C WITH STROKE]
  296.                 case '\u0255': // ɕ  [LATIN SMALL LETTER C WITH CURL]
  297.                 case '\u1E09': // ḉ  [LATIN SMALL LETTER C WITH CEDILLA AND ACUTE]
  298.                 case '\u2184': // ↄ  [LATIN SMALL LETTER REVERSED C]
  299.                 case '\u24D2': // ⓒ  [CIRCLED LATIN SMALL LETTER C]
  300.                 case '\uA73E': // Ꜿ  [LATIN CAPITAL LETTER REVERSED C WITH DOT]
  301.                 case '\uA73F': // ꜿ  [LATIN SMALL LETTER REVERSED C WITH DOT]
  302.                 case '\uFF43': // c  [FULLWIDTH LATIN SMALL LETTER C]
  303.                 case '\u00A2': // ¢  [CENT SIGN]
  304.                     return "c";
  305.                 case '\u249E': // ⒞  [PARENTHESIZED LATIN SMALL LETTER C]
  306.                     return "(c)";
  307.                 case '\u00D0': // Ð  [LATIN CAPITAL LETTER ETH]
  308.                 case '\u010E': // Ď  [LATIN CAPITAL LETTER D WITH CARON]
  309.                 case '\u0110': // Đ  [LATIN CAPITAL LETTER D WITH STROKE]
  310.                 case '\u0189': // Ɖ  [LATIN CAPITAL LETTER AFRICAN D]
  311.                 case '\u018A': // Ɗ  [LATIN CAPITAL LETTER D WITH HOOK]
  312.                 case '\u018B': // Ƌ  [LATIN CAPITAL LETTER D WITH TOPBAR]
  313.                 case '\u1D05': // ᴅ  [LATIN LETTER SMALL CAPITAL D]
  314.                 case '\u1D06': // ᴆ  [LATIN LETTER SMALL CAPITAL ETH]
  315.                 case '\u1E0A': // Ḋ  [LATIN CAPITAL LETTER D WITH DOT ABOVE]
  316.                 case '\u1E0C': // Ḍ  [LATIN CAPITAL LETTER D WITH DOT BELOW]
  317.                 case '\u1E0E': // Ḏ  [LATIN CAPITAL LETTER D WITH LINE BELOW]
  318.                 case '\u1E10': // Ḑ  [LATIN CAPITAL LETTER D WITH CEDILLA]
  319.                 case '\u1E12': // Ḓ  [LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW]
  320.                 case '\u24B9': // Ⓓ  [CIRCLED LATIN CAPITAL LETTER D]
  321.                 case '\uA779': // Ꝺ  [LATIN CAPITAL LETTER INSULAR D]
  322.                 case '\uFF24': // D  [FULLWIDTH LATIN CAPITAL LETTER D]
  323.                 case '\u0394': // Δ  [GREEK CAPITAL LETTER DELTA]
  324.                 case '\u2C86': // Ⲇ  [COPTIC CAPITAL LETTER DALDA]
  325.                 case '\u0414': // Д  [CYRILLIC CAPITAL LETTER DE]
  326.                 case '\u2C04': // Ⰴ  [GLAGOLITIC CAPITAL LETTER DOBRO]
  327.                 case '\u16DE': // ᛞ  [RUNIC LETTER DAGAZ DAEG D]
  328.                 case '\u16D1': // ᛑ  [RUNIC LETTER D]
  329.                     return "D";
  330.                 case '\u00F0': // ð  [LATIN SMALL LETTER ETH]
  331.                 case '\u010F': // ď  [LATIN SMALL LETTER D WITH CARON]
  332.                 case '\u0111': // đ  [LATIN SMALL LETTER D WITH STROKE]
  333.                 case '\u018C': // ƌ  [LATIN SMALL LETTER D WITH TOPBAR]
  334.                 case '\u0221': // ȡ  [LATIN SMALL LETTER D WITH CURL]
  335.                 case '\u0256': // ɖ  [LATIN SMALL LETTER D WITH TAIL]
  336.                 case '\u0257': // ɗ  [LATIN SMALL LETTER D WITH HOOK]
  337.                 case '\u1D6D': // ᵭ  [LATIN SMALL LETTER D WITH MIDDLE TILDE]
  338.                 case '\u1D81': // ᶁ  [LATIN SMALL LETTER D WITH PALATAL HOOK]
  339.                 case '\u1D91': // ᶑ  [LATIN SMALL LETTER D WITH HOOK AND TAIL]
  340.                 case '\u1E0B': // ḋ  [LATIN SMALL LETTER D WITH DOT ABOVE]
  341.                 case '\u1E0D': // ḍ  [LATIN SMALL LETTER D WITH DOT BELOW]
  342.                 case '\u1E0F': // ḏ  [LATIN SMALL LETTER D WITH LINE BELOW]
  343.                 case '\u1E11': // ḑ  [LATIN SMALL LETTER D WITH CEDILLA]
  344.                 case '\u1E13': // ḓ  [LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW]
  345.                 case '\u24D3': // ⓓ  [CIRCLED LATIN SMALL LETTER D]
  346.                 case '\uA77A': // ꝺ  [LATIN SMALL LETTER INSULAR D]
  347.                 case '\uFF44': // d  [FULLWIDTH LATIN SMALL LETTER D]
  348.                 case '\u03B4': // δ  [GREEK SMALL LETTER DELTA]
  349.                 case '\u1D5F': // ᵟ  [MODIFIER LETTER SMALL DELTA]
  350.                 case '\u2C87': // ⲇ  [COPTIC SMALL LETTER DALDA]
  351.                 case '\u1E9F': // ẟ  [LATIN SMALL LETTER DELTA]
  352.                 case '\u018D': // ƍ  [LATIN SMALL LETTER TURNED DELTA]
  353.                 case '\u0434': // д  [CYRILLIC SMALL LETTER DE]
  354.                 case '\u1C81': // ᲁ  [CYRILLIC SMALL LETTER LONG-LEGGED DE]
  355.                 case '\u2C34': // ⰴ  [GLAGOLITIC SMALL LETTER DOBRO]
  356.                     return "d";
  357.                 case '\u01C4': // DŽ  [LATIN CAPITAL LETTER DZ WITH CARON]
  358.                 case '\u01F1': // DZ  [LATIN CAPITAL LETTER DZ]
  359.                 case '\uA682': // Ꚃ  [CYRILLIC CAPITAL LETTER DZWE]
  360.                 case '\u0405': // Ѕ  [CYRILLIC CAPITAL LETTER DZE]
  361.                 case '\uA644': // Ꙅ  [CYRILLIC CAPITAL LETTER REVERSED DZE]
  362.                 case '\u0402': // Ђ  [CYRILLIC CAPITAL LETTER DJE]
  363.                 case '\u0403': // Ѓ  [CYRILLIC CAPITAL LETTER GJE]
  364.                 case '\uA648': // Ꙉ  [CYRILLIC CAPITAL LETTER DJERV]
  365.                 case '\u040F': // Џ  [CYRILLIC CAPITAL LETTER DZHE]
  366.                 case '\uA642': // Ꙃ  [CYRILLIC CAPITAL LETTER DZELO]
  367.                 case '\u2C07': // Ⰷ  [GLAGOLITIC CAPITAL LETTER DZELO]
  368.                 case '\u2C0C': // Ⰼ  [GLAGOLITIC CAPITAL LETTER DJERVI]
  369.                     return "DZ";
  370.                 case '\u01C5': // Dž  [LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]
  371.                 case '\u01F2': // Dz  [LATIN CAPITAL LETTER D WITH SMALL LETTER Z]
  372.                     return "Dz";
  373.                 case '\u249F': // ⒟  [PARENTHESIZED LATIN SMALL LETTER D]
  374.                     return "(d)";
  375.                 case '\u0238': // ȸ  [LATIN SMALL LETTER DB DIGRAPH]
  376.                     return "db";
  377.                 case '\u01C6': // dž  [LATIN SMALL LETTER DZ WITH CARON]
  378.                 case '\u01F3': // dz  [LATIN SMALL LETTER DZ]
  379.                 case '\u02A3': // ʣ  [LATIN SMALL LETTER DZ DIGRAPH]
  380.                 case '\u02A5': // ʥ  [LATIN SMALL LETTER DZ DIGRAPH WITH CURL]
  381.                 case '\uA683': // ꚃ  [CYRILLIC SMALL LETTER DZWE]
  382.                 case '\u0455': // ѕ  [CYRILLIC SMALL LETTER DZE]
  383.                 case '\uA645': // ꙅ  [CYRILLIC SMALL LETTER REVERSED DZE]
  384.                 case '\u0452': // ђ  [CYRILLIC SMALL LETTER DJE]
  385.                 case '\u0453': // ѓ  [CYRILLIC SMALL LETTER GJE]
  386.                 case '\uA649': // ꙉ  [CYRILLIC SMALL LETTER DJERV]
  387.                 case '\u045F': // џ  [CYRILLIC SMALL LETTER DZHE]
  388.                 case '\uA643': // ꙃ  [CYRILLIC SMALL LETTER DZELO]
  389.                 case '\u2C37': // ⰷ  [GLAGOLITIC SMALL LETTER DZELO]
  390.                 case '\u2C3C': // ⰼ  [GLAGOLITIC SMALL LETTER DJERVI]
  391.                     return "dz";
  392.                 case '\u00C8': // È  [LATIN CAPITAL LETTER E WITH GRAVE]
  393.                 case '\u00C9': // É  [LATIN CAPITAL LETTER E WITH ACUTE]
  394.                 case '\u00CA': // Ê  [LATIN CAPITAL LETTER E WITH CIRCUMFLEX]
  395.                 case '\u00CB': // Ë  [LATIN CAPITAL LETTER E WITH DIAERESIS]
  396.                 case '\u0112': // Ē  [LATIN CAPITAL LETTER E WITH MACRON]
  397.                 case '\u0114': // Ĕ  [LATIN CAPITAL LETTER E WITH BREVE]
  398.                 case '\u0116': // Ė  [LATIN CAPITAL LETTER E WITH DOT ABOVE]
  399.                 case '\u0118': // Ę  [LATIN CAPITAL LETTER E WITH OGONEK]
  400.                 case '\u011A': // Ě  [LATIN CAPITAL LETTER E WITH CARON]
  401.                 case '\u018E': // Ǝ  [LATIN CAPITAL LETTER REVERSED E]
  402.                 case '\u0190': // Ɛ  [LATIN CAPITAL LETTER OPEN E]
  403.                 case '\u0204': // Ȅ  [LATIN CAPITAL LETTER E WITH DOUBLE GRAVE]
  404.                 case '\u0206': // Ȇ  [LATIN CAPITAL LETTER E WITH INVERTED BREVE]
  405.                 case '\u0228': // Ȩ  [LATIN CAPITAL LETTER E WITH CEDILLA]
  406.                 case '\u0246': // Ɇ  [LATIN CAPITAL LETTER E WITH STROKE]
  407.                 case '\u1D07': // ᴇ  [LATIN LETTER SMALL CAPITAL E]
  408.                 case '\u1E14': // Ḕ  [LATIN CAPITAL LETTER E WITH MACRON AND GRAVE]
  409.                 case '\u1E16': // Ḗ  [LATIN CAPITAL LETTER E WITH MACRON AND ACUTE]
  410.                 case '\u1E18': // Ḙ  [LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW]
  411.                 case '\u1E1A': // Ḛ  [LATIN CAPITAL LETTER E WITH TILDE BELOW]
  412.                 case '\u1E1C': // Ḝ  [LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE]
  413.                 case '\u1EB8': // Ẹ  [LATIN CAPITAL LETTER E WITH DOT BELOW]
  414.                 case '\u1EBA': // Ẻ  [LATIN CAPITAL LETTER E WITH HOOK ABOVE]
  415.                 case '\u1EBC': // Ẽ  [LATIN CAPITAL LETTER E WITH TILDE]
  416.                 case '\u1EBE': // Ế  [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE]
  417.                 case '\u1EC0': // Ề  [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE]
  418.                 case '\u1EC2': // Ể  [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE]
  419.                 case '\u1EC4': // Ễ  [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE]
  420.                 case '\u1EC6': // Ệ  [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW]
  421.                 case '\u24BA': // Ⓔ  [CIRCLED LATIN CAPITAL LETTER E]
  422.                 case '\u2C7B': // ⱻ  [LATIN LETTER SMALL CAPITAL TURNED E]
  423.                 case '\uFF25': // E  [FULLWIDTH LATIN CAPITAL LETTER E]
  424.                 case '\u018F': // Ə  [LATIN CAPITAL LETTER SCHWA]
  425.                 case '\u0259': // ə  [LATIN SMALL LETTER SCHWA]
  426.                 case '\u025A': // ɚ  [LATIN SMALL LETTER SCHWA WITH HOOK]
  427.                 case '\u1D95': // ᶕ  [LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK]
  428.                 case '\u2094': // ₔ  [LATIN SUBSCRIPT SMALL LETTER SCHWA]
  429.                 case '\u0395': // Ε  [GREEK CAPITAL LETTER EPSILON]
  430.                 case '\u0388': // Έ  [GREEK CAPITAL LETTER EPSILON WITH TONOS]
  431.                 case '\u2C88': // Ⲉ  [COPTIC CAPITAL LETTER EIE]
  432.                 case '\u0415': // Е  [CYRILLIC CAPITAL LETTER IE]
  433.                 case '\u0400': // Ѐ  [CYRILLIC CAPITAL LETTER IE WITH GRAVE]
  434.                 case '\u042D': // Э  [CYRILLIC CAPITAL LETTER E]
  435.                 case '\u0466': // Ѧ  [CYRILLIC CAPITAL LETTER LITTLE YUS]
  436.                 case '\uA658': // Ꙙ  [CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS]
  437.                 case '\u2C05': // Ⰵ  [GLAGOLITIC CAPITAL LETTER YESTU]
  438.                 case '\u2C24': // Ⱔ  [GLAGOLITIC CAPITAL LETTER SMALL YUS]
  439.                 case '\u2C25': // Ⱕ  [GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL]
  440.                 case '\u16D6': // ᛖ  [RUNIC LETTER EHWAZ EH E]
  441.                 case '\u16C2': // ᛂ  [RUNIC LETTER E]
  442.                 case '\u16B6': // ᚶ  [RUNIC LETTER ENG]
  443.                 case '\u16E0': // ᛠ  [RUNIC LETTER EAR]
  444.                     return "E";
  445.                 case '\u16F6': // ᛶ  [RUNIC LETTER FRANKS CASKET EH]
  446.                     return "EH";
  447.                 case '\u00E8': // è  [LATIN SMALL LETTER E WITH GRAVE]
  448.                 case '\u00E9': // é  [LATIN SMALL LETTER E WITH ACUTE]
  449.                 case '\u00EA': // ê  [LATIN SMALL LETTER E WITH CIRCUMFLEX]
  450.                 case '\u00EB': // ë  [LATIN SMALL LETTER E WITH DIAERESIS]
  451.                 case '\u0113': // ē  [LATIN SMALL LETTER E WITH MACRON]
  452.                 case '\u0115': // ĕ  [LATIN SMALL LETTER E WITH BREVE]
  453.                 case '\u0117': // ė  [LATIN SMALL LETTER E WITH DOT ABOVE]
  454.                 case '\u0119': // ę  [LATIN SMALL LETTER E WITH OGONEK]
  455.                 case '\u011B': // ě  [LATIN SMALL LETTER E WITH CARON]
  456.                 case '\u01DD': // ǝ  [LATIN SMALL LETTER TURNED E]
  457.                 case '\u0205': // ȅ  [LATIN SMALL LETTER E WITH DOUBLE GRAVE]
  458.                 case '\u0207': // ȇ  [LATIN SMALL LETTER E WITH INVERTED BREVE]
  459.                 case '\u0229': // ȩ  [LATIN SMALL LETTER E WITH CEDILLA]
  460.                 case '\u0247': // ɇ  [LATIN SMALL LETTER E WITH STROKE]
  461.                 case '\u0258': // ɘ  [LATIN SMALL LETTER REVERSED E]
  462.                 case '\u025B': // ɛ  [LATIN SMALL LETTER OPEN E]
  463.                 case '\u025C': // ɜ  [LATIN SMALL LETTER REVERSED OPEN E]
  464.                 case '\u025D': // ɝ  [LATIN SMALL LETTER REVERSED OPEN E WITH HOOK]
  465.                 case '\u025E': // ɞ  [LATIN SMALL LETTER CLOSED REVERSED OPEN E]
  466.                 case '\u029A': // ʚ  [LATIN SMALL LETTER CLOSED OPEN E]
  467.                 case '\u1D08': // ᴈ  [LATIN SMALL LETTER TURNED OPEN E]
  468.                 case '\u1D92': // ᶒ  [LATIN SMALL LETTER E WITH RETROFLEX HOOK]
  469.                 case '\u1D93': // ᶓ  [LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK]
  470.                 case '\u1D94': // ᶔ  [LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK]
  471.                 case '\u1E15': // ḕ  [LATIN SMALL LETTER E WITH MACRON AND GRAVE]
  472.                 case '\u1E17': // ḗ  [LATIN SMALL LETTER E WITH MACRON AND ACUTE]
  473.                 case '\u1E19': // ḙ  [LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW]
  474.                 case '\u1E1B': // ḛ  [LATIN SMALL LETTER E WITH TILDE BELOW]
  475.                 case '\u1E1D': // ḝ  [LATIN SMALL LETTER E WITH CEDILLA AND BREVE]
  476.                 case '\u1EB9': // ẹ  [LATIN SMALL LETTER E WITH DOT BELOW]
  477.                 case '\u1EBB': // ẻ  [LATIN SMALL LETTER E WITH HOOK ABOVE]
  478.                 case '\u1EBD': // ẽ  [LATIN SMALL LETTER E WITH TILDE]
  479.                 case '\u1EBF': // ế  [LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE]
  480.                 case '\u1EC1': // ề  [LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE]
  481.                 case '\u1EC3': // ể  [LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE]
  482.                 case '\u1EC5': // ễ  [LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE]
  483.                 case '\u1EC7': // ệ  [LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW]
  484.                 case '\u2091': // ₑ  [LATIN SUBSCRIPT SMALL LETTER E]
  485.                 case '\u24D4': // ⓔ  [CIRCLED LATIN SMALL LETTER E]
  486.                 case '\u2C78': // ⱸ  [LATIN SMALL LETTER E WITH NOTCH]
  487.                 case '\uFF45': // e  [FULLWIDTH LATIN SMALL LETTER E]
  488.                 case '\u03B5': // ε  [GREEK SMALL LETTER EPSILON]
  489.                 case '\u03AD': // έ  [GREEK SMALL LETTER EPSILON WITH TONOS]
  490.                 case '\u03F5': // ϵ  [GREEK LUNATE EPSILON SYMBOL]
  491.                 case '\u03F6': // ϶  [GREEK REVERSED LUNATE EPSILON SYMBOL]
  492.                 case '\u2C89': // ⲉ  [COPTIC SMALL LETTER EIE]
  493.                 case '\u0435': // е  [CYRILLIC SMALL LETTER IE]
  494.                 case '\u0450': // ѐ  [CYRILLIC SMALL LETTER IE WITH GRAVE]
  495.                 case '\u044D': // э  [CYRILLIC SMALL LETTER E]
  496.                 case '\u0467': // ѧ  [CYRILLIC SMALL LETTER LITTLE YUS]
  497.                 case '\uA659': // ꙙ  [CYRILLIC SMALL LETTER CLOSED LITTLE YUS]
  498.                 case '\u2C35': // ⰵ  [GLAGOLITIC SMALL LETTER YESTU]
  499.                 case '\u2C54': // ⱔ  [GLAGOLITIC SMALL LETTER SMALL YUS]
  500.                 case '\u2C55': // ⱕ  [GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL]
  501.                     return "e";
  502.                 case '\u24A0': // ⒠  [PARENTHESIZED LATIN SMALL LETTER E]
  503.                     return "(e)";
  504.                 case '\u0191': // Ƒ  [LATIN CAPITAL LETTER F WITH HOOK]
  505.                 case '\u1E1E': // Ḟ  [LATIN CAPITAL LETTER F WITH DOT ABOVE]
  506.                 case '\u24BB': // Ⓕ  [CIRCLED LATIN CAPITAL LETTER F]
  507.                 case '\uA730': // ꜰ  [LATIN LETTER SMALL CAPITAL F]
  508.                 case '\uA77B': // Ꝼ  [LATIN CAPITAL LETTER INSULAR F]
  509.                 case '\uA7FB': // ꟻ  [LATIN EPIGRAPHIC LETTER REVERSED F]
  510.                 case '\uFF26': // F  [FULLWIDTH LATIN CAPITAL LETTER F]
  511.                 case '\u03A6': // Φ  [GREEK CAPITAL LETTER PHI]
  512.                 case '\u2CAA': // Ⲫ  [COPTIC CAPITAL LETTER FI]
  513.                 case '\u0424': // Ф  [CYRILLIC CAPITAL LETTER EF]
  514.                 case '\u2C17': // Ⱇ  [GLAGOLITIC CAPITAL LETTER FRITU]
  515.                 case '\u16A0': // ᚠ  [RUNIC LETTER FEHU FEOH FE F]
  516.                     return "F";
  517.                 case '\u0192': // ƒ  [LATIN SMALL LETTER F WITH HOOK]
  518.                 case '\u1D6E': // ᵮ  [LATIN SMALL LETTER F WITH MIDDLE TILDE]
  519.                 case '\u1D82': // ᶂ  [LATIN SMALL LETTER F WITH PALATAL HOOK]
  520.                 case '\u1E1F': // ḟ  [LATIN SMALL LETTER F WITH DOT ABOVE]
  521.                 case '\u1E9B': // ẛ  [LATIN SMALL LETTER LONG S WITH DOT ABOVE]
  522.                 case '\u24D5': // ⓕ  [CIRCLED LATIN SMALL LETTER F]
  523.                 case '\uA77C': // ꝼ  [LATIN SMALL LETTER INSULAR F]
  524.                 case '\uFF46': // f  [FULLWIDTH LATIN SMALL LETTER F]
  525.                 case '\u03C6': // φ  [GREEK SMALL LETTER PHI]
  526.                 case '\u2CAB': // ⲫ  [COPTIC SMALL LETTER FI]
  527.                 case '\u2C77': // ⱷ  [LATIN SMALL LETTER TAILLESS PHI]
  528.                 case '\u0278': // ɸ  [LATIN SMALL LETTER PHI]
  529.                 case '\u1D60': // ᵠ  [MODIFIER LETTER SMALL GREEK PHI]
  530.                 case '\u1D69': // ᵩ  [GREEK SUBSCRIPT SMALL LETTER PHI]
  531.                 case '\u1DB2': // ᶲ  [MODIFIER LETTER SMALL PHI]
  532.                 case '\u0444': // ф  [CYRILLIC SMALL LETTER EF]
  533.                 case '\u2C47': // ⱇ  [GLAGOLITIC SMALL LETTER FRITU]
  534.                     return "f";
  535.                 case '\u24A1': // ⒡  [PARENTHESIZED LATIN SMALL LETTER F]
  536.                     return "(f)";
  537.                 case '\uFB00': // ff  [LATIN SMALL LIGATURE FF]
  538.                     return "ff";
  539.                 case '\uFB03': // ffi  [LATIN SMALL LIGATURE FFI]
  540.                     return "ffi";
  541.                 case '\uFB04': // ffl  [LATIN SMALL LIGATURE FFL]
  542.                     return "ffl";
  543.                 case '\uFB01': // fi  [LATIN SMALL LIGATURE FI]
  544.                     return "fi";
  545.                 case '\uFB02': // fl  [LATIN SMALL LIGATURE FL]
  546.                     return "fl";
  547.                 case '\u011C': // Ĝ  [LATIN CAPITAL LETTER G WITH CIRCUMFLEX]
  548.                 case '\u011E': // Ğ  [LATIN CAPITAL LETTER G WITH BREVE]
  549.                 case '\u0120': // Ġ  [LATIN CAPITAL LETTER G WITH DOT ABOVE]
  550.                 case '\u0122': // Ģ  [LATIN CAPITAL LETTER G WITH CEDILLA]
  551.                 case '\u0193': // Ɠ  [LATIN CAPITAL LETTER G WITH HOOK]
  552.                 case '\u01E4': // Ǥ  [LATIN CAPITAL LETTER G WITH STROKE]
  553.                 case '\u01E5': // ǥ  [LATIN SMALL LETTER G WITH STROKE]
  554.                 case '\u01E6': // Ǧ  [LATIN CAPITAL LETTER G WITH CARON]
  555.                 case '\u01E7': // ǧ  [LATIN SMALL LETTER G WITH CARON]
  556.                 case '\u01F4': // Ǵ  [LATIN CAPITAL LETTER G WITH ACUTE]
  557.                 case '\u0262': // ɢ  [LATIN LETTER SMALL CAPITAL G]
  558.                 case '\u029B': // ʛ  [LATIN LETTER SMALL CAPITAL G WITH HOOK]
  559.                 case '\u1E20': // Ḡ  [LATIN CAPITAL LETTER G WITH MACRON]
  560.                 case '\u24BC': // Ⓖ  [CIRCLED LATIN CAPITAL LETTER G]
  561.                 case '\uA77D': // Ᵹ  [LATIN CAPITAL LETTER INSULAR G]
  562.                 case '\uA77E': // Ꝿ  [LATIN CAPITAL LETTER TURNED INSULAR G]
  563.                 case '\uFF27': // G  [FULLWIDTH LATIN CAPITAL LETTER G]
  564.                 case '\u0393': // Γ  [GREEK CAPITAL LETTER GAMMA]
  565.                 case '\u1D26': // ᴦ  [GREEK LETTER SMALL CAPITAL GAMMA]
  566.                 case '\u2C84': // Ⲅ  [COPTIC CAPITAL LETTER GAMMA]
  567.                 case '\u0413': // Г  [CYRILLIC CAPITAL LETTER GHE]
  568.                 case '\u0490': // Ґ  [CYRILLIC CAPITAL LETTER GHE WITH UPTURN]
  569.                 case '\u2C03': // Ⰳ  [GLAGOLITIC CAPITAL LETTER GLAGOLI]
  570.                 case '\u16B7': // ᚷ  [RUNIC LETTER GEBO GYFU G]
  571.                 case '\u16B5': // ᚵ  [RUNIC LETTER G]
  572.                 case '\u16B8': // ᚸ  [RUNIC LETTER GAR]
  573.                     return "G";
  574.                 case '\u011D': // ĝ  [LATIN SMALL LETTER G WITH CIRCUMFLEX]
  575.                 case '\u011F': // ğ  [LATIN SMALL LETTER G WITH BREVE]
  576.                 case '\u0121': // ġ  [LATIN SMALL LETTER G WITH DOT ABOVE]
  577.                 case '\u0123': // ģ  [LATIN SMALL LETTER G WITH CEDILLA]
  578.                 case '\u01F5': // ǵ  [LATIN SMALL LETTER G WITH ACUTE]
  579.                 case '\u0260': // ɠ  [LATIN SMALL LETTER G WITH HOOK]
  580.                 case '\u0261': // ɡ  [LATIN SMALL LETTER SCRIPT G]
  581.                 case '\u1D77': // ᵷ  [LATIN SMALL LETTER TURNED G]
  582.                 case '\u1D79': // ᵹ  [LATIN SMALL LETTER INSULAR G]
  583.                 case '\u1D83': // ᶃ  [LATIN SMALL LETTER G WITH PALATAL HOOK]
  584.                 case '\u1E21': // ḡ  [LATIN SMALL LETTER G WITH MACRON]
  585.                 case '\u24D6': // ⓖ  [CIRCLED LATIN SMALL LETTER G]
  586.                 case '\uA77F': // ꝿ  [LATIN SMALL LETTER TURNED INSULAR G]
  587.                 case '\uFF47': // g  [FULLWIDTH LATIN SMALL LETTER G]
  588.                 case '\u03B3': // γ  [GREEK SMALL LETTER GAMMA]
  589.                 case '\u1D5E': // ᵞ  [MODIFIER LETTER SMALL GREEK GAMMA]
  590.                 case '\u1D67': // ᵧ  [GREEK SUBSCRIPT SMALL LETTER GAMMA]
  591.                 case '\u2C85': // ⲅ  [COPTIC SMALL LETTER GAMMA]
  592.                 case '\u0433': // г  [CYRILLIC SMALL LETTER GHE]
  593.                 case '\u0491': // ґ  [CYRILLIC SMALL LETTER GHE WITH UPTURN]
  594.                 case '\u2C33': // ⰳ  [GLAGOLITIC SMALL LETTER GLAGOLI]
  595.                     return "g";
  596.                 case '\u24A2': // ⒢  [PARENTHESIZED LATIN SMALL LETTER G]
  597.                     return "(g)";
  598.                 case '\u0124': // Ĥ  [LATIN CAPITAL LETTER H WITH CIRCUMFLEX]
  599.                 case '\u0126': // Ħ  [LATIN CAPITAL LETTER H WITH STROKE]
  600.                 case '\u021E': // Ȟ  [LATIN CAPITAL LETTER H WITH CARON]
  601.                 case '\u029C': // ʜ  [LATIN LETTER SMALL CAPITAL H]
  602.                 case '\u1E22': // Ḣ  [LATIN CAPITAL LETTER H WITH DOT ABOVE]
  603.                 case '\u1E24': // Ḥ  [LATIN CAPITAL LETTER H WITH DOT BELOW]
  604.                 case '\u1E26': // Ḧ  [LATIN CAPITAL LETTER H WITH DIAERESIS]
  605.                 case '\u1E28': // Ḩ  [LATIN CAPITAL LETTER H WITH CEDILLA]
  606.                 case '\u1E2A': // Ḫ  [LATIN CAPITAL LETTER H WITH BREVE BELOW]
  607.                 case '\u24BD': // Ⓗ  [CIRCLED LATIN CAPITAL LETTER H]
  608.                 case '\u2C67': // Ⱨ  [LATIN CAPITAL LETTER H WITH DESCENDER]
  609.                 case '\u2C75': // Ⱶ  [LATIN CAPITAL LETTER HALF H]
  610.                 case '\uFF28': // H  [FULLWIDTH LATIN CAPITAL LETTER H]
  611.                 case '\u0370': // Ͱ  [GREEK CAPITAL LETTER HETA]
  612.                 case '\u16BA': // ᚺ  [RUNIC LETTER HAGLAZ H]
  613.                 case '\u16BB': // ᚻ  [RUNIC LETTER HAEGL H]
  614.                 case '\u16BC': // ᚼ  [RUNIC LETTER LONG-BRANCH-HAGALL H]
  615.                 case '\u16BD': // ᚽ  [RUNIC LETTER SHORT-TWIG-HAGALL H]
  616.                     return "H";
  617.                 case '\u0125': // ĥ  [LATIN SMALL LETTER H WITH CIRCUMFLEX]
  618.                 case '\u0127': // ħ  [LATIN SMALL LETTER H WITH STROKE]
  619.                 case '\u021F': // ȟ  [LATIN SMALL LETTER H WITH CARON]
  620.                 case '\u0265': // ɥ  [LATIN SMALL LETTER TURNED H]
  621.                 case '\u0266': // ɦ  [LATIN SMALL LETTER H WITH HOOK]
  622.                 case '\u02AE': // ʮ  [LATIN SMALL LETTER TURNED H WITH FISHHOOK]
  623.                 case '\u02AF': // ʯ  [LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL]
  624.                 case '\u1E23': // ḣ  [LATIN SMALL LETTER H WITH DOT ABOVE]
  625.                 case '\u1E25': // ḥ  [LATIN SMALL LETTER H WITH DOT BELOW]
  626.                 case '\u1E27': // ḧ  [LATIN SMALL LETTER H WITH DIAERESIS]
  627.                 case '\u1E29': // ḩ  [LATIN SMALL LETTER H WITH CEDILLA]
  628.                 case '\u1E2B': // ḫ  [LATIN SMALL LETTER H WITH BREVE BELOW]
  629.                 case '\u1E96': // ẖ  [LATIN SMALL LETTER H WITH LINE BELOW]
  630.                 case '\u24D7': // ⓗ  [CIRCLED LATIN SMALL LETTER H]
  631.                 case '\u2C68': // ⱨ  [LATIN SMALL LETTER H WITH DESCENDER]
  632.                 case '\u2C76': // ⱶ  [LATIN SMALL LETTER HALF H]
  633.                 case '\uFF48': // h  [FULLWIDTH LATIN SMALL LETTER H]
  634.                 case '\u0371': // ͱ  [GREEK SMALL LETTER HETA]
  635.                     return "h";
  636.                 case '\u01F6': // Ƕ  [LATIN CAPITAL LETTER HWAIR]
  637.                     return "HV";
  638.                 case '\u24A3': // ⒣  [PARENTHESIZED LATIN SMALL LETTER H]
  639.                     return "(h)";
  640.                 case '\u0195': // ƕ  [LATIN SMALL LETTER HV]
  641.                     return "hv";
  642.                 case '\u00CC': // Ì  [LATIN CAPITAL LETTER I WITH GRAVE]
  643.                 case '\u00CD': // Í  [LATIN CAPITAL LETTER I WITH ACUTE]
  644.                 case '\u00CE': // Î  [LATIN CAPITAL LETTER I WITH CIRCUMFLEX]
  645.                 case '\u00CF': // Ï  [LATIN CAPITAL LETTER I WITH DIAERESIS]
  646.                 case '\u0128': // Ĩ  [LATIN CAPITAL LETTER I WITH TILDE]
  647.                 case '\u012A': // Ī  [LATIN CAPITAL LETTER I WITH MACRON]
  648.                 case '\u012C': // Ĭ  [LATIN CAPITAL LETTER I WITH BREVE]
  649.                 case '\u012E': // Į  [LATIN CAPITAL LETTER I WITH OGONEK]
  650.                 case '\u0130': // İ  [LATIN CAPITAL LETTER I WITH DOT ABOVE]
  651.                 case '\u0196': // Ɩ  [LATIN CAPITAL LETTER IOTA]
  652.                 case '\u0197': // Ɨ  [LATIN CAPITAL LETTER I WITH STROKE]
  653.                 case '\u01CF': // Ǐ  [LATIN CAPITAL LETTER I WITH CARON]
  654.                 case '\u0208': // Ȉ  [LATIN CAPITAL LETTER I WITH DOUBLE GRAVE]
  655.                 case '\u020A': // Ȋ  [LATIN CAPITAL LETTER I WITH INVERTED BREVE]
  656.                 case '\u026A': // ɪ  [LATIN LETTER SMALL CAPITAL I]
  657.                 case '\u1D7B': // ᵻ  [LATIN SMALL CAPITAL LETTER I WITH STROKE]
  658.                 case '\u1E2C': // Ḭ  [LATIN CAPITAL LETTER I WITH TILDE BELOW]
  659.                 case '\u1E2E': // Ḯ  [LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE]
  660.                 case '\u1EC8': // Ỉ  [LATIN CAPITAL LETTER I WITH HOOK ABOVE]
  661.                 case '\u1ECA': // Ị  [LATIN CAPITAL LETTER I WITH DOT BELOW]
  662.                 case '\u24BE': // Ⓘ  [CIRCLED LATIN CAPITAL LETTER I]
  663.                 case '\uA7FE': // ꟾ  [LATIN EPIGRAPHIC LETTER I LONGA]
  664.                 case '\uFF29': // I  [FULLWIDTH LATIN CAPITAL LETTER I]
  665.                 case '\u0406': // І  [CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I]
  666.                 case '\u0397': // Η  [GREEK CAPITAL LETTER ETA]
  667.                 case '\u0389': // Ή  [GREEK CAPITAL LETTER ETA WITH TONOS]
  668.                 case '\u0399': // Ι  [GREEK CAPITAL LETTER IOTA]
  669.                 case '\u038A': // Ί  [GREEK CAPITAL LETTER IOTA WITH TONOS]
  670.                 case '\u03AA': // Ϊ  [GREEK CAPITAL LETTER IOTA WITH DIALYTIKA]
  671.                 case '\u0418': // И  [CYRILLIC CAPITAL LETTER I]
  672.                 case '\u040D': // Ѝ  [CYRILLIC CAPITAL LETTER I WITH GRAVE]
  673.                 case '\u042B': // Ы  [CYRILLIC CAPITAL LETTER YERU]
  674.                 case '\uA650': // Ꙑ  [CYRILLIC CAPITAL LETTER YERU WITH BACK YER]
  675.                 case '\uA65E': // Ꙟ  [CYRILLIC CAPITAL LETTER YN]
  676.                 case '\u0474': // Ѵ  [CYRILLIC CAPITAL LETTER IZHITSA]
  677.                 case '\u0476': // Ѷ  [CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT]
  678.                 case '\uA646': // Ꙇ  [CYRILLIC CAPITAL LETTER IOTA]
  679.                 case '\u2C09': // Ⰹ  [GLAGOLITIC CAPITAL LETTER IZHE]
  680.                 case '\u2C0A': // Ⰺ  [GLAGOLITIC CAPITAL LETTER INITIAL IZHE]
  681.                 case '\u2C0B': // Ⰻ  [GLAGOLITIC CAPITAL LETTER I]
  682.                 case '\u2C1F': // Ⱏ  [GLAGOLITIC CAPITAL LETTER YERU]
  683.                 case '\u2C2B': // Ⱛ  [GLAGOLITIC CAPITAL LETTER IZHITSA]
  684.                 case '\u16C1': // ᛁ  [RUNIC LETTER ISAZ IS ISS I]
  685.                 case '\u16C7': // ᛇ  [RUNIC LETTER IWAZ EOH]
  686.                     return "I";
  687.                 case '\u00EC': // ì  [LATIN SMALL LETTER I WITH GRAVE]
  688.                 case '\u00ED': // í  [LATIN SMALL LETTER I WITH ACUTE]
  689.                 case '\u00EE': // î  [LATIN SMALL LETTER I WITH CIRCUMFLEX]
  690.                 case '\u00EF': // ï  [LATIN SMALL LETTER I WITH DIAERESIS]
  691.                 case '\u0129': // ĩ  [LATIN SMALL LETTER I WITH TILDE]
  692.                 case '\u012B': // ī  [LATIN SMALL LETTER I WITH MACRON]
  693.                 case '\u012D': // ĭ  [LATIN SMALL LETTER I WITH BREVE]
  694.                 case '\u012F': // į  [LATIN SMALL LETTER I WITH OGONEK]
  695.                 case '\u0131': // ı  [LATIN SMALL LETTER DOTLESS I]
  696.                 case '\u01D0': // ǐ  [LATIN SMALL LETTER I WITH CARON]
  697.                 case '\u0209': // ȉ  [LATIN SMALL LETTER I WITH DOUBLE GRAVE]
  698.                 case '\u020B': // ȋ  [LATIN SMALL LETTER I WITH INVERTED BREVE]
  699.                 case '\u0268': // ɨ  [LATIN SMALL LETTER I WITH STROKE]
  700.                 case '\u1D09': // ᴉ  [LATIN SMALL LETTER TURNED I]
  701.                 case '\u1D62': // ᵢ  [LATIN SUBSCRIPT SMALL LETTER I]
  702.                 case '\u1D7C': // ᵼ  [LATIN SMALL LETTER IOTA WITH STROKE]
  703.                 case '\u1D96': // ᶖ  [LATIN SMALL LETTER I WITH RETROFLEX HOOK]
  704.                 case '\u1E2D': // ḭ  [LATIN SMALL LETTER I WITH TILDE BELOW]
  705.                 case '\u1E2F': // ḯ  [LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE]
  706.                 case '\u1EC9': // ỉ  [LATIN SMALL LETTER I WITH HOOK ABOVE]
  707.                 case '\u1ECB': // ị  [LATIN SMALL LETTER I WITH DOT BELOW]
  708.                 case '\u2071': // ⁱ  [SUPERSCRIPT LATIN SMALL LETTER I]
  709.                 case '\u24D8': // ⓘ  [CIRCLED LATIN SMALL LETTER I]
  710.                 case '\uFF49': // i  [FULLWIDTH LATIN SMALL LETTER I]
  711.                 case '\u0456': // і  [CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I]
  712.                 case '\u03B7': // η  [GREEK SMALL LETTER ETA]
  713.                 case '\u03AE': // ή  [GREEK SMALL LETTER ETA WITH TONOS]
  714.                 case '\u03B9': // ι  [GREEK SMALL LETTER IOTA]
  715.                 case '\u03AF': // ί  [GREEK SMALL LETTER IOTA WITH TONOS]
  716.                 case '\u03CA': // ϊ  [GREEK SMALL LETTER IOTA WITH DIALYTIKA]
  717.                 case '\u0438': // и  [CYRILLIC SMALL LETTER I]
  718.                 case '\u045D': // ѝ  [CYRILLIC SMALL LETTER I WITH GRAVE]
  719.                 case '\u044B': // ы  [CYRILLIC SMALL LETTER YERU]
  720.                 case '\uA651': // ꙑ  [CYRILLIC SMALL LETTER YERU WITH BACK YER]
  721.                 case '\uA65F': // ꙟ  [CYRILLIC SMALL LETTER YN]
  722.                 case '\u0475': // ѵ  [CYRILLIC SMALL LETTER IZHITSA]
  723.                 case '\u0477': // ѷ  [CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT]
  724.                 case '\uA647': // ꙇ  [CYRILLIC SMALL LETTER IOTA]
  725.                 case '\u2C39': // ⰹ  [GLAGOLITIC SMALL LETTER IZHE]
  726.                 case '\u2C3A': // ⰺ  [GLAGOLITIC SMALL LETTER INITIAL IZHE]
  727.                 case '\u2C3B': // ⰻ  [GLAGOLITIC SMALL LETTER I]
  728.                 case '\u2C4F': // ⱏ  [GLAGOLITIC SMALL LETTER YERU]
  729.                 case '\u2C5B': // ⱛ  [GLAGOLITIC SMALL LETTER IZHITSA]
  730.                     return "i";
  731.                 case '\u0132': // IJ  [LATIN CAPITAL LIGATURE IJ]
  732.                     return "IJ";
  733.                 case '\u24A4': // ⒤  [PARENTHESIZED LATIN SMALL LETTER I]
  734.                     return "(i)";
  735.                 case '\u0133': // ij  [LATIN SMALL LIGATURE IJ]
  736.                     return "ij";
  737.                 case '\u16F5': // ᛵ  [RUNIC LETTER FRANKS CASKET IS]
  738.                     return "IS";
  739.                 case '\u0134': // Ĵ  [LATIN CAPITAL LETTER J WITH CIRCUMFLEX]
  740.                 case '\u0248': // Ɉ  [LATIN CAPITAL LETTER J WITH STROKE]
  741.                 case '\u1D0A': // ᴊ  [LATIN LETTER SMALL CAPITAL J]
  742.                 case '\u24BF': // Ⓙ  [CIRCLED LATIN CAPITAL LETTER J]
  743.                 case '\uFF2A': // J  [FULLWIDTH LATIN CAPITAL LETTER J]
  744.                 case '\u16C3': // ᛃ  [RUNIC LETTER JERAN J]
  745.                 case '\u16C4': // ᛄ  [RUNIC LETTER GER]
  746.                 case '\u16E1': // ᛡ  [RUNIC LETTER IOR]
  747.                     return "J";
  748.                 case '\u0135': // ĵ  [LATIN SMALL LETTER J WITH CIRCUMFLEX]
  749.                 case '\u01F0': // ǰ  [LATIN SMALL LETTER J WITH CARON]
  750.                 case '\u0237': // ȷ  [LATIN SMALL LETTER DOTLESS J]
  751.                 case '\u0249': // ɉ  [LATIN SMALL LETTER J WITH STROKE]
  752.                 case '\u025F': // ɟ  [LATIN SMALL LETTER DOTLESS J WITH STROKE]
  753.                 case '\u0284': // ʄ  [LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK]
  754.                 case '\u029D': // ʝ  [LATIN SMALL LETTER J WITH CROSSED-TAIL]
  755.                 case '\u24D9': // ⓙ  [CIRCLED LATIN SMALL LETTER J]
  756.                 case '\u2C7C': // ⱼ  [LATIN SUBSCRIPT SMALL LETTER J]
  757.                 case '\uFF4A': // j  [FULLWIDTH LATIN SMALL LETTER J]
  758.                     return "j";
  759.                 case '\u24A5': // ⒥  [PARENTHESIZED LATIN SMALL LETTER J]
  760.                     return "(j)";
  761.                 case '\u0136': // Ķ  [LATIN CAPITAL LETTER K WITH CEDILLA]
  762.                 case '\u0198': // Ƙ  [LATIN CAPITAL LETTER K WITH HOOK]
  763.                 case '\u01E8': // Ǩ  [LATIN CAPITAL LETTER K WITH CARON]
  764.                 case '\u1D0B': // ᴋ  [LATIN LETTER SMALL CAPITAL K]
  765.                 case '\u1E30': // Ḱ  [LATIN CAPITAL LETTER K WITH ACUTE]
  766.                 case '\u1E32': // Ḳ  [LATIN CAPITAL LETTER K WITH DOT BELOW]
  767.                 case '\u1E34': // Ḵ  [LATIN CAPITAL LETTER K WITH LINE BELOW]
  768.                 case '\u24C0': // Ⓚ  [CIRCLED LATIN CAPITAL LETTER K]
  769.                 case '\u2C69': // Ⱪ  [LATIN CAPITAL LETTER K WITH DESCENDER]
  770.                 case '\uA740': // Ꝁ  [LATIN CAPITAL LETTER K WITH STROKE]
  771.                 case '\uA742': // Ꝃ  [LATIN CAPITAL LETTER K WITH DIAGONAL STROKE]
  772.                 case '\uA744': // Ꝅ  [LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE]
  773.                 case '\uFF2B': // K  [FULLWIDTH LATIN CAPITAL LETTER K]
  774.                 case '\u039A': // Κ  [GREEK CAPITAL LETTER KAPPA]
  775.                 case '\u2C94': // Ⲕ  [COPTIC CAPITAL LETTER KAPA]
  776.                 case '\u041A': // К  [CYRILLIC CAPITAL LETTER KA]
  777.                 case '\u040C': // Ќ  [CYRILLIC CAPITAL LETTER KJE]
  778.                 case '\u2C0D': // Ⰽ  [GLAGOLITIC CAPITAL LETTER KAKO]
  779.                 case '\u16B2': // ᚲ  [RUNIC LETTER KAUNA]
  780.                 case '\u16B4': // ᚴ  [RUNIC LETTER KAUN K]
  781.                 case '\u16E3': // ᛣ  [RUNIC LETTER CALC]
  782.                 case '\u16F1': // ᛱ  [RUNIC LETTER K]
  783.                     return "K";
  784.                 case '\u16E4': // ᛤ  [RUNIC LETTER CEALC]
  785.                     return "KK";
  786.                 case '\u16E2': // ᛢ  [RUNIC LETTER CWEORTH]
  787.                     return "KW";
  788.                 case '\u0137': // ķ  [LATIN SMALL LETTER K WITH CEDILLA]
  789.                 case '\u0199': // ƙ  [LATIN SMALL LETTER K WITH HOOK]
  790.                 case '\u01E9': // ǩ  [LATIN SMALL LETTER K WITH CARON]
  791.                 case '\u029E': // ʞ  [LATIN SMALL LETTER TURNED K]
  792.                 case '\u1D84': // ᶄ  [LATIN SMALL LETTER K WITH PALATAL HOOK]
  793.                 case '\u1E31': // ḱ  [LATIN SMALL LETTER K WITH ACUTE]
  794.                 case '\u1E33': // ḳ  [LATIN SMALL LETTER K WITH DOT BELOW]
  795.                 case '\u1E35': // ḵ  [LATIN SMALL LETTER K WITH LINE BELOW]
  796.                 case '\u24DA': // ⓚ  [CIRCLED LATIN SMALL LETTER K]
  797.                 case '\u2C6A': // ⱪ  [LATIN SMALL LETTER K WITH DESCENDER]
  798.                 case '\uA741': // ꝁ  [LATIN SMALL LETTER K WITH STROKE]
  799.                 case '\uA743': // ꝃ  [LATIN SMALL LETTER K WITH DIAGONAL STROKE]
  800.                 case '\uA745': // ꝅ  [LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE]
  801.                 case '\uFF4B': // k  [FULLWIDTH LATIN SMALL LETTER K]
  802.                 case '\u03BA': // κ  [GREEK SMALL LETTER KAPPA]
  803.                 case '\u03F0': // ϰ  [GREEK KAPPA SYMBOL]
  804.                 case '\u2C95': // ⲕ  [COPTIC SMALL LETTER KAPA]
  805.                 case '\u043A': // к  [CYRILLIC SMALL LETTER KA]
  806.                 case '\u045C': // ќ  [CYRILLIC SMALL LETTER KJE]
  807.                 case '\u2C3D': // ⰽ  [GLAGOLITIC SMALL LETTER KAKO]
  808.                     return "k";
  809.                 case '\u24A6': // ⒦  [PARENTHESIZED LATIN SMALL LETTER K]
  810.                     return "(k)";
  811.                 case '\u0139': // Ĺ  [LATIN CAPITAL LETTER L WITH ACUTE]
  812.                 case '\u013B': // Ļ  [LATIN CAPITAL LETTER L WITH CEDILLA]
  813.                 case '\u013D': // Ľ  [LATIN CAPITAL LETTER L WITH CARON]
  814.                 case '\u013F': // Ŀ  [LATIN CAPITAL LETTER L WITH MIDDLE DOT]
  815.                 case '\u0141': // Ł  [LATIN CAPITAL LETTER L WITH STROKE]
  816.                 case '\u023D': // Ƚ  [LATIN CAPITAL LETTER L WITH BAR]
  817.                 case '\u029F': // ʟ  [LATIN LETTER SMALL CAPITAL L]
  818.                 case '\u1D0C': // ᴌ  [LATIN LETTER SMALL CAPITAL L WITH STROKE]
  819.                 case '\u1E36': // Ḷ  [LATIN CAPITAL LETTER L WITH DOT BELOW]
  820.                 case '\u1E38': // Ḹ  [LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON]
  821.                 case '\u1E3A': // Ḻ  [LATIN CAPITAL LETTER L WITH LINE BELOW]
  822.                 case '\u1E3C': // Ḽ  [LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW]
  823.                 case '\u24C1': // Ⓛ  [CIRCLED LATIN CAPITAL LETTER L]
  824.                 case '\u2C60': // Ⱡ  [LATIN CAPITAL LETTER L WITH DOUBLE BAR]
  825.                 case '\u2C62': // Ɫ  [LATIN CAPITAL LETTER L WITH MIDDLE TILDE]
  826.                 case '\uA746': // Ꝇ  [LATIN CAPITAL LETTER BROKEN L]
  827.                 case '\uA748': // Ꝉ  [LATIN CAPITAL LETTER L WITH HIGH STROKE]
  828.                 case '\uA780': // Ꞁ  [LATIN CAPITAL LETTER TURNED L]
  829.                 case '\uFF2C': // L  [FULLWIDTH LATIN CAPITAL LETTER L]
  830.                 case '\u039B': // Λ  [GREEK CAPITAL LETTER LAMDA]
  831.                 case '\u1D27': // ᴧ  [GREEK LETTER SMALL CAPITAL LAMDA]
  832.                 case '\u2C96': // Ⲗ  [COPTIC CAPITAL LETTER LAULA]
  833.                 case '\u041B': // Л  [CYRILLIC CAPITAL LETTER EL]
  834.                 case '\u0409': // Љ  [CYRILLIC CAPITAL LETTER LJE]
  835.                 case '\u2C0E': // Ⰾ  [GLAGOLITIC CAPITAL LETTER LJUDIJE]
  836.                 case '\u16DA': // ᛚ  [RUNIC LETTER LAUKAZ LAGU LOGR L]
  837.                 case '\u16DB': // ᛛ  [RUNIC LETTER DOTTED-L]
  838.                     return "L";
  839.                 case '\u013A': // ĺ  [LATIN SMALL LETTER L WITH ACUTE]
  840.                 case '\u013C': // ļ  [LATIN SMALL LETTER L WITH CEDILLA]
  841.                 case '\u013E': // ľ  [LATIN SMALL LETTER L WITH CARON]
  842.                 case '\u0140': // ŀ  [LATIN SMALL LETTER L WITH MIDDLE DOT]
  843.                 case '\u0142': // ł  [LATIN SMALL LETTER L WITH STROKE]
  844.                 case '\u019A': // ƚ  [LATIN SMALL LETTER L WITH BAR]
  845.                 case '\u0234': // ȴ  [LATIN SMALL LETTER L WITH CURL]
  846.                 case '\u026B': // ɫ  [LATIN SMALL LETTER L WITH MIDDLE TILDE]
  847.                 case '\u026C': // ɬ  [LATIN SMALL LETTER L WITH BELT]
  848.                 case '\u026D': // ɭ  [LATIN SMALL LETTER L WITH RETROFLEX HOOK]
  849.                 case '\u1D85': // ᶅ  [LATIN SMALL LETTER L WITH PALATAL HOOK]
  850.                 case '\u1E37': // ḷ  [LATIN SMALL LETTER L WITH DOT BELOW]
  851.                 case '\u1E39': // ḹ  [LATIN SMALL LETTER L WITH DOT BELOW AND MACRON]
  852.                 case '\u1E3B': // ḻ  [LATIN SMALL LETTER L WITH LINE BELOW]
  853.                 case '\u1E3D': // ḽ  [LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW]
  854.                 case '\u24DB': // ⓛ  [CIRCLED LATIN SMALL LETTER L]
  855.                 case '\u2C61': // ⱡ  [LATIN SMALL LETTER L WITH DOUBLE BAR]
  856.                 case '\uA747': // ꝇ  [LATIN SMALL LETTER BROKEN L]
  857.                 case '\uA749': // ꝉ  [LATIN SMALL LETTER L WITH HIGH STROKE]
  858.                 case '\uA781': // ꞁ  [LATIN SMALL LETTER TURNED L]
  859.                 case '\uFF4C': // l  [FULLWIDTH LATIN SMALL LETTER L]
  860.                 case '\u03BB': // λ  [GREEK SMALL LETTER LAMDA]
  861.                 case '\u2C97': // ⲗ  [COPTIC SMALL LETTER LAULA]
  862.                 case '\u043B': // л  [CYRILLIC SMALL LETTER EL]
  863.                 case '\u0459': // љ  [CYRILLIC SMALL LETTER LJE]
  864.                 case '\u2C3E': // ⰾ  [GLAGOLITIC SMALL LETTER LJUDIJE]
  865.                     return "l";
  866.                 case '\u01C7': // LJ  [LATIN CAPITAL LETTER LJ]
  867.                     return "LJ";
  868.                 case '\u1EFA': // Ỻ  [LATIN CAPITAL LETTER MIDDLE-WELSH LL]
  869.                     return "LL";
  870.                 case '\u01C8': // Lj  [LATIN CAPITAL LETTER L WITH SMALL LETTER J]
  871.                     return "Lj";
  872.                 case '\u24A7': // ⒧  [PARENTHESIZED LATIN SMALL LETTER L]
  873.                     return "(l)";
  874.                 case '\u01C9': // lj  [LATIN SMALL LETTER LJ]
  875.                     return "lj";
  876.                 case '\u1EFB': // ỻ  [LATIN SMALL LETTER MIDDLE-WELSH LL]
  877.                     return "ll";
  878.                 case '\u02AA': // ʪ  [LATIN SMALL LETTER LS DIGRAPH]
  879.                     return "ls";
  880.                 case '\u02AB': // ʫ  [LATIN SMALL LETTER LZ DIGRAPH]
  881.                     return "lz";
  882.                 case '\u019C': // Ɯ  [LATIN CAPITAL LETTER TURNED M]
  883.                 case '\u1D0D': // ᴍ  [LATIN LETTER SMALL CAPITAL M]
  884.                 case '\u1E3E': // Ḿ  [LATIN CAPITAL LETTER M WITH ACUTE]
  885.                 case '\u1E40': // Ṁ  [LATIN CAPITAL LETTER M WITH DOT ABOVE]
  886.                 case '\u1E42': // Ṃ  [LATIN CAPITAL LETTER M WITH DOT BELOW]
  887.                 case '\u24C2': // Ⓜ  [CIRCLED LATIN CAPITAL LETTER M]
  888.                 case '\u2C6E': // Ɱ  [LATIN CAPITAL LETTER M WITH HOOK]
  889.                 case '\uA7FD': // ꟽ  [LATIN EPIGRAPHIC LETTER INVERTED M]
  890.                 case '\uA7FF': // ꟿ  [LATIN EPIGRAPHIC LETTER ARCHAIC M]
  891.                 case '\uFF2D': // M  [FULLWIDTH LATIN CAPITAL LETTER M]
  892.                 case '\u039C': // Μ  [GREEK CAPITAL LETTER MU]
  893.                 case '\u2C98': // Ⲙ  [COPTIC CAPITAL LETTER MI]
  894.                 case '\u041C': // М  [CYRILLIC CAPITAL LETTER EM]
  895.                 case '\u2C0F': // Ⰿ  [GLAGOLITIC CAPITAL LETTER MYSLITE]
  896.                 case '\u2C2E': // Ⱞ  [GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE]
  897.                 case '\u16D7': // ᛗ  [RUNIC LETTER MANNAZ MAN M]
  898.                 case '\u16D8': // ᛘ  [RUNIC LETTER LONG-BRANCH-MADR M]
  899.                 case '\u16D9': // ᛙ  [RUNIC LETTER SHORT-TWIG-MADR M]
  900.                     return "M";
  901.                 case '\u026F': // ɯ  [LATIN SMALL LETTER TURNED M]
  902.                 case '\u0270': // ɰ  [LATIN SMALL LETTER TURNED M WITH LONG LEG]
  903.                 case '\u0271': // ɱ  [LATIN SMALL LETTER M WITH HOOK]
  904.                 case '\u1D6F': // ᵯ  [LATIN SMALL LETTER M WITH MIDDLE TILDE]
  905.                 case '\u1D86': // ᶆ  [LATIN SMALL LETTER M WITH PALATAL HOOK]
  906.                 case '\u1E3F': // ḿ  [LATIN SMALL LETTER M WITH ACUTE]
  907.                 case '\u1E41': // ṁ  [LATIN SMALL LETTER M WITH DOT ABOVE]
  908.                 case '\u1E43': // ṃ  [LATIN SMALL LETTER M WITH DOT BELOW]
  909.                 case '\u24DC': // ⓜ  [CIRCLED LATIN SMALL LETTER M]
  910.                 case '\uFF4D': // m  [FULLWIDTH LATIN SMALL LETTER M]
  911.                 case '\u03BC': // μ  [GREEK SMALL LETTER MU]
  912.                 case '\u00B5': // µ  [MICRO SIGN]
  913.                 case '\u2C99': // ⲙ  [COPTIC SMALL LETTER MI]
  914.                 case '\u043C': // м  [CYRILLIC SMALL LETTER EM]
  915.                 case '\u2C3F': // ⰿ  [GLAGOLITIC SMALL LETTER MYSLITE]
  916.                 case '\u2C5E': // ⱞ  [GLAGOLITIC SMALL LETTER LATINATE MYSLITE]
  917.                     return "m";
  918.                 case '\u24A8': // ⒨  [PARENTHESIZED LATIN SMALL LETTER M]
  919.                     return "(m)";
  920.                 case '\u00D1': // Ñ  [LATIN CAPITAL LETTER N WITH TILDE]
  921.                 case '\u0143': // Ń  [LATIN CAPITAL LETTER N WITH ACUTE]
  922.                 case '\u0145': // Ņ  [LATIN CAPITAL LETTER N WITH CEDILLA]
  923.                 case '\u0147': // Ň  [LATIN CAPITAL LETTER N WITH CARON]
  924.                 case '\u014A': // Ŋ  [LATIN CAPITAL LETTER ENG]
  925.                 case '\u019D': // Ɲ  [LATIN CAPITAL LETTER N WITH LEFT HOOK]
  926.                 case '\u01F8': // Ǹ  [LATIN CAPITAL LETTER N WITH GRAVE]
  927.                 case '\u0220': // Ƞ  [LATIN CAPITAL LETTER N WITH LONG RIGHT LEG]
  928.                 case '\u0274': // ɴ  [LATIN LETTER SMALL CAPITAL N]
  929.                 case '\u1D0E': // ᴎ  [LATIN LETTER SMALL CAPITAL REVERSED N]
  930.                 case '\u1E44': // Ṅ  [LATIN CAPITAL LETTER N WITH DOT ABOVE]
  931.                 case '\u1E46': // Ṇ  [LATIN CAPITAL LETTER N WITH DOT BELOW]
  932.                 case '\u1E48': // Ṉ  [LATIN CAPITAL LETTER N WITH LINE BELOW]
  933.                 case '\u1E4A': // Ṋ  [LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW]
  934.                 case '\u24C3': // Ⓝ  [CIRCLED LATIN CAPITAL LETTER N]
  935.                 case '\uFF2E': // N  [FULLWIDTH LATIN CAPITAL LETTER N]
  936.                 case '\u039D': // Ν  [GREEK CAPITAL LETTER NU]
  937.                 case '\u2C9A': // Ⲛ  [COPTIC CAPITAL LETTER NI]
  938.                 case '\u041D': // Н  [CYRILLIC CAPITAL LETTER EN]
  939.                 case '\u040A': // Њ  [CYRILLIC CAPITAL LETTER NJE]
  940.                 case '\u2C10': // Ⱀ  [GLAGOLITIC CAPITAL LETTER NASHI]
  941.                 case '\u16BE': // ᚾ  [RUNIC LETTER NAUDIZ NYD NAUD N]
  942.                 case '\u16DC': // ᛜ  [RUNIC LETTER INGWAZ]
  943.                 case '\u16DD': // ᛝ  [RUNIC LETTER ING]
  944.                 case '\u16BF': // ᚿ  [RUNIC LETTER SHORT-TWIG-NAUD N]
  945.                 case '\u16C0': // ᛀ  [RUNIC LETTER DOTTED-N]
  946.                     return "N";
  947.                 case '\u00F1': // ñ  [LATIN SMALL LETTER N WITH TILDE]
  948.                 case '\u0144': // ń  [LATIN SMALL LETTER N WITH ACUTE]
  949.                 case '\u0146': // ņ  [LATIN SMALL LETTER N WITH CEDILLA]
  950.                 case '\u0148': // ň  [LATIN SMALL LETTER N WITH CARON]
  951.                 case '\u0149': // ʼn  [LATIN SMALL LETTER N PRECEDED BY APOSTROPHE]
  952.                 case '\u014B': // ŋ  [LATIN SMALL LETTER ENG]
  953.                 case '\u019E': // ƞ  [LATIN SMALL LETTER N WITH LONG RIGHT LEG]
  954.                 case '\u01F9': // ǹ  [LATIN SMALL LETTER N WITH GRAVE]
  955.                 case '\u0235': // ȵ  [LATIN SMALL LETTER N WITH CURL]
  956.                 case '\u0272': // ɲ  [LATIN SMALL LETTER N WITH LEFT HOOK]
  957.                 case '\u0273': // ɳ  [LATIN SMALL LETTER N WITH RETROFLEX HOOK]
  958.                 case '\u1D70': // ᵰ  [LATIN SMALL LETTER N WITH MIDDLE TILDE]
  959.                 case '\u1D87': // ᶇ  [LATIN SMALL LETTER N WITH PALATAL HOOK]
  960.                 case '\u1E45': // ṅ  [LATIN SMALL LETTER N WITH DOT ABOVE]
  961.                 case '\u1E47': // ṇ  [LATIN SMALL LETTER N WITH DOT BELOW]
  962.                 case '\u1E49': // ṉ  [LATIN SMALL LETTER N WITH LINE BELOW]
  963.                 case '\u1E4B': // ṋ  [LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW]
  964.                 case '\u207F': // ⁿ  [SUPERSCRIPT LATIN SMALL LETTER N]
  965.                 case '\u24DD': // ⓝ  [CIRCLED LATIN SMALL LETTER N]
  966.                 case '\uFF4E': // n  [FULLWIDTH LATIN SMALL LETTER N]
  967.                 case '\u03BD': // ν  [GREEK SMALL LETTER NU]
  968.                 case '\u2C9B': // ⲛ  [COPTIC SMALL LETTER NI]
  969.                 case '\u043D': // н  [CYRILLIC SMALL LETTER EN]
  970.                 case '\u045A': // њ  [CYRILLIC SMALL LETTER NJE]
  971.                 case '\u2C40': // ⱀ  [GLAGOLITIC SMALL LETTER NASHI]
  972.                     return "n";
  973.                 case '\u01CA': // NJ  [LATIN CAPITAL LETTER NJ]
  974.                     return "NJ";
  975.                 case '\u01CB': // Nj  [LATIN CAPITAL LETTER N WITH SMALL LETTER J]
  976.                     return "Nj";
  977.                 case '\u24A9': // ⒩  [PARENTHESIZED LATIN SMALL LETTER N]
  978.                     return "(n)";
  979.                 case '\u01CC': // nj  [LATIN SMALL LETTER NJ]
  980.                     return "nj";
  981.                 case '\u00D2': // Ò  [LATIN CAPITAL LETTER O WITH GRAVE]
  982.                 case '\u00D3': // Ó  [LATIN CAPITAL LETTER O WITH ACUTE]
  983.                 case '\u00D4': // Ô  [LATIN CAPITAL LETTER O WITH CIRCUMFLEX]
  984.                 case '\u00D5': // Õ  [LATIN CAPITAL LETTER O WITH TILDE]
  985.                 case '\u00D6': // Ö  [LATIN CAPITAL LETTER O WITH DIAERESIS]
  986.                 case '\u00D8': // Ø  [LATIN CAPITAL LETTER O WITH STROKE]
  987.                 case '\u014C': // Ō  [LATIN CAPITAL LETTER O WITH MACRON]
  988.                 case '\u014E': // Ŏ  [LATIN CAPITAL LETTER O WITH BREVE]
  989.                 case '\u0150': // Ő  [LATIN CAPITAL LETTER O WITH DOUBLE ACUTE]
  990.                 case '\u0186': // Ɔ  [LATIN CAPITAL LETTER OPEN O]
  991.                 case '\u019F': // Ɵ  [LATIN CAPITAL LETTER O WITH MIDDLE TILDE]
  992.                 case '\u01A0': // Ơ  [LATIN CAPITAL LETTER O WITH HORN]
  993.                 case '\u01D1': // Ǒ  [LATIN CAPITAL LETTER O WITH CARON]
  994.                 case '\u01EA': // Ǫ  [LATIN CAPITAL LETTER O WITH OGONEK]
  995.                 case '\u01EC': // Ǭ  [LATIN CAPITAL LETTER O WITH OGONEK AND MACRON]
  996.                 case '\u01FE': // Ǿ  [LATIN CAPITAL LETTER O WITH STROKE AND ACUTE]
  997.                 case '\u020C': // Ȍ  [LATIN CAPITAL LETTER O WITH DOUBLE GRAVE]
  998.                 case '\u020E': // Ȏ  [LATIN CAPITAL LETTER O WITH INVERTED BREVE]
  999.                 case '\u022A': // Ȫ  [LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON]
  1000.                 case '\u022C': // Ȭ  [LATIN CAPITAL LETTER O WITH TILDE AND MACRON]
  1001.                 case '\u022E': // Ȯ  [LATIN CAPITAL LETTER O WITH DOT ABOVE]
  1002.                 case '\u0230': // Ȱ  [LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON]
  1003.                 case '\u1D0F': // ᴏ  [LATIN LETTER SMALL CAPITAL O]
  1004.                 case '\u1D10': // ᴐ  [LATIN LETTER SMALL CAPITAL OPEN O]
  1005.                 case '\u1E4C': // Ṍ  [LATIN CAPITAL LETTER O WITH TILDE AND ACUTE]
  1006.                 case '\u1E4E': // Ṏ  [LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS]
  1007.                 case '\u1E50': // Ṑ  [LATIN CAPITAL LETTER O WITH MACRON AND GRAVE]
  1008.                 case '\u1E52': // Ṓ  [LATIN CAPITAL LETTER O WITH MACRON AND ACUTE]
  1009.                 case '\u1ECC': // Ọ  [LATIN CAPITAL LETTER O WITH DOT BELOW]
  1010.                 case '\u1ECE': // Ỏ  [LATIN CAPITAL LETTER O WITH HOOK ABOVE]
  1011.                 case '\u1ED0': // Ố  [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE]
  1012.                 case '\u1ED2': // Ồ  [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE]
  1013.                 case '\u1ED4': // Ổ  [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE]
  1014.                 case '\u1ED6': // Ỗ  [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE]
  1015.                 case '\u1ED8': // Ộ  [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW]
  1016.                 case '\u1EDA': // Ớ  [LATIN CAPITAL LETTER O WITH HORN AND ACUTE]
  1017.                 case '\u1EDC': // Ờ  [LATIN CAPITAL LETTER O WITH HORN AND GRAVE]
  1018.                 case '\u1EDE': // Ở  [LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE]
  1019.                 case '\u1EE0': // Ỡ  [LATIN CAPITAL LETTER O WITH HORN AND TILDE]
  1020.                 case '\u1EE2': // Ợ  [LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW]
  1021.                 case '\u24C4': // Ⓞ  [CIRCLED LATIN CAPITAL LETTER O]
  1022.                 case '\uA74A': // Ꝋ  [LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY]
  1023.                 case '\uA74C': // Ꝍ  [LATIN CAPITAL LETTER O WITH LOOP]
  1024.                 case '\uFF2F': // O  [FULLWIDTH LATIN CAPITAL LETTER O]
  1025.                 case '\u039F': // Ο  [GREEK CAPITAL LETTER OMICRON]
  1026.                 case '\u038C': // Ό  [GREEK CAPITAL LETTER OMICRON WITH TONOS]
  1027.                 case '\u2C9E': // Ⲟ  [COPTIC CAPITAL LETTER O]
  1028.                 case '\u03A9': // Ω  [GREEK CAPITAL LETTER OMEGA]
  1029.                 case '\u038F': // Ώ  [GREEK CAPITAL LETTER OMEGA WITH TONOS]
  1030.                 case '\uA7B6': // Ꞷ  [LATIN CAPITAL LETTER OMEGA]
  1031.                 case '\u041E': // О  [CYRILLIC CAPITAL LETTER O]
  1032.                 case '\u046A': // Ѫ  [CYRILLIC CAPITAL LETTER BIG YUS]
  1033.                 case '\uA65A': // Ꙛ  [CYRILLIC CAPITAL LETTER BLENDED YUS]
  1034.                 case '\u0460': // Ѡ  [CYRILLIC CAPITAL LETTER OMEGA]
  1035.                 case '\u047C': // Ѽ  [CYRILLIC CAPITAL LETTER OMEGA WITH TITLO]
  1036.                 case '\uA64C': // Ꙍ  [CYRILLIC CAPITAL LETTER BROAD OMEGA]
  1037.                 case '\u047A': // Ѻ  [CYRILLIC CAPITAL LETTER ROUND OMEGA]
  1038.                 case '\u2C11': // Ⱁ  [GLAGOLITIC CAPITAL LETTER ONU]
  1039.                 case '\u2C19': // Ⱉ  [GLAGOLITIC CAPITAL LETTER OTU]
  1040.                 case '\u2C28': // Ⱘ  [GLAGOLITIC CAPITAL LETTER BIG YUS]
  1041.                 case '\u16DF': // ᛟ  [RUNIC LETTER OTHALAN ETHEL O]
  1042.                 case '\u16AE': // ᚮ  [RUNIC LETTER O]
  1043.                 case '\u16A9': // ᚩ  [RUNIC LETTER OS O]
  1044.                 case '\u16B0': // ᚰ  [RUNIC LETTER ON]
  1045.                     return "O";
  1046.                 case '\u00F2': // ò  [LATIN SMALL LETTER O WITH GRAVE]
  1047.                 case '\u00F3': // ó  [LATIN SMALL LETTER O WITH ACUTE]
  1048.                 case '\u00F4': // ô  [LATIN SMALL LETTER O WITH CIRCUMFLEX]
  1049.                 case '\u00F5': // õ  [LATIN SMALL LETTER O WITH TILDE]
  1050.                 case '\u00F6': // ö  [LATIN SMALL LETTER O WITH DIAERESIS]
  1051.                 case '\u00F8': // ø  [LATIN SMALL LETTER O WITH STROKE]
  1052.                 case '\u014D': // ō  [LATIN SMALL LETTER O WITH MACRON]
  1053.                 case '\u014F': // ŏ  [LATIN SMALL LETTER O WITH BREVE]
  1054.                 case '\u0151': // ő  [LATIN SMALL LETTER O WITH DOUBLE ACUTE]
  1055.                 case '\u01A1': // ơ  [LATIN SMALL LETTER O WITH HORN]
  1056.                 case '\u01D2': // ǒ  [LATIN SMALL LETTER O WITH CARON]
  1057.                 case '\u01EB': // ǫ  [LATIN SMALL LETTER O WITH OGONEK]
  1058.                 case '\u01ED': // ǭ  [LATIN SMALL LETTER O WITH OGONEK AND MACRON]
  1059.                 case '\u01FF': // ǿ  [LATIN SMALL LETTER O WITH STROKE AND ACUTE]
  1060.                 case '\u020D': // ȍ  [LATIN SMALL LETTER O WITH DOUBLE GRAVE]
  1061.                 case '\u020F': // ȏ  [LATIN SMALL LETTER O WITH INVERTED BREVE]
  1062.                 case '\u022B': // ȫ  [LATIN SMALL LETTER O WITH DIAERESIS AND MACRON]
  1063.                 case '\u022D': // ȭ  [LATIN SMALL LETTER O WITH TILDE AND MACRON]
  1064.                 case '\u022F': // ȯ  [LATIN SMALL LETTER O WITH DOT ABOVE]
  1065.                 case '\u0231': // ȱ  [LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON]
  1066.                 case '\u0254': // ɔ  [LATIN SMALL LETTER OPEN O]
  1067.                 case '\u0275': // ɵ  [LATIN SMALL LETTER BARRED O]
  1068.                 case '\u1D16': // ᴖ  [LATIN SMALL LETTER TOP HALF O]
  1069.                 case '\u1D17': // ᴗ  [LATIN SMALL LETTER BOTTOM HALF O]
  1070.                 case '\u1D97': // ᶗ  [LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK]
  1071.                 case '\u1E4D': // ṍ  [LATIN SMALL LETTER O WITH TILDE AND ACUTE]
  1072.                 case '\u1E4F': // ṏ  [LATIN SMALL LETTER O WITH TILDE AND DIAERESIS]
  1073.                 case '\u1E51': // ṑ  [LATIN SMALL LETTER O WITH MACRON AND GRAVE]
  1074.                 case '\u1E53': // ṓ  [LATIN SMALL LETTER O WITH MACRON AND ACUTE]
  1075.                 case '\u1ECD': // ọ  [LATIN SMALL LETTER O WITH DOT BELOW]
  1076.                 case '\u1ECF': // ỏ  [LATIN SMALL LETTER O WITH HOOK ABOVE]
  1077.                 case '\u1ED1': // ố  [LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE]
  1078.                 case '\u1ED3': // ồ  [LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE]
  1079.                 case '\u1ED5': // ổ  [LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE]
  1080.                 case '\u1ED7': // ỗ  [LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE]
  1081.                 case '\u1ED9': // ộ  [LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW]
  1082.                 case '\u1EDB': // ớ  [LATIN SMALL LETTER O WITH HORN AND ACUTE]
  1083.                 case '\u1EDD': // ờ  [LATIN SMALL LETTER O WITH HORN AND GRAVE]
  1084.                 case '\u1EDF': // ở  [LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE]
  1085.                 case '\u1EE1': // ỡ  [LATIN SMALL LETTER O WITH HORN AND TILDE]
  1086.                 case '\u1EE3': // ợ  [LATIN SMALL LETTER O WITH HORN AND DOT BELOW]
  1087.                 case '\u2092': // ₒ  [LATIN SUBSCRIPT SMALL LETTER O]
  1088.                 case '\u24DE': // ⓞ  [CIRCLED LATIN SMALL LETTER O]
  1089.                 case '\u2C7A': // ⱺ  [LATIN SMALL LETTER O WITH LOW RING INSIDE]
  1090.                 case '\uA74B': // ꝋ  [LATIN SMALL LETTER O WITH LONG STROKE OVERLAY]
  1091.                 case '\uA74D': // ꝍ  [LATIN SMALL LETTER O WITH LOOP]
  1092.                 case '\uFF4F': // o  [FULLWIDTH LATIN SMALL LETTER O]
  1093.                 case '\u00BA': // º  [MASCULINE ORDINAL INDICATOR]
  1094.                 case '\u03BF': // ο  [GREEK SMALL LETTER OMICRON]
  1095.                 case '\u03CC': // ό  [GREEK SMALL LETTER OMICRON WITH TONOS]
  1096.                 case '\u2C9F': // ⲟ  [COPTIC SMALL LETTER O]
  1097.                 case '\u03C9': // ω  [GREEK SMALL LETTER OMEGA]
  1098.                 case '\u03CE': // ώ  [GREEK SMALL LETTER OMEGA WITH TONOS]
  1099.                 case '\uA7B7': // ꞷ  [LATIN SMALL LETTER OMEGA]
  1100.                 case '\u0277': // ɷ  [LATIN SMALL LETTER CLOSED OMEGA]
  1101.                 case '\u043E': // о  [CYRILLIC SMALL LETTER O]
  1102.                 case '\u046B': // ѫ  [CYRILLIC SMALL LETTER BIG YUS]
  1103.                 case '\uA65B': // ꙛ  [CYRILLIC SMALL LETTER BLENDED YUS]
  1104.                 case '\u0461': // ѡ  [CYRILLIC SMALL LETTER OMEGA]
  1105.                 case '\u047D': // ѽ  [CYRILLIC SMALL LETTER OMEGA WITH TITLO]
  1106.                 case '\uA64D': // ꙍ  [CYRILLIC SMALL LETTER BROAD OMEGA]
  1107.                 case '\u047B': // ѻ  [CYRILLIC SMALL LETTER ROUND OMEGA]
  1108.                 case '\u2C41': // ⱁ  [GLAGOLITIC SMALL LETTER ONU]
  1109.                 case '\u2C49': // ⱉ  [GLAGOLITIC SMALL LETTER OTU]
  1110.                 case '\u2C58': // ⱘ  [GLAGOLITIC SMALL LETTER BIG YUS]
  1111.                     return "o";
  1112.                 case '\u0152': // Œ  [LATIN CAPITAL LIGATURE OE]
  1113.                 case '\u0276': // ɶ  [LATIN LETTER SMALL CAPITAL OE]
  1114.                 case '\u16AF': // ᚯ  [RUNIC LETTER OE]
  1115.                     return "OE";
  1116.                 case '\uA74E': // Ꝏ  [LATIN CAPITAL LETTER OO]
  1117.                 case '\u16F3': // ᛳ  [RUNIC LETTER OO]
  1118.                     return "OO";
  1119.                 case '\u16F4': // ᛴ  [RUNIC LETTER FRANKS CASKET OS]
  1120.                     return "OS";
  1121.                 case '\u0222': // Ȣ  [LATIN CAPITAL LETTER OU]
  1122.                 case '\u1D15': // ᴕ  [LATIN LETTER SMALL CAPITAL OU]
  1123.                     return "OU";
  1124.                 case '\u24AA': // ⒪  [PARENTHESIZED LATIN SMALL LETTER O]
  1125.                     return "(o)";
  1126.                 case '\u0153': // œ  [LATIN SMALL LIGATURE OE]
  1127.                 case '\u1D14': // ᴔ  [LATIN SMALL LETTER TURNED OE]
  1128.                     return "oe";
  1129.                 case '\uA74F': // ꝏ  [LATIN SMALL LETTER OO]
  1130.                     return "oo";
  1131.                 case '\u0223': // ȣ  [LATIN SMALL LETTER OU]
  1132.                     return "ou";
  1133.                 case '\u01A4': // Ƥ  [LATIN CAPITAL LETTER P WITH HOOK]
  1134.                 case '\u1D18': // ᴘ  [LATIN LETTER SMALL CAPITAL P]
  1135.                 case '\u1E54': // Ṕ  [LATIN CAPITAL LETTER P WITH ACUTE]
  1136.                 case '\u1E56': // Ṗ  [LATIN CAPITAL LETTER P WITH DOT ABOVE]
  1137.                 case '\u24C5': // Ⓟ  [CIRCLED LATIN CAPITAL LETTER P]
  1138.                 case '\u2C63': // Ᵽ  [LATIN CAPITAL LETTER P WITH STROKE]
  1139.                 case '\uA750': // Ꝑ  [LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER]
  1140.                 case '\uA752': // Ꝓ  [LATIN CAPITAL LETTER P WITH FLOURISH]
  1141.                 case '\uA754': // Ꝕ  [LATIN CAPITAL LETTER P WITH SQUIRREL TAIL]
  1142.                 case '\uFF30': // P  [FULLWIDTH LATIN CAPITAL LETTER P]
  1143.                 case '\u03A0': // Π  [GREEK CAPITAL LETTER PI]
  1144.                 case '\u2CA0': // Ⲡ  [COPTIC CAPITAL LETTER PI]
  1145.                 case '\u041F': // П  [CYRILLIC CAPITAL LETTER PE]
  1146.                 case '\u2C12': // Ⱂ  [GLAGOLITIC CAPITAL LETTER POKOJI]
  1147.                 case '\u2C1A': // Ⱊ  [GLAGOLITIC CAPITAL LETTER PE]
  1148.                 case '\u16C8': // ᛈ  [RUNIC LETTER PERTHO PEORTH P]
  1149.                 case '\u16D4': // ᛔ  [RUNIC LETTER DOTTED-P]
  1150.                 case '\u16D5': // ᛕ  [RUNIC LETTER OPEN-P]
  1151.                     return "P";
  1152.                 case '\u01A5': // ƥ  [LATIN SMALL LETTER P WITH HOOK]
  1153.                 case '\u1D71': // ᵱ  [LATIN SMALL LETTER P WITH MIDDLE TILDE]
  1154.                 case '\u1D7D': // ᵽ  [LATIN SMALL LETTER P WITH STROKE]
  1155.                 case '\u1D88': // ᶈ  [LATIN SMALL LETTER P WITH PALATAL HOOK]
  1156.                 case '\u1E55': // ṕ  [LATIN SMALL LETTER P WITH ACUTE]
  1157.                 case '\u1E57': // ṗ  [LATIN SMALL LETTER P WITH DOT ABOVE]
  1158.                 case '\u24DF': // ⓟ  [CIRCLED LATIN SMALL LETTER P]
  1159.                 case '\uA751': // ꝑ  [LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER]
  1160.                 case '\uA753': // ꝓ  [LATIN SMALL LETTER P WITH FLOURISH]
  1161.                 case '\uA755': // ꝕ  [LATIN SMALL LETTER P WITH SQUIRREL TAIL]
  1162.                 case '\uA7FC': // ꟼ  [LATIN EPIGRAPHIC LETTER REVERSED P]
  1163.                 case '\uFF50': // p  [FULLWIDTH LATIN SMALL LETTER P]
  1164.                 case '\u03C0': // π  [GREEK SMALL LETTER PI]
  1165.                 case '\u03D6': // ϖ  [GREEK PI SYMBOL]
  1166.                 case '\u2CA1': // ⲡ  [COPTIC SMALL LETTER PI]
  1167.                 case '\u043F': // п  [CYRILLIC SMALL LETTER PE]
  1168.                 case '\u2C42': // ⱂ  [GLAGOLITIC SMALL LETTER POKOJI]
  1169.                 case '\u2C4A': // ⱊ  [GLAGOLITIC SMALL LETTER PE]
  1170.                     return "p";
  1171.                 case '\u24AB': // ⒫  [PARENTHESIZED LATIN SMALL LETTER P]
  1172.                     return "(p)";
  1173.                 case '\u024A': // Ɋ  [LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL]
  1174.                 case '\u24C6': // Ⓠ  [CIRCLED LATIN CAPITAL LETTER Q]
  1175.                 case '\uA756': // Ꝗ  [LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER]
  1176.                 case '\uA758': // Ꝙ  [LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE]
  1177.                 case '\uFF31': // Q  [FULLWIDTH LATIN CAPITAL LETTER Q]
  1178.                 case '\u03D8': // Ϙ  [GREEK LETTER ARCHAIC KOPPA]
  1179.                 case '\u03DE': // Ϟ  [GREEK LETTER KOPPA]
  1180.                 case '\u16E9': // ᛩ  [RUNIC LETTER Q]
  1181.                     return "Q";
  1182.                 case '\u0138': // ĸ  [LATIN SMALL LETTER KRA]
  1183.                 case '\u024B': // ɋ  [LATIN SMALL LETTER Q WITH HOOK TAIL]
  1184.                 case '\u02A0': // ʠ  [LATIN SMALL LETTER Q WITH HOOK]
  1185.                 case '\u24E0': // ⓠ  [CIRCLED LATIN SMALL LETTER Q]
  1186.                 case '\uA757': // ꝗ  [LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER]
  1187.                 case '\uA759': // ꝙ  [LATIN SMALL LETTER Q WITH DIAGONAL STROKE]
  1188.                 case '\uFF51': // q  [FULLWIDTH LATIN SMALL LETTER Q]
  1189.                 case '\u03D9': // ϙ  [GREEK SMALL LETTER ARCHAIC KOPPA]
  1190.                 case '\u03DF': // ϟ  [GREEK SMALL LETTER KOPPA]
  1191.                     return "q";
  1192.                 case '\u24AC': // ⒬  [PARENTHESIZED LATIN SMALL LETTER Q]
  1193.                     return "(q)";
  1194.                 case '\u0239': // ȹ  [LATIN SMALL LETTER QP DIGRAPH]
  1195.                     return "qp";
  1196.                 case '\u0154': // Ŕ  [LATIN CAPITAL LETTER R WITH ACUTE]
  1197.                 case '\u0156': // Ŗ  [LATIN CAPITAL LETTER R WITH CEDILLA]
  1198.                 case '\u0158': // Ř  [LATIN CAPITAL LETTER R WITH CARON]
  1199.                 case '\u0210': // Ȑ  [LATIN CAPITAL LETTER R WITH DOUBLE GRAVE]
  1200.                 case '\u0212': // Ȓ  [LATIN CAPITAL LETTER R WITH INVERTED BREVE]
  1201.                 case '\u024C': // Ɍ  [LATIN CAPITAL LETTER R WITH STROKE]
  1202.                 case '\u0280': // ʀ  [LATIN LETTER SMALL CAPITAL R]
  1203.                 case '\u0281': // ʁ  [LATIN LETTER SMALL CAPITAL INVERTED R]
  1204.                 case '\u1D19': // ᴙ  [LATIN LETTER SMALL CAPITAL REVERSED R]
  1205.                 case '\u1D1A': // ᴚ  [LATIN LETTER SMALL CAPITAL TURNED R]
  1206.                 case '\u1E58': // Ṙ  [LATIN CAPITAL LETTER R WITH DOT ABOVE]
  1207.                 case '\u1E5A': // Ṛ  [LATIN CAPITAL LETTER R WITH DOT BELOW]
  1208.                 case '\u1E5C': // Ṝ  [LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON]
  1209.                 case '\u1E5E': // Ṟ  [LATIN CAPITAL LETTER R WITH LINE BELOW]
  1210.                 case '\u24C7': // Ⓡ  [CIRCLED LATIN CAPITAL LETTER R]
  1211.                 case '\u2C64': // Ɽ  [LATIN CAPITAL LETTER R WITH TAIL]
  1212.                 case '\uA75A': // Ꝛ  [LATIN CAPITAL LETTER R ROTUNDA]
  1213.                 case '\uA782': // Ꞃ  [LATIN CAPITAL LETTER INSULAR R]
  1214.                 case '\uFF32': // R  [FULLWIDTH LATIN CAPITAL LETTER R]
  1215.                 case '\u03A1': // Ρ  [GREEK CAPITAL LETTER RHO]
  1216.                 case '\u1FEC': // Ῥ  [GREEK CAPITAL LETTER RHO WITH DASIA]
  1217.                 case '\u1D29': // ᴩ  [GREEK LETTER SMALL CAPITAL RHO]
  1218.                 case '\u2CA2': // Ⲣ  [COPTIC CAPITAL LETTER RO]
  1219.                 case '\u0420': // Р  [CYRILLIC CAPITAL LETTER ER]
  1220.                 case '\u2C13': // Ⱃ  [GLAGOLITIC CAPITAL LETTER RITSI]
  1221.                 case '\u16B1': // ᚱ  [RUNIC LETTER RAIDO RAD REID R]
  1222.                 case '\u16E6': // ᛦ  [RUNIC LETTER LONG-BRANCH-YR]
  1223.                 case '\u16E7': // ᛧ  [RUNIC LETTER SHORT-TWIG-YR]
  1224.                 case '\u16E8': // ᛨ  [RUNIC LETTER ICELANDIC-YR]
  1225.                     return "R";
  1226.                 case '\u0155': // ŕ  [LATIN SMALL LETTER R WITH ACUTE]
  1227.                 case '\u0157': // ŗ  [LATIN SMALL LETTER R WITH CEDILLA]
  1228.                 case '\u0159': // ř  [LATIN SMALL LETTER R WITH CARON]
  1229.                 case '\u0211': // ȑ  [LATIN SMALL LETTER R WITH DOUBLE GRAVE]
  1230.                 case '\u0213': // ȓ  [LATIN SMALL LETTER R WITH INVERTED BREVE]
  1231.                 case '\u024D': // ɍ  [LATIN SMALL LETTER R WITH STROKE]
  1232.                 case '\u027C': // ɼ  [LATIN SMALL LETTER R WITH LONG LEG]
  1233.                 case '\u027D': // ɽ  [LATIN SMALL LETTER R WITH TAIL]
  1234.                 case '\u027E': // ɾ  [LATIN SMALL LETTER R WITH FISHHOOK]
  1235.                 case '\u027F': // ɿ  [LATIN SMALL LETTER REVERSED R WITH FISHHOOK]
  1236.                 case '\u1D63': // ᵣ  [LATIN SUBSCRIPT SMALL LETTER R]
  1237.                 case '\u1D72': // ᵲ  [LATIN SMALL LETTER R WITH MIDDLE TILDE]
  1238.                 case '\u1D73': // ᵳ  [LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE]
  1239.                 case '\u1D89': // ᶉ  [LATIN SMALL LETTER R WITH PALATAL HOOK]
  1240.                 case '\u1E59': // ṙ  [LATIN SMALL LETTER R WITH DOT ABOVE]
  1241.                 case '\u1E5B': // ṛ  [LATIN SMALL LETTER R WITH DOT BELOW]
  1242.                 case '\u1E5D': // ṝ  [LATIN SMALL LETTER R WITH DOT BELOW AND MACRON]
  1243.                 case '\u1E5F': // ṟ  [LATIN SMALL LETTER R WITH LINE BELOW]
  1244.                 case '\u24E1': // ⓡ  [CIRCLED LATIN SMALL LETTER R]
  1245.                 case '\uA75B': // ꝛ  [LATIN SMALL LETTER R ROTUNDA]
  1246.                 case '\uA783': // ꞃ  [LATIN SMALL LETTER INSULAR R]
  1247.                 case '\uFF52': // r  [FULLWIDTH LATIN SMALL LETTER R]
  1248.                 case '\u03C1': // ρ  [GREEK SMALL LETTER RHO]
  1249.                 case '\u1FE4': // ῤ  [GREEK SMALL LETTER RHO WITH PSILI]
  1250.                 case '\u1FE5': // ῥ  [GREEK SMALL LETTER RHO WITH DASIA]
  1251.                 case '\u03F1': // ϱ  [GREEK RHO SYMBOL]
  1252.                 case '\u03FC': // ϼ  [GREEK RHO WITH STROKE SYMBOL]
  1253.                 case '\u1D68': // ᵨ  [GREEK SUBSCRIPT SMALL LETTER RHO]
  1254.                 case '\u2CA3': // ⲣ  [COPTIC SMALL LETTER RO]
  1255.                 case '\u0440': // р  [CYRILLIC SMALL LETTER ER]
  1256.                 case '\u2C43': // ⱃ  [GLAGOLITIC SMALL LETTER RITSI]
  1257.                     return "r";
  1258.                 case '\u24AD': // ⒭  [PARENTHESIZED LATIN SMALL LETTER R]
  1259.                     return "(r)";
  1260.                 case '\u015A': // Ś  [LATIN CAPITAL LETTER S WITH ACUTE]
  1261.                 case '\u015C': // Ŝ  [LATIN CAPITAL LETTER S WITH CIRCUMFLEX]
  1262.                 case '\u015E': // Ş  [LATIN CAPITAL LETTER S WITH CEDILLA]
  1263.                 case '\u0160': // Š  [LATIN CAPITAL LETTER S WITH CARON]
  1264.                 case '\u0218': // Ș  [LATIN CAPITAL LETTER S WITH COMMA BELOW]
  1265.                 case '\u1E60': // Ṡ  [LATIN CAPITAL LETTER S WITH DOT ABOVE]
  1266.                 case '\u1E62': // Ṣ  [LATIN CAPITAL LETTER S WITH DOT BELOW]
  1267.                 case '\u1E64': // Ṥ  [LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE]
  1268.                 case '\u1E66': // Ṧ  [LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE]
  1269.                 case '\u1E68': // Ṩ  [LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE]
  1270.                 case '\u24C8': // Ⓢ  [CIRCLED LATIN CAPITAL LETTER S]
  1271.                 case '\uA731': // ꜱ  [LATIN LETTER SMALL CAPITAL S]
  1272.                 case '\uA785': // ꞅ  [LATIN SMALL LETTER INSULAR S]
  1273.                 case '\uFF33': // S  [FULLWIDTH LATIN CAPITAL LETTER S]
  1274.                 case '\u03A3': // Σ  [GREEK CAPITAL LETTER SIGMA]
  1275.                 case '\u03F9': // Ϲ  [GREEK CAPITAL LUNATE SIGMA SYMBOL]
  1276.                 case '\u0421': // С  [CYRILLIC CAPITAL LETTER ES]
  1277.                 case '\u2C14': // Ⱄ  [GLAGOLITIC CAPITAL LETTER SLOVO]
  1278.                 case '\u16CA': // ᛊ  [RUNIC LETTER SOWILO S]
  1279.                 case '\u16CB': // ᛋ  [RUNIC LETTER SIGEL LONG-BRANCH-SOL S]
  1280.                 case '\u16CC': // ᛌ  [RUNIC LETTER SHORT-TWIG-SOL S]
  1281.                     return "S";
  1282.                 case '\u015B': // ś  [LATIN SMALL LETTER S WITH ACUTE]
  1283.                 case '\u015D': // ŝ  [LATIN SMALL LETTER S WITH CIRCUMFLEX]
  1284.                 case '\u015F': // ş  [LATIN SMALL LETTER S WITH CEDILLA]
  1285.                 case '\u0161': // š  [LATIN SMALL LETTER S WITH CARON]
  1286.                 case '\u017F': // ſ  [LATIN SMALL LETTER LONG S]
  1287.                 case '\u0219': // ș  [LATIN SMALL LETTER S WITH COMMA BELOW]
  1288.                 case '\u023F': // ȿ  [LATIN SMALL LETTER S WITH SWASH TAIL]
  1289.                 case '\u0282': // ʂ  [LATIN SMALL LETTER S WITH HOOK]
  1290.                 case '\u1D74': // ᵴ  [LATIN SMALL LETTER S WITH MIDDLE TILDE]
  1291.                 case '\u1D8A': // ᶊ  [LATIN SMALL LETTER S WITH PALATAL HOOK]
  1292.                 case '\u1E61': // ṡ  [LATIN SMALL LETTER S WITH DOT ABOVE]
  1293.                 case '\u1E63': // ṣ  [LATIN SMALL LETTER S WITH DOT BELOW]
  1294.                 case '\u1E65': // ṥ  [LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE]
  1295.                 case '\u1E67': // ṧ  [LATIN SMALL LETTER S WITH CARON AND DOT ABOVE]
  1296.                 case '\u1E69': // ṩ  [LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE]
  1297.                 case '\u1E9C': // ẜ  [LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE]
  1298.                 case '\u1E9D': // ẝ  [LATIN SMALL LETTER LONG S WITH HIGH STROKE]
  1299.                 case '\u24E2': // ⓢ  [CIRCLED LATIN SMALL LETTER S]
  1300.                 case '\uA784': // Ꞅ  [LATIN CAPITAL LETTER INSULAR S]
  1301.                 case '\uFF53': // s  [FULLWIDTH LATIN SMALL LETTER S]
  1302.                 case '\u03C3': // σ  [GREEK SMALL LETTER SIGMA]
  1303.                 case '\u03C2': // ς  [GREEK SMALL LETTER FINAL SIGMA]
  1304.                 case '\u03F2': // ϲ  [GREEK LUNATE SIGMA SYMBOL]
  1305.                 case '\u0441': // с  [CYRILLIC SMALL LETTER ES]
  1306.                 case '\u2C44': // ⱄ  [GLAGOLITIC SMALL LETTER SLOVO]
  1307.                     return "s";
  1308.                 case '\u1E9E': // ẞ  [LATIN CAPITAL LETTER SHARP S]
  1309.                     return "SS";
  1310.                 case '\u16E5': // ᛥ  [RUNIC LETTER STAN]
  1311.                     return "ST";
  1312.                 case '\u24AE': // ⒮  [PARENTHESIZED LATIN SMALL LETTER S]
  1313.                     return "(s)";
  1314.                 case '\u00DF': // ß  [LATIN SMALL LETTER SHARP S]
  1315.                     return "ss";
  1316.                 case '\uFB06': // st  [LATIN SMALL LIGATURE ST]
  1317.                     return "st";
  1318.                 case '\u0162': // Ţ  [LATIN CAPITAL LETTER T WITH CEDILLA]
  1319.                 case '\u0164': // Ť  [LATIN CAPITAL LETTER T WITH CARON]
  1320.                 case '\u0166': // Ŧ  [LATIN CAPITAL LETTER T WITH STROKE]
  1321.                 case '\u01AC': // Ƭ  [LATIN CAPITAL LETTER T WITH HOOK]
  1322.                 case '\u01AE': // Ʈ  [LATIN CAPITAL LETTER T WITH RETROFLEX HOOK]
  1323.                 case '\u021A': // Ț  [LATIN CAPITAL LETTER T WITH COMMA BELOW]
  1324.                 case '\u023E': // Ⱦ  [LATIN CAPITAL LETTER T WITH DIAGONAL STROKE]
  1325.                 case '\u1D1B': // ᴛ  [LATIN LETTER SMALL CAPITAL T]
  1326.                 case '\u1E6A': // Ṫ  [LATIN CAPITAL LETTER T WITH DOT ABOVE]
  1327.                 case '\u1E6C': // Ṭ  [LATIN CAPITAL LETTER T WITH DOT BELOW]
  1328.                 case '\u1E6E': // Ṯ  [LATIN CAPITAL LETTER T WITH LINE BELOW]
  1329.                 case '\u1E70': // Ṱ  [LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW]
  1330.                 case '\u24C9': // Ⓣ  [CIRCLED LATIN CAPITAL LETTER T]
  1331.                 case '\uA786': // Ꞇ  [LATIN CAPITAL LETTER INSULAR T]
  1332.                 case '\uFF34': // T  [FULLWIDTH LATIN CAPITAL LETTER T]
  1333.                 case '\u03A4': // Τ  [GREEK CAPITAL LETTER TAU]
  1334.                 case '\u2CA6': // Ⲧ  [COPTIC CAPITAL LETTER TAU]
  1335.                 case '\u0422': // Т  [CYRILLIC CAPITAL LETTER TE]
  1336.                 case '\u2C15': // Ⱅ  [GLAGOLITIC CAPITAL LETTER TVRIDO]
  1337.                 case '\u16CF': // ᛏ  [RUNIC LETTER TIWAZ TIR TYR T]
  1338.                 case '\u16D0': // ᛐ  [RUNIC LETTER SHORT-TWIG-TYR T]
  1339.                     return "T";
  1340.                 case '\u0163': // ţ  [LATIN SMALL LETTER T WITH CEDILLA]
  1341.                 case '\u0165': // ť  [LATIN SMALL LETTER T WITH CARON]
  1342.                 case '\u0167': // ŧ  [LATIN SMALL LETTER T WITH STROKE]
  1343.                 case '\u01AB': // ƫ  [LATIN SMALL LETTER T WITH PALATAL HOOK]
  1344.                 case '\u01AD': // ƭ  [LATIN SMALL LETTER T WITH HOOK]
  1345.                 case '\u021B': // ț  [LATIN SMALL LETTER T WITH COMMA BELOW]
  1346.                 case '\u0236': // ȶ  [LATIN SMALL LETTER T WITH CURL]
  1347.                 case '\u0287': // ʇ  [LATIN SMALL LETTER TURNED T]
  1348.                 case '\u0288': // ʈ  [LATIN SMALL LETTER T WITH RETROFLEX HOOK]
  1349.                 case '\u1D75': // ᵵ  [LATIN SMALL LETTER T WITH MIDDLE TILDE]
  1350.                 case '\u1E6B': // ṫ  [LATIN SMALL LETTER T WITH DOT ABOVE]
  1351.                 case '\u1E6D': // ṭ  [LATIN SMALL LETTER T WITH DOT BELOW]
  1352.                 case '\u1E6F': // ṯ  [LATIN SMALL LETTER T WITH LINE BELOW]
  1353.                 case '\u1E71': // ṱ  [LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW]
  1354.                 case '\u1E97': // ẗ  [LATIN SMALL LETTER T WITH DIAERESIS]
  1355.                 case '\u24E3': // ⓣ  [CIRCLED LATIN SMALL LETTER T]
  1356.                 case '\u2C66': // ⱦ  [LATIN SMALL LETTER T WITH DIAGONAL STROKE]
  1357.                 case '\uFF54': // t  [FULLWIDTH LATIN SMALL LETTER T]
  1358.                 case '\u03C4': // τ  [GREEK SMALL LETTER TAU]
  1359.                 case '\u2CA7': // ⲧ  [COPTIC SMALL LETTER TAU]
  1360.                 case '\u0442': // т  [CYRILLIC SMALL LETTER TE]
  1361.                 case '\u1C84': // ᲄ  [CYRILLIC SMALL LETTER TALL TE]
  1362.                 case '\u1C85': // ᲅ  [CYRILLIC SMALL LETTER THREE-LEGGED TE]
  1363.                 case '\u2C45': // ⱅ  [GLAGOLITIC SMALL LETTER TVRIDO]
  1364.                     return "t";
  1365.                 case '\u00DE': // Þ  [LATIN CAPITAL LETTER THORN]
  1366.                 case '\uA766': // Ꝧ  [LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER]
  1367.                 case '\u0398': // Θ  [GREEK CAPITAL LETTER THETA]
  1368.                 case '\u03F4': // ϴ  [GREEK CAPITAL THETA SYMBOL]
  1369.                 case '\u2C90': // Ⲑ  [COPTIC CAPITAL LETTER THETHE]
  1370.                 case '\u0472': // Ѳ  [CYRILLIC CAPITAL LETTER FITA]
  1371.                 case '\u2C2A': // Ⱚ  [GLAGOLITIC CAPITAL LETTER FITA]
  1372.                 case '\u16A6': // ᚦ  [RUNIC LETTER THURISAZ THURS THORN]
  1373.                 case '\u16A7': // ᚧ  [RUNIC LETTER ETH]
  1374.                     return "TH";
  1375.                 case '\uA728': // Ꜩ  [LATIN CAPITAL LETTER TZ]
  1376.                     return "TZ";
  1377.                 case '\u24AF': // ⒯  [PARENTHESIZED LATIN SMALL LETTER T]
  1378.                     return "(t)";
  1379.                 case '\u02A8': // ʨ  [LATIN SMALL LETTER TC DIGRAPH WITH CURL]
  1380.                     return "tc";
  1381.                 case '\u00FE': // þ  [LATIN SMALL LETTER THORN]
  1382.                 case '\u1D7A': // ᵺ  [LATIN SMALL LETTER TH WITH STRIKETHROUGH]
  1383.                 case '\uA767': // ꝧ  [LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER]
  1384.                 case '\u03B8': // θ  [GREEK SMALL LETTER THETA]
  1385.                 case '\u03D1': // ϑ  [GREEK THETA SYMBOL]
  1386.                 case '\u1DBF': // ᶿ  [MODIFIER LETTER SMALL THETA]
  1387.                 case '\u2C91': // ⲑ  [COPTIC SMALL LETTER THETHE]
  1388.                 case '\u0473': // ѳ  [CYRILLIC SMALL LETTER FITA]
  1389.                 case '\u2C5A': // ⱚ  [GLAGOLITIC SMALL LETTER FITA]
  1390.                     return "th";
  1391.                 case '\u02A6': // ʦ  [LATIN SMALL LETTER TS DIGRAPH]
  1392.                 case '\u0446': // ц  [CYRILLIC SMALL LETTER TSE]
  1393.                 case '\u045B': // ћ  [CYRILLIC SMALL LETTER TSHE]
  1394.                 case '\u2C4C': // ⱌ  [GLAGOLITIC SMALL LETTER TSI]
  1395.                     return "ts";
  1396.                 case '\uA729': // ꜩ  [LATIN SMALL LETTER TZ]
  1397.                     return "tz";
  1398.                 case '\u00D9': // Ù  [LATIN CAPITAL LETTER U WITH GRAVE]
  1399.                 case '\u00DA': // Ú  [LATIN CAPITAL LETTER U WITH ACUTE]
  1400.                 case '\u00DB': // Û  [LATIN CAPITAL LETTER U WITH CIRCUMFLEX]
  1401.                 case '\u00DC': // Ü  [LATIN CAPITAL LETTER U WITH DIAERESIS]
  1402.                 case '\u0168': // Ũ  [LATIN CAPITAL LETTER U WITH TILDE]
  1403.                 case '\u016A': // Ū  [LATIN CAPITAL LETTER U WITH MACRON]
  1404.                 case '\u016C': // Ŭ  [LATIN CAPITAL LETTER U WITH BREVE]
  1405.                 case '\u016E': // Ů  [LATIN CAPITAL LETTER U WITH RING ABOVE]
  1406.                 case '\u0170': // Ű  [LATIN CAPITAL LETTER U WITH DOUBLE ACUTE]
  1407.                 case '\u0172': // Ų  [LATIN CAPITAL LETTER U WITH OGONEK]
  1408.                 case '\u01AF': // Ư  [LATIN CAPITAL LETTER U WITH HORN]
  1409.                 case '\u01D3': // Ǔ  [LATIN CAPITAL LETTER U WITH CARON]
  1410.                 case '\u01D5': // Ǖ  [LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON]
  1411.                 case '\u01D7': // Ǘ  [LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE]
  1412.                 case '\u01D9': // Ǚ  [LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON]
  1413.                 case '\u01DB': // Ǜ  [LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE]
  1414.                 case '\u0214': // Ȕ  [LATIN CAPITAL LETTER U WITH DOUBLE GRAVE]
  1415.                 case '\u0216': // Ȗ  [LATIN CAPITAL LETTER U WITH INVERTED BREVE]
  1416.                 case '\u0244': // Ʉ  [LATIN CAPITAL LETTER U BAR]
  1417.                 case '\u1D1C': // ᴜ  [LATIN LETTER SMALL CAPITAL U]
  1418.                 case '\u1D7E': // ᵾ  [LATIN SMALL CAPITAL LETTER U WITH STROKE]
  1419.                 case '\u1E72': // Ṳ  [LATIN CAPITAL LETTER U WITH DIAERESIS BELOW]
  1420.                 case '\u1E74': // Ṵ  [LATIN CAPITAL LETTER U WITH TILDE BELOW]
  1421.                 case '\u1E76': // Ṷ  [LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW]
  1422.                 case '\u1E78': // Ṹ  [LATIN CAPITAL LETTER U WITH TILDE AND ACUTE]
  1423.                 case '\u1E7A': // Ṻ  [LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS]
  1424.                 case '\u1EE4': // Ụ  [LATIN CAPITAL LETTER U WITH DOT BELOW]
  1425.                 case '\u1EE6': // Ủ  [LATIN CAPITAL LETTER U WITH HOOK ABOVE]
  1426.                 case '\u1EE8': // Ứ  [LATIN CAPITAL LETTER U WITH HORN AND ACUTE]
  1427.                 case '\u1EEA': // Ừ  [LATIN CAPITAL LETTER U WITH HORN AND GRAVE]
  1428.                 case '\u1EEC': // Ử  [LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE]
  1429.                 case '\u1EEE': // Ữ  [LATIN CAPITAL LETTER U WITH HORN AND TILDE]
  1430.                 case '\u1EF0': // Ự  [LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW]
  1431.                 case '\u24CA': // Ⓤ  [CIRCLED LATIN CAPITAL LETTER U]
  1432.                 case '\uFF35': // U  [FULLWIDTH LATIN CAPITAL LETTER U]
  1433.                 case '\u01B1': // Ʊ  [LATIN CAPITAL LETTER UPSILON]
  1434.                 case '\u0423': // У  [CYRILLIC CAPITAL LETTER U]
  1435.                 case '\u040E': // Ў  [CYRILLIC CAPITAL LETTER SHORT U]
  1436.                 case '\u2CA8': // Ⲩ  [COPTIC CAPITAL LETTER UA]
  1437.                 case '\u0478': // Ѹ  [CYRILLIC CAPITAL LETTER UK]
  1438.                 case '\uA64A': // Ꙋ  [CYRILLIC CAPITAL LETTER MONOGRAPH UK]
  1439.                 case '\u2C16': // Ⱆ  [GLAGOLITIC CAPITAL LETTER UKU]
  1440.                 case '\u16A2': // ᚢ  [RUNIC LETTER URUZ UR U]
  1441.                     return "U";
  1442.                 case '\u00F9': // ù  [LATIN SMALL LETTER U WITH GRAVE]
  1443.                 case '\u00FA': // ú  [LATIN SMALL LETTER U WITH ACUTE]
  1444.                 case '\u00FB': // û  [LATIN SMALL LETTER U WITH CIRCUMFLEX]
  1445.                 case '\u00FC': // ü  [LATIN SMALL LETTER U WITH DIAERESIS]
  1446.                 case '\u0169': // ũ  [LATIN SMALL LETTER U WITH TILDE]
  1447.                 case '\u016B': // ū  [LATIN SMALL LETTER U WITH MACRON]
  1448.                 case '\u016D': // ŭ  [LATIN SMALL LETTER U WITH BREVE]
  1449.                 case '\u016F': // ů  [LATIN SMALL LETTER U WITH RING ABOVE]
  1450.                 case '\u0171': // ű  [LATIN SMALL LETTER U WITH DOUBLE ACUTE]
  1451.                 case '\u0173': // ų  [LATIN SMALL LETTER U WITH OGONEK]
  1452.                 case '\u01B0': // ư  [LATIN SMALL LETTER U WITH HORN]
  1453.                 case '\u01D4': // ǔ  [LATIN SMALL LETTER U WITH CARON]
  1454.                 case '\u01D6': // ǖ  [LATIN SMALL LETTER U WITH DIAERESIS AND MACRON]
  1455.                 case '\u01D8': // ǘ  [LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE]
  1456.                 case '\u01DA': // ǚ  [LATIN SMALL LETTER U WITH DIAERESIS AND CARON]
  1457.                 case '\u01DC': // ǜ  [LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE]
  1458.                 case '\u0215': // ȕ  [LATIN SMALL LETTER U WITH DOUBLE GRAVE]
  1459.                 case '\u0217': // ȗ  [LATIN SMALL LETTER U WITH INVERTED BREVE]
  1460.                 case '\u0289': // ʉ  [LATIN SMALL LETTER U BAR]
  1461.                 case '\u1D64': // ᵤ  [LATIN SUBSCRIPT SMALL LETTER U]
  1462.                 case '\u1D99': // ᶙ  [LATIN SMALL LETTER U WITH RETROFLEX HOOK]
  1463.                 case '\u1E73': // ṳ  [LATIN SMALL LETTER U WITH DIAERESIS BELOW]
  1464.                 case '\u1E75': // ṵ  [LATIN SMALL LETTER U WITH TILDE BELOW]
  1465.                 case '\u1E77': // ṷ  [LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW]
  1466.                 case '\u1E79': // ṹ  [LATIN SMALL LETTER U WITH TILDE AND ACUTE]
  1467.                 case '\u1E7B': // ṻ  [LATIN SMALL LETTER U WITH MACRON AND DIAERESIS]
  1468.                 case '\u1EE5': // ụ  [LATIN SMALL LETTER U WITH DOT BELOW]
  1469.                 case '\u1EE7': // ủ  [LATIN SMALL LETTER U WITH HOOK ABOVE]
  1470.                 case '\u1EE9': // ứ  [LATIN SMALL LETTER U WITH HORN AND ACUTE]
  1471.                 case '\u1EEB': // ừ  [LATIN SMALL LETTER U WITH HORN AND GRAVE]
  1472.                 case '\u1EED': // ử  [LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE]
  1473.                 case '\u1EEF': // ữ  [LATIN SMALL LETTER U WITH HORN AND TILDE]
  1474.                 case '\u1EF1': // ự  [LATIN SMALL LETTER U WITH HORN AND DOT BELOW]
  1475.                 case '\u24E4': // ⓤ  [CIRCLED LATIN SMALL LETTER U]
  1476.                 case '\uFF55': // u  [FULLWIDTH LATIN SMALL LETTER U]
  1477.                 case '\u028A': // ʊ  [LATIN SMALL LETTER UPSILON]
  1478.                 case '\u1DB7': // ᶷ  [MODIFIER LETTER SMALL UPSILON]
  1479.                 case '\u1D7F': // ᵿ  [LATIN SMALL LETTER UPSILON WITH STROKE]
  1480.                 case '\u0443': // у  [CYRILLIC SMALL LETTER U]
  1481.                 case '\u045E': // ў  [CYRILLIC SMALL LETTER SHORT U]
  1482.                 case '\u2CA9': // ⲩ  [COPTIC SMALL LETTER UA]
  1483.                 case '\u0479': // ѹ  [CYRILLIC SMALL LETTER UK]
  1484.                 case '\uA64B': // ꙋ  [CYRILLIC SMALL LETTER MONOGRAPH UK]
  1485.                 case '\u2C46': // ⱆ  [GLAGOLITIC SMALL LETTER UKU]
  1486.                     return "u";
  1487.                 case '\u24B0': // ⒰  [PARENTHESIZED LATIN SMALL LETTER U]
  1488.                     return "(u)";
  1489.                 case '\u1D6B': // ᵫ  [LATIN SMALL LETTER UE]
  1490.                     return "ue";
  1491.                 case '\u01B2': // Ʋ  [LATIN CAPITAL LETTER V WITH HOOK]
  1492.                 case '\u0245': // Ʌ  [LATIN CAPITAL LETTER TURNED V]
  1493.                 case '\u1D20': // ᴠ  [LATIN LETTER SMALL CAPITAL V]
  1494.                 case '\u1E7C': // Ṽ  [LATIN CAPITAL LETTER V WITH TILDE]
  1495.                 case '\u1E7E': // Ṿ  [LATIN CAPITAL LETTER V WITH DOT BELOW]
  1496.                 case '\u1EFC': // Ỽ  [LATIN CAPITAL LETTER MIDDLE-WELSH V]
  1497.                 case '\u24CB': // Ⓥ  [CIRCLED LATIN CAPITAL LETTER V]
  1498.                 case '\uA75E': // Ꝟ  [LATIN CAPITAL LETTER V WITH DIAGONAL STROKE]
  1499.                 case '\uA768': // Ꝩ  [LATIN CAPITAL LETTER VEND]
  1500.                 case '\uFF36': // V  [FULLWIDTH LATIN CAPITAL LETTER V]
  1501.                 case '\u0412': // В  [CYRILLIC CAPITAL LETTER VE]
  1502.                 case '\u2C02': // Ⰲ  [GLAGOLITIC CAPITAL LETTER VEDE]
  1503.                 case '\u16A1': // ᚡ  [RUNIC LETTER V]
  1504.                     return "V";
  1505.                 case '\u028B': // ʋ  [LATIN SMALL LETTER V WITH HOOK]
  1506.                 case '\u028C': // ʌ  [LATIN SMALL LETTER TURNED V]
  1507.                 case '\u1D65': // ᵥ  [LATIN SUBSCRIPT SMALL LETTER V]
  1508.                 case '\u1D8C': // ᶌ  [LATIN SMALL LETTER V WITH PALATAL HOOK]
  1509.                 case '\u1E7D': // ṽ  [LATIN SMALL LETTER V WITH TILDE]
  1510.                 case '\u1E7F': // ṿ  [LATIN SMALL LETTER V WITH DOT BELOW]
  1511.                 case '\u24E5': // ⓥ  [CIRCLED LATIN SMALL LETTER V]
  1512.                 case '\u2C71': // ⱱ  [LATIN SMALL LETTER V WITH RIGHT HOOK]
  1513.                 case '\u2C74': // ⱴ  [LATIN SMALL LETTER V WITH CURL]
  1514.                 case '\uA75F': // ꝟ  [LATIN SMALL LETTER V WITH DIAGONAL STROKE]
  1515.                 case '\uFF56': // v  [FULLWIDTH LATIN SMALL LETTER V]
  1516.                 case '\u0432': // в  [CYRILLIC SMALL LETTER VE]
  1517.                 case '\u1C80': // ᲀ  [CYRILLIC SMALL LETTER ROUNDED VE]
  1518.                 case '\u2C32': // ⰲ  [GLAGOLITIC SMALL LETTER VEDE]
  1519.                     return "v";
  1520.                 case '\uA760': // Ꝡ  [LATIN CAPITAL LETTER VY]
  1521.                     return "VY";
  1522.                 case '\u24B1': // ⒱  [PARENTHESIZED LATIN SMALL LETTER V]
  1523.                     return "(v)";
  1524.                 case '\uA761': // ꝡ  [LATIN SMALL LETTER VY]
  1525.                     return "vy";
  1526.                 case '\u0174': // Ŵ  [LATIN CAPITAL LETTER W WITH CIRCUMFLEX]
  1527.                 case '\u01F7': // Ƿ  [LATIN CAPITAL LETTER WYNN]
  1528.                 case '\u1D21': // ᴡ  [LATIN LETTER SMALL CAPITAL W]
  1529.                 case '\u1E80': // Ẁ  [LATIN CAPITAL LETTER W WITH GRAVE]
  1530.                 case '\u1E82': // Ẃ  [LATIN CAPITAL LETTER W WITH ACUTE]
  1531.                 case '\u1E84': // Ẅ  [LATIN CAPITAL LETTER W WITH DIAERESIS]
  1532.                 case '\u1E86': // Ẇ  [LATIN CAPITAL LETTER W WITH DOT ABOVE]
  1533.                 case '\u1E88': // Ẉ  [LATIN CAPITAL LETTER W WITH DOT BELOW]
  1534.                 case '\u24CC': // Ⓦ  [CIRCLED LATIN CAPITAL LETTER W]
  1535.                 case '\u2C72': // Ⱳ  [LATIN CAPITAL LETTER W WITH HOOK]
  1536.                 case '\uFF37': // W  [FULLWIDTH LATIN CAPITAL LETTER W]
  1537.                 case '\u16B9': // ᚹ  [RUNIC LETTER WUNJO WYNN W]
  1538.                 case '\u16A5': // ᚥ  [RUNIC LETTER W]
  1539.                     return "W";
  1540.                 case '\u0175': // ŵ  [LATIN SMALL LETTER W WITH CIRCUMFLEX]
  1541.                 case '\u01BF': // ƿ  [LATIN LETTER WYNN]
  1542.                 case '\u028D': // ʍ  [LATIN SMALL LETTER TURNED W]
  1543.                 case '\u1E81': // ẁ  [LATIN SMALL LETTER W WITH GRAVE]
  1544.                 case '\u1E83': // ẃ  [LATIN SMALL LETTER W WITH ACUTE]
  1545.                 case '\u1E85': // ẅ  [LATIN SMALL LETTER W WITH DIAERESIS]
  1546.                 case '\u1E87': // ẇ  [LATIN SMALL LETTER W WITH DOT ABOVE]
  1547.                 case '\u1E89': // ẉ  [LATIN SMALL LETTER W WITH DOT BELOW]
  1548.                 case '\u1E98': // ẘ  [LATIN SMALL LETTER W WITH RING ABOVE]
  1549.                 case '\u24E6': // ⓦ  [CIRCLED LATIN SMALL LETTER W]
  1550.                 case '\u2C73': // ⱳ  [LATIN SMALL LETTER W WITH HOOK]
  1551.                 case '\uFF57': // w  [FULLWIDTH LATIN SMALL LETTER W]
  1552.                     return "w";
  1553.                 case '\u24B2': // ⒲  [PARENTHESIZED LATIN SMALL LETTER W]
  1554.                     return "(w)";
  1555.                 case '\u1E8A': // Ẋ  [LATIN CAPITAL LETTER X WITH DOT ABOVE]
  1556.                 case '\u1E8C': // Ẍ  [LATIN CAPITAL LETTER X WITH DIAERESIS]
  1557.                 case '\u24CD': // Ⓧ  [CIRCLED LATIN CAPITAL LETTER X]
  1558.                 case '\uFF38': // X  [FULLWIDTH LATIN CAPITAL LETTER X]
  1559.                 case '\u16EA': // ᛪ  [RUNIC LETTER X]
  1560.                     return "X";
  1561.                 case '\u1D8D': // ᶍ  [LATIN SMALL LETTER X WITH PALATAL HOOK]
  1562.                 case '\u1E8B': // ẋ  [LATIN SMALL LETTER X WITH DOT ABOVE]
  1563.                 case '\u1E8D': // ẍ  [LATIN SMALL LETTER X WITH DIAERESIS]
  1564.                 case '\u2093': // ₓ  [LATIN SUBSCRIPT SMALL LETTER X]
  1565.                 case '\u24E7': // ⓧ  [CIRCLED LATIN SMALL LETTER X]
  1566.                 case '\uFF58': // x  [FULLWIDTH LATIN SMALL LETTER X]
  1567.                     return "x";
  1568.                 case '\u24B3': // ⒳  [PARENTHESIZED LATIN SMALL LETTER X]
  1569.                     return "(x)";
  1570.                 case '\u00DD': // Ý  [LATIN CAPITAL LETTER Y WITH ACUTE]
  1571.                 case '\u0176': // Ŷ  [LATIN CAPITAL LETTER Y WITH CIRCUMFLEX]
  1572.                 case '\u0178': // Ÿ  [LATIN CAPITAL LETTER Y WITH DIAERESIS]
  1573.                 case '\u01B3': // Ƴ  [LATIN CAPITAL LETTER Y WITH HOOK]
  1574.                 case '\u0232': // Ȳ  [LATIN CAPITAL LETTER Y WITH MACRON]
  1575.                 case '\u024E': // Ɏ  [LATIN CAPITAL LETTER Y WITH STROKE]
  1576.                 case '\u028F': // ʏ  [LATIN LETTER SMALL CAPITAL Y]
  1577.                 case '\u1E8E': // Ẏ  [LATIN CAPITAL LETTER Y WITH DOT ABOVE]
  1578.                 case '\u1EF2': // Ỳ  [LATIN CAPITAL LETTER Y WITH GRAVE]
  1579.                 case '\u1EF4': // Ỵ  [LATIN CAPITAL LETTER Y WITH DOT BELOW]
  1580.                 case '\u1EF6': // Ỷ  [LATIN CAPITAL LETTER Y WITH HOOK ABOVE]
  1581.                 case '\u1EF8': // Ỹ  [LATIN CAPITAL LETTER Y WITH TILDE]
  1582.                 case '\u1EFE': // Ỿ  [LATIN CAPITAL LETTER Y WITH LOOP]
  1583.                 case '\u24CE': // Ⓨ  [CIRCLED LATIN CAPITAL LETTER Y]
  1584.                 case '\uFF39': // Y  [FULLWIDTH LATIN CAPITAL LETTER Y]
  1585.                 case '\u03A5': // Υ  [GREEK CAPITAL LETTER UPSILON]
  1586.                 case '\u03D2': // ϒ  [GREEK UPSILON WITH HOOK SYMBOL]
  1587.                 case '\u038E': // Ύ  [GREEK CAPITAL LETTER UPSILON WITH TONOS]
  1588.                 case '\u03AB': // Ϋ  [GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA]
  1589.                 case '\u0419': // Й  [CYRILLIC CAPITAL LETTER SHORT I]
  1590.                 case '\u16A4': // ᚤ  [RUNIC LETTER Y]
  1591.                 case '\u16A3': // ᚣ  [RUNIC LETTER YR]
  1592.                     return "Y";
  1593.                 case '\u00FD': // ý  [LATIN SMALL LETTER Y WITH ACUTE]
  1594.                 case '\u00FF': // ÿ  [LATIN SMALL LETTER Y WITH DIAERESIS]
  1595.                 case '\u0177': // ŷ  [LATIN SMALL LETTER Y WITH CIRCUMFLEX]
  1596.                 case '\u01B4': // ƴ  [LATIN SMALL LETTER Y WITH HOOK]
  1597.                 case '\u0233': // ȳ  [LATIN SMALL LETTER Y WITH MACRON]
  1598.                 case '\u024F': // ɏ  [LATIN SMALL LETTER Y WITH STROKE]
  1599.                 case '\u028E': // ʎ  [LATIN SMALL LETTER TURNED Y]
  1600.                 case '\u1E8F': // ẏ  [LATIN SMALL LETTER Y WITH DOT ABOVE]
  1601.                 case '\u1E99': // ẙ  [LATIN SMALL LETTER Y WITH RING ABOVE]
  1602.                 case '\u1EF3': // ỳ  [LATIN SMALL LETTER Y WITH GRAVE]
  1603.                 case '\u1EF5': // ỵ  [LATIN SMALL LETTER Y WITH DOT BELOW]
  1604.                 case '\u1EF7': // ỷ  [LATIN SMALL LETTER Y WITH HOOK ABOVE]
  1605.                 case '\u1EF9': // ỹ  [LATIN SMALL LETTER Y WITH TILDE]
  1606.                 case '\u1EFF': // ỿ  [LATIN SMALL LETTER Y WITH LOOP]
  1607.                 case '\u24E8': // ⓨ  [CIRCLED LATIN SMALL LETTER Y]
  1608.                 case '\uFF59': // y  [FULLWIDTH LATIN SMALL LETTER Y]
  1609.                 case '\u03C5': // υ  [GREEK SMALL LETTER UPSILON]
  1610.                 case '\u03CD': // ύ  [GREEK SMALL LETTER UPSILON WITH TONOS]
  1611.                 case '\u03CB': // ϋ  [GREEK SMALL LETTER UPSILON WITH DIALYTIKA]
  1612.                 case '\u0439': // й  [CYRILLIC SMALL LETTER SHORT I]
  1613.                     return "y";
  1614.                 case '\u24B4': // ⒴  [PARENTHESIZED LATIN SMALL LETTER Y]
  1615.                     return "(y)";
  1616.                 case '\u0179': // Ź  [LATIN CAPITAL LETTER Z WITH ACUTE]
  1617.                 case '\u017B': // Ż  [LATIN CAPITAL LETTER Z WITH DOT ABOVE]
  1618.                 case '\u017D': // Ž  [LATIN CAPITAL LETTER Z WITH CARON]
  1619.                 case '\u01B5': // Ƶ  [LATIN CAPITAL LETTER Z WITH STROKE]
  1620.                 case '\u021C': // Ȝ  [LATIN CAPITAL LETTER YOGH]
  1621.                 case '\u0224': // Ȥ  [LATIN CAPITAL LETTER Z WITH HOOK]
  1622.                 case '\u1D22': // ᴢ  [LATIN LETTER SMALL CAPITAL Z]
  1623.                 case '\u1E90': // Ẑ  [LATIN CAPITAL LETTER Z WITH CIRCUMFLEX]
  1624.                 case '\u1E92': // Ẓ  [LATIN CAPITAL LETTER Z WITH DOT BELOW]
  1625.                 case '\u1E94': // Ẕ  [LATIN CAPITAL LETTER Z WITH LINE BELOW]
  1626.                 case '\u24CF': // Ⓩ  [CIRCLED LATIN CAPITAL LETTER Z]
  1627.                 case '\u2C6B': // Ⱬ  [LATIN CAPITAL LETTER Z WITH DESCENDER]
  1628.                 case '\uA762': // Ꝣ  [LATIN CAPITAL LETTER VISIGOTHIC Z]
  1629.                 case '\uFF3A': // Z  [FULLWIDTH LATIN CAPITAL LETTER Z]
  1630.                 case '\u0396': // Ζ  [GREEK CAPITAL LETTER ZETA]
  1631.                 case '\u2C8A': // Ⲋ  [COPTIC CAPITAL LETTER SOU]
  1632.                 case '\u0417': // З  [CYRILLIC CAPITAL LETTER ZE]
  1633.                 case '\uA640': // Ꙁ  [CYRILLIC CAPITAL LETTER ZEMLYA]
  1634.                 case '\u2C08': // Ⰸ  [GLAGOLITIC CAPITAL LETTER ZEMLJA]
  1635.                 case '\u16C9': // ᛉ  [RUNIC LETTER ALGIZ EOLHX]
  1636.                 case '\u16CE': // ᛎ  [RUNIC LETTER Z]
  1637.                     return "Z";
  1638.                 case '\u017A': // ź  [LATIN SMALL LETTER Z WITH ACUTE]
  1639.                 case '\u017C': // ż  [LATIN SMALL LETTER Z WITH DOT ABOVE]
  1640.                 case '\u017E': // ž  [LATIN SMALL LETTER Z WITH CARON]
  1641.                 case '\u01B6': // ƶ  [LATIN SMALL LETTER Z WITH STROKE]
  1642.                 case '\u021D': // ȝ  [LATIN SMALL LETTER YOGH]
  1643.                 case '\u0225': // ȥ  [LATIN SMALL LETTER Z WITH HOOK]
  1644.                 case '\u0240': // ɀ  [LATIN SMALL LETTER Z WITH SWASH TAIL]
  1645.                 case '\u0290': // ʐ  [LATIN SMALL LETTER Z WITH RETROFLEX HOOK]
  1646.                 case '\u0291': // ʑ  [LATIN SMALL LETTER Z WITH CURL]
  1647.                 case '\u1D76': // ᵶ  [LATIN SMALL LETTER Z WITH MIDDLE TILDE]
  1648.                 case '\u1D8E': // ᶎ  [LATIN SMALL LETTER Z WITH PALATAL HOOK]
  1649.                 case '\u1E91': // ẑ  [LATIN SMALL LETTER Z WITH CIRCUMFLEX]
  1650.                 case '\u1E93': // ẓ  [LATIN SMALL LETTER Z WITH DOT BELOW]
  1651.                 case '\u1E95': // ẕ  [LATIN SMALL LETTER Z WITH LINE BELOW]
  1652.                 case '\u24E9': // ⓩ  [CIRCLED LATIN SMALL LETTER Z]
  1653.                 case '\u2C6C': // ⱬ  [LATIN SMALL LETTER Z WITH DESCENDER]
  1654.                 case '\uA763': // ꝣ  [LATIN SMALL LETTER VISIGOTHIC Z]
  1655.                 case '\uFF5A': // z  [FULLWIDTH LATIN SMALL LETTER Z]
  1656.                 case '\u03B6': // ζ  [GREEK SMALL LETTER ZETA]
  1657.                 case '\u2C8B': // ⲋ  [COPTIC SMALL LETTER SOU]
  1658.                 case '\u0437': // з  [CYRILLIC SMALL LETTER ZE]
  1659.                 case '\uA641': // ꙁ  [CYRILLIC SMALL LETTER ZEMLYA]
  1660.                 case '\u2C38': // ⰸ  [GLAGOLITIC SMALL LETTER ZEMLJA]
  1661.                     return "z";
  1662.                 case '\u24B5': // ⒵  [PARENTHESIZED LATIN SMALL LETTER Z]
  1663.                     return "(z)";
  1664.                 case '\u2070': // ⁰  [SUPERSCRIPT ZERO]
  1665.                 case '\u2080': // ₀  [SUBSCRIPT ZERO]
  1666.                 case '\u24EA': // ⓪  [CIRCLED DIGIT ZERO]
  1667.                 case '\u24FF': // ⓿  [NEGATIVE CIRCLED DIGIT ZERO]
  1668.                 case '\uFF10': // 0  [FULLWIDTH DIGIT ZERO]
  1669.                     return "0";
  1670.                 case '\u00B9': // ¹  [SUPERSCRIPT ONE]
  1671.                 case '\u2081': // ₁  [SUBSCRIPT ONE]
  1672.                 case '\u2460': // ①  [CIRCLED DIGIT ONE]
  1673.                 case '\u24F5': // ⓵  [DOUBLE CIRCLED DIGIT ONE]
  1674.                 case '\u2776': // ❶  [DINGBAT NEGATIVE CIRCLED DIGIT ONE]
  1675.                 case '\u2780': // ➀  [DINGBAT CIRCLED SANS-SERIF DIGIT ONE]
  1676.                 case '\u278A': // ➊  [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE]
  1677.                 case '\uFF11': // 1  [FULLWIDTH DIGIT ONE]
  1678.                     return "1";
  1679.                 case '\u2488': // ⒈  [DIGIT ONE FULL STOP]
  1680.                     return "1.";
  1681.                 case '\u2474': // ⑴  [PARENTHESIZED DIGIT ONE]
  1682.                     return "(1)";
  1683.                 case '\u00B2': // ²  [SUPERSCRIPT TWO]
  1684.                 case '\u2082': // ₂  [SUBSCRIPT TWO]
  1685.                 case '\u2461': // ②  [CIRCLED DIGIT TWO]
  1686.                 case '\u24F6': // ⓶  [DOUBLE CIRCLED DIGIT TWO]
  1687.                 case '\u2777': // ❷  [DINGBAT NEGATIVE CIRCLED DIGIT TWO]
  1688.                 case '\u2781': // ➁  [DINGBAT CIRCLED SANS-SERIF DIGIT TWO]
  1689.                 case '\u278B': // ➋  [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO]
  1690.                 case '\uFF12': // 2  [FULLWIDTH DIGIT TWO]
  1691.                     return "2";
  1692.                 case '\u2489': // ⒉  [DIGIT TWO FULL STOP]
  1693.                     return "2.";
  1694.                 case '\u2475': // ⑵  [PARENTHESIZED DIGIT TWO]
  1695.                     return "(2)";
  1696.                 case '\u00B3': // ³  [SUPERSCRIPT THREE]
  1697.                 case '\u2083': // ₃  [SUBSCRIPT THREE]
  1698.                 case '\u2462': // ③  [CIRCLED DIGIT THREE]
  1699.                 case '\u24F7': // ⓷  [DOUBLE CIRCLED DIGIT THREE]
  1700.                 case '\u2778': // ❸  [DINGBAT NEGATIVE CIRCLED DIGIT THREE]
  1701.                 case '\u2782': // ➂  [DINGBAT CIRCLED SANS-SERIF DIGIT THREE]
  1702.                 case '\u278C': // ➌  [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE]
  1703.                 case '\uFF13': // 3  [FULLWIDTH DIGIT THREE]
  1704.                     return "3";
  1705.                 case '\u248A': // ⒊  [DIGIT THREE FULL STOP]
  1706.                     return "3.";
  1707.                 case '\u2476': // ⑶  [PARENTHESIZED DIGIT THREE]
  1708.                     return "(3)";
  1709.                 case '\u2074': // ⁴  [SUPERSCRIPT FOUR]
  1710.                 case '\u2084': // ₄  [SUBSCRIPT FOUR]
  1711.                 case '\u2463': // ④  [CIRCLED DIGIT FOUR]
  1712.                 case '\u24F8': // ⓸  [DOUBLE CIRCLED DIGIT FOUR]
  1713.                 case '\u2779': // ❹  [DINGBAT NEGATIVE CIRCLED DIGIT FOUR]
  1714.                 case '\u2783': // ➃  [DINGBAT CIRCLED SANS-SERIF DIGIT FOUR]
  1715.                 case '\u278D': // ➍  [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR]
  1716.                 case '\uFF14': // 4  [FULLWIDTH DIGIT FOUR]
  1717.                     return "4";
  1718.                 case '\u248B': // ⒋  [DIGIT FOUR FULL STOP]
  1719.                     return "4.";
  1720.                 case '\u2477': // ⑷  [PARENTHESIZED DIGIT FOUR]
  1721.                     return "(4)";
  1722.                 case '\u2075': // ⁵  [SUPERSCRIPT FIVE]
  1723.                 case '\u2085': // ₅  [SUBSCRIPT FIVE]
  1724.                 case '\u2464': // ⑤  [CIRCLED DIGIT FIVE]
  1725.                 case '\u24F9': // ⓹  [DOUBLE CIRCLED DIGIT FIVE]
  1726.                 case '\u277A': // ❺  [DINGBAT NEGATIVE CIRCLED DIGIT FIVE]
  1727.                 case '\u2784': // ➄  [DINGBAT CIRCLED SANS-SERIF DIGIT FIVE]
  1728.                 case '\u278E': // ➎  [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE]
  1729.                 case '\uFF15': // 5  [FULLWIDTH DIGIT FIVE]
  1730.                     return "5";
  1731.                 case '\u248C': // ⒌  [DIGIT FIVE FULL STOP]
  1732.                     return "5.";
  1733.                 case '\u2478': // ⑸  [PARENTHESIZED DIGIT FIVE]
  1734.                     return "(5)";
  1735.                 case '\u2076': // ⁶  [SUPERSCRIPT SIX]
  1736.                 case '\u2086': // ₆  [SUBSCRIPT SIX]
  1737.                 case '\u2465': // ⑥  [CIRCLED DIGIT SIX]
  1738.                 case '\u24FA': // ⓺  [DOUBLE CIRCLED DIGIT SIX]
  1739.                 case '\u277B': // ❻  [DINGBAT NEGATIVE CIRCLED DIGIT SIX]
  1740.                 case '\u2785': // ➅  [DINGBAT CIRCLED SANS-SERIF DIGIT SIX]
  1741.                 case '\u278F': // ➏  [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX]
  1742.                 case '\uFF16': // 6  [FULLWIDTH DIGIT SIX]
  1743.                     return "6";
  1744.                 case '\u248D': // ⒍  [DIGIT SIX FULL STOP]
  1745.                     return "6.";
  1746.                 case '\u2479': // ⑹  [PARENTHESIZED DIGIT SIX]
  1747.                     return "(6)";
  1748.                 case '\u2077': // ⁷  [SUPERSCRIPT SEVEN]
  1749.                 case '\u2087': // ₇  [SUBSCRIPT SEVEN]
  1750.                 case '\u2466': // ⑦  [CIRCLED DIGIT SEVEN]
  1751.                 case '\u24FB': // ⓻  [DOUBLE CIRCLED DIGIT SEVEN]
  1752.                 case '\u277C': // ❼  [DINGBAT NEGATIVE CIRCLED DIGIT SEVEN]
  1753.                 case '\u2786': // ➆  [DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN]
  1754.                 case '\u2790': // ➐  [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN]
  1755.                 case '\uFF17': // 7  [FULLWIDTH DIGIT SEVEN]
  1756.                     return "7";
  1757.                 case '\u248E': // ⒎  [DIGIT SEVEN FULL STOP]
  1758.                     return "7.";
  1759.                 case '\u247A': // ⑺  [PARENTHESIZED DIGIT SEVEN]
  1760.                     return "(7)";
  1761.                 case '\u2078': // ⁸  [SUPERSCRIPT EIGHT]
  1762.                 case '\u2088': // ₈  [SUBSCRIPT EIGHT]
  1763.                 case '\u2467': // ⑧  [CIRCLED DIGIT EIGHT]
  1764.                 case '\u24FC': // ⓼  [DOUBLE CIRCLED DIGIT EIGHT]
  1765.                 case '\u277D': // ❽  [DINGBAT NEGATIVE CIRCLED DIGIT EIGHT]
  1766.                 case '\u2787': // ➇  [DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT]
  1767.                 case '\u2791': // ➑  [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT]
  1768.                 case '\uFF18': // 8  [FULLWIDTH DIGIT EIGHT]
  1769.                     return "8";
  1770.                 case '\u248F': // ⒏  [DIGIT EIGHT FULL STOP]
  1771.                     return "8.";
  1772.                 case '\u247B': // ⑻  [PARENTHESIZED DIGIT EIGHT]
  1773.                     return "(8)";
  1774.                 case '\u2079': // ⁹  [SUPERSCRIPT NINE]
  1775.                 case '\u2089': // ₉  [SUBSCRIPT NINE]
  1776.                 case '\u2468': // ⑨  [CIRCLED DIGIT NINE]
  1777.                 case '\u24FD': // ⓽  [DOUBLE CIRCLED DIGIT NINE]
  1778.                 case '\u277E': // ❾  [DINGBAT NEGATIVE CIRCLED DIGIT NINE]
  1779.                 case '\u2788': // ➈  [DINGBAT CIRCLED SANS-SERIF DIGIT NINE]
  1780.                 case '\u2792': // ➒  [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE]
  1781.                 case '\uFF19': // 9  [FULLWIDTH DIGIT NINE]
  1782.                     return "9";
  1783.                 case '\u2490': // ⒐  [DIGIT NINE FULL STOP]
  1784.                     return "9.";
  1785.                 case '\u247C': // ⑼  [PARENTHESIZED DIGIT NINE]
  1786.                     return "(9)";
  1787.                 case '\u2469': // ⑩  [CIRCLED NUMBER TEN]
  1788.                 case '\u24FE': // ⓾  [DOUBLE CIRCLED NUMBER TEN]
  1789.                 case '\u277F': // ❿  [DINGBAT NEGATIVE CIRCLED NUMBER TEN]
  1790.                 case '\u2789': // ➉  [DINGBAT CIRCLED SANS-SERIF NUMBER TEN]
  1791.                 case '\u2793': // ➓  [DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN]
  1792.                     return "10";
  1793.                 case '\u2491': // ⒑  [NUMBER TEN FULL STOP]
  1794.                     return "10.";
  1795.                 case '\u247D': // ⑽  [PARENTHESIZED NUMBER TEN]
  1796.                     return "(10)";
  1797.                 case '\u246A': // ⑪  [CIRCLED NUMBER ELEVEN]
  1798.                 case '\u24EB': // ⓫  [NEGATIVE CIRCLED NUMBER ELEVEN]
  1799.                     return "11";
  1800.                 case '\u2492': // ⒒  [NUMBER ELEVEN FULL STOP]
  1801.                     return "11.";
  1802.                 case '\u247E': // ⑾  [PARENTHESIZED NUMBER ELEVEN]
  1803.                     return "(11)";
  1804.                 case '\u246B': // ⑫  [CIRCLED NUMBER TWELVE]
  1805.                 case '\u24EC': // ⓬  [NEGATIVE CIRCLED NUMBER TWELVE]
  1806.                     return "12";
  1807.                 case '\u2493': // ⒓  [NUMBER TWELVE FULL STOP]
  1808.                     return "12.";
  1809.                 case '\u247F': // ⑿  [PARENTHESIZED NUMBER TWELVE]
  1810.                     return "(12)";
  1811.                 case '\u246C': // ⑬  [CIRCLED NUMBER THIRTEEN]
  1812.                 case '\u24ED': // ⓭  [NEGATIVE CIRCLED NUMBER THIRTEEN]
  1813.                     return "13";
  1814.                 case '\u2494': // ⒔  [NUMBER THIRTEEN FULL STOP]
  1815.                     return "13.";
  1816.                 case '\u2480': // ⒀  [PARENTHESIZED NUMBER THIRTEEN]
  1817.                     return "(13)";
  1818.                 case '\u246D': // ⑭  [CIRCLED NUMBER FOURTEEN]
  1819.                 case '\u24EE': // ⓮  [NEGATIVE CIRCLED NUMBER FOURTEEN]
  1820.                     return "14";
  1821.                 case '\u2495': // ⒕  [NUMBER FOURTEEN FULL STOP]
  1822.                     return "14.";
  1823.                 case '\u2481': // ⒁  [PARENTHESIZED NUMBER FOURTEEN]
  1824.                     return "(14)";
  1825.                 case '\u246E': // ⑮  [CIRCLED NUMBER FIFTEEN]
  1826.                 case '\u24EF': // ⓯  [NEGATIVE CIRCLED NUMBER FIFTEEN]
  1827.                     return "15";
  1828.                 case '\u2496': // ⒖  [NUMBER FIFTEEN FULL STOP]
  1829.                     return "15.";
  1830.                 case '\u2482': // ⒂  [PARENTHESIZED NUMBER FIFTEEN]
  1831.                     return "(15)";
  1832.                 case '\u246F': // ⑯  [CIRCLED NUMBER SIXTEEN]
  1833.                 case '\u24F0': // ⓰  [NEGATIVE CIRCLED NUMBER SIXTEEN]
  1834.                     return "16";
  1835.                 case '\u2497': // ⒗  [NUMBER SIXTEEN FULL STOP]
  1836.                     return "16.";
  1837.                 case '\u2483': // ⒃  [PARENTHESIZED NUMBER SIXTEEN]
  1838.                     return "(16)";
  1839.                 case '\u2470': // ⑰  [CIRCLED NUMBER SEVENTEEN]
  1840.                 case '\u24F1': // ⓱  [NEGATIVE CIRCLED NUMBER SEVENTEEN]
  1841.                 case '\u16EE': // ᛮ  [RUNIC ARLAUG SYMBOL]
  1842.                     return "17";
  1843.                 case '\u2498': // ⒘  [NUMBER SEVENTEEN FULL STOP]
  1844.                     return "17.";
  1845.                 case '\u2484': // ⒄  [PARENTHESIZED NUMBER SEVENTEEN]
  1846.                     return "(17)";
  1847.                 case '\u2471': // ⑱  [CIRCLED NUMBER EIGHTEEN]
  1848.                 case '\u24F2': // ⓲  [NEGATIVE CIRCLED NUMBER EIGHTEEN]
  1849.                 case '\u16EF': // ᛯ  [RUNIC TVIMADUR SYMBOL]
  1850.                     return "18";
  1851.                 case '\u2499': // ⒙  [NUMBER EIGHTEEN FULL STOP]
  1852.                     return "18.";
  1853.                 case '\u2485': // ⒅  [PARENTHESIZED NUMBER EIGHTEEN]
  1854.                     return "(18)";
  1855.                 case '\u2472': // ⑲  [CIRCLED NUMBER NINETEEN]
  1856.                 case '\u24F3': // ⓳  [NEGATIVE CIRCLED NUMBER NINETEEN]
  1857.                 case '\u16F0': // ᛰ  [RUNIC BELGTHOR SYMBOL]
  1858.                     return "19";
  1859.                 case '\u249A': // ⒚  [NUMBER NINETEEN FULL STOP]
  1860.                     return "19.";
  1861.                 case '\u2486': // ⒆  [PARENTHESIZED NUMBER NINETEEN]
  1862.                     return "(19)";
  1863.                 case '\u2473': // ⑳  [CIRCLED NUMBER TWENTY]
  1864.                 case '\u24F4': // ⓴  [NEGATIVE CIRCLED NUMBER TWENTY]
  1865.                     return "20";
  1866.                 case '\u249B': // ⒛  [NUMBER TWENTY FULL STOP]
  1867.                     return "20.";
  1868.                 case '\u2487': // ⒇  [PARENTHESIZED NUMBER TWENTY]
  1869.                     return "(20)";
  1870.                 case '\u00AB': // «  [LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]
  1871.                 case '\u00BB': // »  [RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK]
  1872.                 case '\u201C': // “  [LEFT DOUBLE QUOTATION MARK]
  1873.                 case '\u201D': // ”  [RIGHT DOUBLE QUOTATION MARK]
  1874.                 case '\u201E': // „  [DOUBLE LOW-9 QUOTATION MARK]
  1875.                 case '\u2033': // ″  [DOUBLE PRIME]
  1876.                 case '\u2036': // ‶  [REVERSED DOUBLE PRIME]
  1877.                 case '\u275D': // ❝  [HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT]
  1878.                 case '\u275E': // ❞  [HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT]
  1879.                 case '\u276E': // ❮  [HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT]
  1880.                 case '\u276F': // ❯  [HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT]
  1881.                 case '\uFF02': // "  [FULLWIDTH QUOTATION MARK]
  1882.                     return "\"";
  1883.                 case '\u2018': // ‘  [LEFT SINGLE QUOTATION MARK]
  1884.                 case '\u2019': // ’  [RIGHT SINGLE QUOTATION MARK]
  1885.                 case '\u201A': // ‚  [SINGLE LOW-9 QUOTATION MARK]
  1886.                 case '\u201B': // ‛  [SINGLE HIGH-REVERSED-9 QUOTATION MARK]
  1887.                 case '\u2032': // ′  [PRIME]
  1888.                 case '\u2035': // ‵  [REVERSED PRIME]
  1889.                 case '\u2039': // ‹  [SINGLE LEFT-POINTING ANGLE QUOTATION MARK]
  1890.                 case '\u203A': // ›  [SINGLE RIGHT-POINTING ANGLE QUOTATION MARK]
  1891.                 case '\u275B': // ❛  [HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT]
  1892.                 case '\u275C': // ❜  [HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT]
  1893.                 case '\uFF07': // '  [FULLWIDTH APOSTROPHE]
  1894.                     return "\'";
  1895.                 case '\u2010': // ‐  [HYPHEN]
  1896.                 case '\u2011': // ‑  [NON-BREAKING HYPHEN]
  1897.                 case '\u2012': // ‒  [FIGURE DASH]
  1898.                 case '\u2013': // –  [EN DASH]
  1899.                 case '\u2014': // —  [EM DASH]
  1900.                 case '\u207B': // ⁻  [SUPERSCRIPT MINUS]
  1901.                 case '\u208B': // ₋  [SUBSCRIPT MINUS]
  1902.                 case '\uFF0D': // -  [FULLWIDTH HYPHEN-MINUS]
  1903.                     return "-";
  1904.                 case '\u2045': // ⁅  [LEFT SQUARE BRACKET WITH QUILL]
  1905.                 case '\u2772': // ❲  [LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT]
  1906.                 case '\uFF3B': // [  [FULLWIDTH LEFT SQUARE BRACKET]
  1907.                     return "[";
  1908.                 case '\u2046': // ⁆  [RIGHT SQUARE BRACKET WITH QUILL]
  1909.                 case '\u2773': // ❳  [LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT]
  1910.                 case '\uFF3D': // ]  [FULLWIDTH RIGHT SQUARE BRACKET]
  1911.                     return "]";
  1912.                 case '\u207D': // ⁽  [SUPERSCRIPT LEFT PARENTHESIS]
  1913.                 case '\u208D': // ₍  [SUBSCRIPT LEFT PARENTHESIS]
  1914.                 case '\u2768': // ❨  [MEDIUM LEFT PARENTHESIS ORNAMENT]
  1915.                 case '\u276A': // ❪  [MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT]
  1916.                 case '\uFF08': // (  [FULLWIDTH LEFT PARENTHESIS]
  1917.                     return "(";
  1918.                 case '\u2E28': // ⸨  [LEFT DOUBLE PARENTHESIS]
  1919.                     return "((";
  1920.                 case '\u207E': // ⁾  [SUPERSCRIPT RIGHT PARENTHESIS]
  1921.                 case '\u208E': // ₎  [SUBSCRIPT RIGHT PARENTHESIS]
  1922.                 case '\u2769': // ❩  [MEDIUM RIGHT PARENTHESIS ORNAMENT]
  1923.                 case '\u276B': // ❫  [MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT]
  1924.                 case '\uFF09': // )  [FULLWIDTH RIGHT PARENTHESIS]
  1925.                     return ")";
  1926.                 case '\u2E29': // ⸩  [RIGHT DOUBLE PARENTHESIS]
  1927.                     return "))";
  1928.                 case '\u276C': // ❬  [MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT]
  1929.                 case '\u2770': // ❰  [HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT]
  1930.                 case '\uFF1C': // <  [FULLWIDTH LESS-THAN SIGN]
  1931.                     return "<";
  1932.                 case '\u276D': // ❭  [MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT]
  1933.                 case '\u2771': // ❱  [HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT]
  1934.                 case '\uFF1E': // >  [FULLWIDTH GREATER-THAN SIGN]
  1935.                     return ">";
  1936.                 case '\u2774': // ❴  [MEDIUM LEFT CURLY BRACKET ORNAMENT]
  1937.                 case '\uFF5B': // {  [FULLWIDTH LEFT CURLY BRACKET]
  1938.                     return "{";
  1939.                 case '\u2775': // ❵  [MEDIUM RIGHT CURLY BRACKET ORNAMENT]
  1940.                 case '\uFF5D': // }  [FULLWIDTH RIGHT CURLY BRACKET]
  1941.                     return "}";
  1942.                 case '\u207A': // ⁺  [SUPERSCRIPT PLUS SIGN]
  1943.                 case '\u208A': // ₊  [SUBSCRIPT PLUS SIGN]
  1944.                 case '\uFF0B': // +  [FULLWIDTH PLUS SIGN]
  1945.                 case '\u2020': // †  [DAGGER]
  1946.                 case '\u16ED': // ᛭  [RUNIC CROSS PUNCTUATION]
  1947.                     return "+";
  1948.                 case '\u207C': // ⁼  [SUPERSCRIPT EQUALS SIGN]
  1949.                 case '\u208C': // ₌  [SUBSCRIPT EQUALS SIGN]
  1950.                 case '\uFF1D': // =  [FULLWIDTH EQUALS SIGN]
  1951.                     return "=";
  1952.                 case '\uFF01': // !  [FULLWIDTH EXCLAMATION MARK]
  1953.                     return "!";
  1954.                 case '\u203C': // ‼  [DOUBLE EXCLAMATION MARK]
  1955.                     return "!!";
  1956.                 case '\u2049': // ⁉  [EXCLAMATION QUESTION MARK]
  1957.                     return "!?";
  1958.                 case '\uFF03': // #  [FULLWIDTH NUMBER SIGN]
  1959.                     return "#";
  1960.                 case '\uFF04': // $  [FULLWIDTH DOLLAR SIGN]
  1961.                     return "$";
  1962.                 case '\u2052': // ⁒  [COMMERCIAL MINUS SIGN]
  1963.                 case '\uFF05': // %  [FULLWIDTH PERCENT SIGN]
  1964.                     return "%";
  1965.                 case '\uFF06': // &  [FULLWIDTH AMPERSAND]
  1966.                     return "&";
  1967.                 case '\u204E': // ⁎  [LOW ASTERISK]
  1968.                 case '\uFF0A': // *  [FULLWIDTH ASTERISK]
  1969.                     return "*";
  1970.                 case '\uFF0C': // ,  [FULLWIDTH COMMA]
  1971.                     return ",";
  1972.                 case '\uFF0E': // .  [FULLWIDTH FULL STOP]
  1973.                 case '\u16EB': // ᛫  [RUNIC SINGLE PUNCTUATION]
  1974.                     return ".";
  1975.                 case '\u2044': // ⁄  [FRACTION SLASH]
  1976.                 case '\uFF0F': // /  [FULLWIDTH SOLIDUS]
  1977.                     return "/";
  1978.                 case '\uFF1A': // :  [FULLWIDTH COLON]
  1979.                 case '\u16EC': // ᛬  [RUNIC MULTIPLE PUNCTUATION]
  1980.                     return ":";
  1981.                 case '\u204F': // ⁏  [REVERSED SEMICOLON]
  1982.                 case '\uFF1B': // ;  [FULLWIDTH SEMICOLON]
  1983.                     return ";";
  1984.                 case '\uFF1F': // ?  [FULLWIDTH QUESTION MARK]
  1985.                     return "?";
  1986.                 case '\u2047': // ⁇  [DOUBLE QUESTION MARK]
  1987.                     return "??";
  1988.                 case '\u2048': // ⁈  [QUESTION EXCLAMATION MARK]
  1989.                     return "?!";
  1990.                 case '\uFF20': // @  [FULLWIDTH COMMERCIAL AT]
  1991.                     return "@";
  1992.                 case '\uFF3C': // \  [FULLWIDTH REVERSE SOLIDUS]
  1993.                     return "\\";
  1994.                 case '\u2038': // ‸  [CARET]
  1995.                 case '\uFF3E': // ^  [FULLWIDTH CIRCUMFLEX ACCENT]
  1996.                     return "^";
  1997.                 case '\uFF3F': // _  [FULLWIDTH LOW LINE]
  1998.                     return "_";
  1999.                 case '\u2053': // ⁓  [SWUNG DASH]
  2000.                 case '\uFF5E': // ~  [FULLWIDTH TILDE]
  2001.                     return "~";
  2002.                 case '\u039E': // Ξ  [GREEK CAPITAL LETTER XI]
  2003.                 case '\u046E': // Ѯ  [CYRILLIC CAPITAL LETTER KSI]
  2004.                 case '\u2C9C': // Ⲝ  [COPTIC CAPITAL LETTER KSI]
  2005.                     return "KS";
  2006.                 case '\u03BE': // ξ  [GREEK SMALL LETTER XI]
  2007.                 case '\u046F': // ѯ  [CYRILLIC SMALL LETTER KSI]
  2008.                 case '\u2C9D': // ⲝ  [COPTIC SMALL LETTER KSI]
  2009.                     return "ks";
  2010.                 case '\u03A8': // Ψ  [GREEK CAPITAL LETTER PSI]
  2011.                 case '\u1D2A': // ᴪ  [GREEK LETTER SMALL CAPITAL PSI]
  2012.                 case '\u2CAE': // Ⲯ  [COPTIC CAPITAL LETTER PSI]
  2013.                 case '\u0470': // Ѱ  [CYRILLIC CAPITAL LETTER PSI]
  2014.                     return "PS";
  2015.                 case '\u03C8': // ψ  [GREEK SMALL LETTER PSI]
  2016.                 case '\u2CAF': // ⲯ  [COPTIC SMALL LETTER PSI]
  2017.                 case '\u0471': // ѱ  [CYRILLIC SMALL LETTER PSI]
  2018.                     return "ps";
  2019.                 case '\u0401': // Ё  [CYRILLIC CAPITAL LETTER IO]
  2020.                 case '\u046C': // Ѭ  [CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS]
  2021.                 case '\u2C26': // Ⱖ  [GLAGOLITIC CAPITAL LETTER YO]
  2022.                 case '\u2C29': // Ⱙ  [GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS]
  2023.                     return "YO";
  2024.                 case '\u0451': // ё  [CYRILLIC SMALL LETTER IO]
  2025.                 case '\u046D': // ѭ  [CYRILLIC SMALL LETTER IOTIFIED BIG YUS]
  2026.                 case '\u2C56': // ⱖ  [GLAGOLITIC SMALL LETTER YO]
  2027.                 case '\u2C59': // ⱙ  [GLAGOLITIC SMALL LETTER IOTATED BIG YUS]
  2028.                     return "yo";
  2029.                 case '\u0404': // Є  [CYRILLIC CAPITAL LETTER UKRAINIAN IE]
  2030.                 case '\u0464': // Ѥ  [CYRILLIC CAPITAL LETTER IOTIFIED E]
  2031.                 case '\uA656': // Ꙗ  [CYRILLIC CAPITAL LETTER IOTIFIED A]
  2032.                 case '\u0462': // Ѣ  [CYRILLIC CAPITAL LETTER YAT]
  2033.                 case '\uA652': // Ꙓ  [CYRILLIC CAPITAL LETTER IOTIFIED YAT]
  2034.                 case '\u2C21': // Ⱑ  [GLAGOLITIC CAPITAL LETTER YATI]
  2035.                     return "YE";
  2036.                 case '\u0454': // є  [CYRILLIC SMALL LETTER UKRAINIAN IE]
  2037.                 case '\u0465': // ѥ  [CYRILLIC SMALL LETTER IOTIFIED E]
  2038.                 case '\uA657': // ꙗ  [CYRILLIC SMALL LETTER IOTIFIED A]
  2039.                 case '\u0463': // ѣ  [CYRILLIC SMALL LETTER YAT]
  2040.                 case '\u1C87': // ᲇ  [CYRILLIC SMALL LETTER TALL YAT]
  2041.                 case '\uA653': // ꙓ  [CYRILLIC SMALL LETTER IOTIFIED YAT]
  2042.                 case '\u2C51': // ⱑ  [GLAGOLITIC SMALL LETTER YATI]
  2043.                     return "ye";
  2044.                 case '\u0468': // Ѩ  [CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS]
  2045.                 case '\uA65C': // Ꙝ  [CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS]
  2046.                 case '\u2C27': // Ⱗ  [GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS]
  2047.                     return "YEN";
  2048.                 case '\u0469': // ѩ  [CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS]
  2049.                 case '\uA65D': // ꙝ  [CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS]
  2050.                 case '\u2C57': // ⱗ  [GLAGOLITIC SMALL LETTER IOTATED SMALL YUS]
  2051.                     return "yen";
  2052.                 case '\u0407': // Ї  [CYRILLIC CAPITAL LETTER YI]
  2053.                     return "YI";
  2054.                 case '\u0457': // ї  [CYRILLIC SMALL LETTER YI]
  2055.                     return "yi";
  2056.                 case '\u0416': // Ж  [CYRILLIC CAPITAL LETTER ZHE]
  2057.                 case '\u2C06': // Ⰶ  [GLAGOLITIC CAPITAL LETTER ZHIVETE]
  2058.                     return "ZH";
  2059.                 case '\u0436': // ж  [CYRILLIC SMALL LETTER ZHE]
  2060.                 case '\u2C36': // ⰶ  [GLAGOLITIC SMALL LETTER ZHIVETE]
  2061.                     return "zh";
  2062.                 case '\u03A7': // Χ  [GREEK CAPITAL LETTER CHI]
  2063.                 case '\u2CAC': // Ⲭ  [COPTIC CAPITAL LETTER KHI]
  2064.                 case '\u0425': // Х  [CYRILLIC CAPITAL LETTER HA]
  2065.                 case '\u2C18': // Ⱈ  [GLAGOLITIC CAPITAL LETTER HERU]
  2066.                 case '\u2C22': // Ⱒ  [GLAGOLITIC CAPITAL LETTER SPIDERY HA]
  2067.                     return "KH";
  2068.                 case '\u03C7': // χ  [GREEK SMALL LETTER CHI]
  2069.                 case '\u1D61': // ᵡ  [MODIFIER LETTER SMALL CHI]
  2070.                 case '\u1D6A': // ᵪ  [GREEK SUBSCRIPT SMALL LETTER CHI]
  2071.                 case '\u2CAD': // ⲭ  [COPTIC SMALL LETTER KHI]
  2072.                 case '\u0445': // х  [CYRILLIC SMALL LETTER HA]
  2073.                 case '\u2C48': // ⱈ  [GLAGOLITIC SMALL LETTER HERU]
  2074.                 case '\u2C52': // ⱒ  [GLAGOLITIC SMALL LETTER SPIDERY HA]
  2075.                     return "kh";
  2076.                 case '\u0426': // Ц  [CYRILLIC CAPITAL LETTER TSE]
  2077.                 case '\u040B': // Ћ  [CYRILLIC CAPITAL LETTER TSHE]
  2078.                 case '\u2C1C': // Ⱌ  [GLAGOLITIC CAPITAL LETTER TSI]
  2079.                     return "TS";
  2080.                 case '\u0427': // Ч  [CYRILLIC CAPITAL LETTER CHE]
  2081.                 case '\u2C1D': // Ⱍ  [GLAGOLITIC CAPITAL LETTER CHRIVI]
  2082.                 case '\u2C2F': // Ⱟ  [GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI]
  2083.                     return "CH";
  2084.                 case '\u0447': // ч  [CYRILLIC SMALL LETTER CHE]
  2085.                 case '\u2C4D': // ⱍ  [GLAGOLITIC SMALL LETTER CHRIVI]
  2086.                 case '\u2C5F': // ⱟ  [GLAGOLITIC SMALL LETTER CAUDATE CHRIVI]
  2087.                     return "ch";
  2088.                 case '\u0428': // Ш  [CYRILLIC CAPITAL LETTER SHA]
  2089.                 case '\u2C1E': // Ⱎ  [GLAGOLITIC CAPITAL LETTER SHA]
  2090.                 case '\u16F2': // ᛲ  [RUNIC LETTER SH]
  2091.                     return "SH";
  2092.                 case '\u0448': // ш  [CYRILLIC SMALL LETTER SHA]
  2093.                 case '\u2C4E': // ⱎ  [GLAGOLITIC SMALL LETTER SHA]
  2094.                     return "sh";
  2095.                 case '\u0429': // Щ  [CYRILLIC CAPITAL LETTER SHCHA]
  2096.                     return "SHCH";
  2097.                 case '\u0449': // щ  [CYRILLIC SMALL LETTER SHCHA]
  2098.                     return "shch";
  2099.                 case '\u042E': // Ю  [CYRILLIC CAPITAL LETTER YU]
  2100.                 case '\u2C23': // Ⱓ  [GLAGOLITIC CAPITAL LETTER YU]
  2101.                     return "YU";
  2102.                 case '\u044E': // ю  [CYRILLIC SMALL LETTER YU]
  2103.                 case '\u2C53': // ⱓ  [GLAGOLITIC SMALL LETTER YU]
  2104.                     return "yu";
  2105.                 case '\u042F': // Я  [CYRILLIC CAPITAL LETTER YA]
  2106.                     return "YA";
  2107.                 case '\u044F': // я  [CYRILLIC SMALL LETTER YA]
  2108.                     return "ya";
  2109.                 case '\u2C1B': // Ⱋ  [GLAGOLITIC CAPITAL LETTER SHTA]
  2110.                     return "SHT";
  2111.                 case '\u2C4B': // ⱋ  [GLAGOLITIC SMALL LETTER SHTA]
  2112.                     return "sht";
  2113.                 case '\u042A': // Ъ  [CYRILLIC CAPITAL LETTER HARD SIGN]
  2114.                 case '\u044A': // ъ  [CYRILLIC SMALL LETTER HARD SIGN]
  2115.                 case '\u1C86': // ᲆ  [CYRILLIC SMALL LETTER TALL HARD SIGN]
  2116.                 case '\u042C': // Ь  [CYRILLIC CAPITAL LETTER SOFT SIGN]
  2117.                 case '\u044C': // ь  [CYRILLIC SMALL LETTER SOFT SIGN]
  2118.                 case '\u2C20': // Ⱐ  [GLAGOLITIC CAPITAL LETTER YERI]
  2119.                 case '\u2C50': // ⱐ  [GLAGOLITIC SMALL LETTER YERI]
  2120.                 case '\u2C2C': // Ⱜ  [GLAGOLITIC CAPITAL LETTER SHTAPIC]
  2121.                 case '\u2C5C': // ⱜ  [GLAGOLITIC SMALL LETTER SHTAPIC]
  2122.                     return string.Empty;
  2123.                 default:
  2124.                     try {
  2125.                         char[] charArray = c.ToString().Normalize(NormalizationForm.FormKD).ToCharArray();
  2126.                         List<char> charList = new List<char>(1);
  2127.                         foreach (char character in charArray) {
  2128.                             UnicodeCategory unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(character);
  2129.                             if (!unicodeCategory.Equals(UnicodeCategory.NonSpacingMark)) {
  2130.                                 charList.Add(character);
  2131.                             }
  2132.                         }
  2133.                         byte[] bytes = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(charList.ToArray()));
  2134.                         return new string(Encoding.ASCII.GetChars(bytes));
  2135.                     } catch (Exception exception) {
  2136.                         Debug.WriteLine(exception);
  2137.                         return string.Empty;
  2138.                     }
  2139.             }
  2140.         }
  2141.  
  2142.         /// <summary>
  2143.         /// Converts the provided string to the corresponding ASCII string
  2144.         /// according to the pronunciation in the associated language with
  2145.         /// English notation in mind. Symbolic characters are converted based on
  2146.         /// their meaning or appearance. Unknown characters and some known
  2147.         /// characters are replaced with an empty string and removed. Underscore
  2148.         /// belongs to the alphanumeric set.
  2149.         /// </summary>
  2150.         /// <param name="str">String to convert.</param>
  2151.         /// <param name="encoding">Input encoding.</param>
  2152.         /// <param name="conversionOptions">Conversion options.</param>
  2153.         /// <returns>Output string.</returns>
  2154.         public static string Convert(string str, Encoding encoding, ConversionOptions conversionOptions) {
  2155.             char replacingChar = conversionOptions.Equals(ConversionOptions.Alphanumeric) ? '_' : ' ';
  2156.             byte[] bytes = Encoding.Convert(encoding, Encoding.Unicode, encoding.GetBytes(str));
  2157.             char[] charArray = Encoding.Unicode.GetString(bytes).ToCharArray();
  2158.             StringBuilder stringBuilder = new StringBuilder(charArray.Length);
  2159.             string buffer = null, recent = null;
  2160.             foreach (char c in charArray) {
  2161.                 recent = Convert(c);
  2162.                 if (buffer != null && buffer.Length > 1 && recent.Length > 0 && recent[0] > '\u0060' && recent[0] < '\u007B') {
  2163.                     buffer = buffer.Substring(0, 1) + buffer.Substring(1).ToLower();
  2164.                 }
  2165.                 stringBuilder.Append(buffer);
  2166.                 buffer = recent;
  2167.             }
  2168.             if (buffer != null && buffer.Length > 1 && recent.Length > 0 && recent[0] > '\u0060' && recent[0] < '\u007B') {
  2169.                 buffer = buffer.Substring(0, 1) + buffer.Substring(1).ToLower();
  2170.             }
  2171.             stringBuilder.Append(buffer);
  2172.             List<char> charList = new List<char>(stringBuilder.Length);
  2173.             foreach (char c in stringBuilder.ToString().ToCharArray()) {
  2174.                 switch (conversionOptions) {
  2175.                     case ConversionOptions.SafePath:
  2176.                         if (Path.GetInvalidPathChars().Contains(c)) {
  2177.                             if (charList.Count > 0 && charList[charList.Count - 1] != replacingChar) {
  2178.                                 charList.Add(replacingChar);
  2179.                             }
  2180.                         } else {
  2181.                             charList.Add(c);
  2182.                         }
  2183.                         break;
  2184.                     case ConversionOptions.SafeFileName:
  2185.                         if (Path.GetInvalidFileNameChars().Contains(c)) {
  2186.                             if (charList.Count > 0 && charList[charList.Count - 1] != replacingChar) {
  2187.                                 charList.Add(replacingChar);
  2188.                             }
  2189.                         } else {
  2190.                             charList.Add(c);
  2191.                         }
  2192.                         break;
  2193.                     case ConversionOptions.Alphanumeric:
  2194.                         if (c > '\u002F' && c < '\u003A' || c > '\u0040' && c < '\u005B' || c > '\u0060' && c < '\u007B') {
  2195.                             charList.Add(c);
  2196.                         } else if (charList.Count > 0 && charList[charList.Count - 1] != replacingChar) {
  2197.                             charList.Add(replacingChar);
  2198.                         }
  2199.                         break;
  2200.                     default:
  2201.                         charList.Add(c);
  2202.                         break;
  2203.                 }
  2204.             }
  2205.             if (charList.Count > 0 && charList[charList.Count - 1] == replacingChar) {
  2206.                 charList.RemoveAt(charList.Count - 1);
  2207.             }
  2208.             if (charList.Count > 0 && charList[0] == replacingChar) {
  2209.                 charList.RemoveAt(0);
  2210.             }
  2211.             return new string(charList.ToArray());
  2212.         }
  2213.  
  2214.         /// <summary>
  2215.         /// Converts the provided string to the corresponding ASCII string
  2216.         /// according to the pronunciation in the associated language with
  2217.         /// English notation in mind. Symbolic characters are converted based on
  2218.         /// their meaning or appearance. Unknown characters and some known
  2219.         /// characters are replaced with an empty string and removed. The output
  2220.         /// string can contain all printable ASCII characters.
  2221.         /// </summary>
  2222.         /// <param name="str">String to convert.</param>
  2223.         /// <param name="encoding">Input encoding.</param>
  2224.         /// <returns>Output string.</returns>
  2225.         public static string Convert(string str, Encoding encoding) => Convert(str, encoding, ConversionOptions.Full);
  2226.  
  2227.         /// <summary>
  2228.         /// Conversion options.
  2229.         /// </summary>
  2230.         public enum ConversionOptions {
  2231.             ///<summary>
  2232.             ///Conversion to all possible printable ASCII characters.
  2233.             ///</summary>
  2234.             Full,
  2235.             ///<summary>
  2236.             ///Conversion to ASCII without invalid path characters.
  2237.             ///</summary>
  2238.             SafePath,
  2239.             ///<summary>
  2240.             ///Conversion to ASCII without invalid file name characters.
  2241.             ///</summary>
  2242.             SafeFileName,
  2243.             ///<summary>
  2244.             ///Conversion to alphanumeric-only ASCII characters (including
  2245.             ///underscore).
  2246.             ///</summary>
  2247.             Alphanumeric
  2248.         }
  2249.     }
  2250. }
  2251.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement