none
Stripping diacriticals from string?

    Question

  • Is there a .Net string method that will strip diacriticals from strings? That is, what can I replace ToNoDiacriticals with to get the following to work:

    string foreign = "Białowieża";
    if (foreign.ToNoDiacriticals().Equals("Bialowieza"))
        System.Console.Writeln("Works!");
    Tuesday, January 02, 2007 10:05 PM

Answers

  • Actually, String.Normalize is the recommended equivalent of FoldString in .NET 2.0.  As long as you agree with what it considers diacriticals it will do what you want.

    The results of FoldString depend on what NLS table is currently loaded--which means it will result in different conversions depending on the computer that runs it.

    A bit more research yielded:

        static string RemoveDiacritics(string stIn) {
          string stFormD = stIn.Normalize(NormalizationForm.FormD);
          StringBuilder sb = new StringBuilder();

          for(int ich = 0; ich < stFormD.Length; ich++) {
            UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
            if(uc != UnicodeCategory.NonSpacingMark) {
              sb.Append(stFormD[ich]);
            }
          }

          return(sb.ToString());
        }
    From https://blogs.gotdotnet.com/michkap/archive/2005/02/19/376617.aspx

    Friday, January 05, 2007 5:28 PM
    Moderator

All replies

  • Using String.Normalize() might be a fruitful avenue...
    Wednesday, January 03, 2007 12:12 AM
    Moderator
  • What you're asking for is called diacritical folding.  As far as I know there's nothing in the framework that does that sort of thing.  You'll have to do it manually.  There's some information on the individual folding of characters here: http://unicode.org/reports/tr30/datafiles/DiacriticFolding.txt, which includes more than just latin character folding.  With a quick regular expression search and replace I came up with this (VERY LONG):

        /// <summary>

        /// Perform diacritical folding on a string to convert accented characters

        /// and characters with diacritical marks to base latin characters.

        /// </summary>

        /// <revision date="3-Jan-07" author="Peter Ritchie">Published to MSDN Forums</revision>

        /// <param name="source">String to fold</param>

        /// <returns>Folded string.</returns>

        private static String FoldDiacriticals(String source)

        {

            System.Text.StringBuilder sb = new System.Text.StringBuilder();

            foreach (char letter in source)

            {

                switch (letter)

                {

                    case '\u00C0':

                        sb.Append('\u0041');

                        break; //  À → A    LATIN CAPITAL LETTER A WITH GRAVE → LATIN CAPITAL LETTER A

                    case '\u00C1':

                        sb.Append('\u0041');

                        break; //  Á → A    LATIN CAPITAL LETTER A WITH ACUTE → LATIN CAPITAL LETTER A

                    case '\u00C2':

                        sb.Append('\u0041');

                        break; //  Â → A    LATIN CAPITAL LETTER A WITH CIRCUMFLEX → LATIN CAPITAL LETTER A

                    case '\u00C3':

                        sb.Append('\u0041');

                        break; //  Ã → A    LATIN CAPITAL LETTER A WITH TILDE → LATIN CAPITAL LETTER A

                    case '\u00C4':

                        sb.Append('\u0041');

                        break; //  Ä → A    LATIN CAPITAL LETTER A WITH DIAERESIS → LATIN CAPITAL LETTER A

                    case '\u00C5':

                        sb.Append('\u0041');

                        break; //  Å → A    LATIN CAPITAL LETTER A WITH RING ABOVE → LATIN CAPITAL LETTER A

                    case '\u0100':

                        sb.Append('\u0041');

                        break; //  Ā → A    LATIN CAPITAL LETTER A WITH MACRON → LATIN CAPITAL LETTER A

                    case '\u0102':

                        sb.Append('\u0041');

                        break; //  Ă → A    LATIN CAPITAL LETTER A WITH BREVE → LATIN CAPITAL LETTER A

                    case '\u0104':

                        sb.Append('\u0041');

                        break; //  Ą → A    LATIN CAPITAL LETTER A WITH OGONEK → LATIN CAPITAL LETTER A

                    case '\u01CD':

                        sb.Append('\u0041');

                        break; //  Ǎ → A    LATIN CAPITAL LETTER A WITH CARON → LATIN CAPITAL LETTER A

                    case '\u01DE':

                        sb.Append('\u0041');

                        break; //  Ǟ → A    LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON → LATIN CAPITAL LETTER A

                    case '\u01E0':

                        sb.Append('\u0041');

                        break; //  Ǡ → A    LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON → LATIN CAPITAL LETTER A

                    case '\u01FA':

                        sb.Append('\u0041');

                        break; //  Ǻ → A    LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE → LATIN CAPITAL LETTER A

                    case '\u0200':

                        sb.Append('\u0041');

                        break; //  Ȁ → A    LATIN CAPITAL LETTER A WITH DOUBLE GRAVE → LATIN CAPITAL LETTER A

                    case '\u0202':

                        sb.Append('\u0041');

                        break; //  Ȃ → A    LATIN CAPITAL LETTER A WITH INVERTED BREVE → LATIN CAPITAL LETTER A

                    case '\u0226':

                        sb.Append('\u0041');

                        break; //  Ȧ → A    LATIN CAPITAL LETTER A WITH DOT ABOVE → LATIN CAPITAL LETTER A

                    case '\u1E00':

                        sb.Append('\u0041');

                        break; //  Ḁ → A    LATIN CAPITAL LETTER A WITH RING BELOW → LATIN CAPITAL LETTER A

                    case '\u1EA0':

                        sb.Append('\u0041');

                        break; //  Ạ → A    LATIN CAPITAL LETTER A WITH DOT BELOW → LATIN CAPITAL LETTER A

                    case '\u1EA2':

                        sb.Append('\u0041');

                        break; //  Ả → A    LATIN CAPITAL LETTER A WITH HOOK ABOVE → LATIN CAPITAL LETTER A

                    case '\u1EA4':

                        sb.Append('\u0041');

                        break; //  Ấ → A    LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE → LATIN CAPITAL LETTER A

                    case '\u1EA6':

                        sb.Append('\u0041');

                        break; //  Ầ → A    LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE → LATIN CAPITAL LETTER A

                    case '\u1EA8':

                        sb.Append('\u0041');

                        break; //  Ẩ → A    LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE → LATIN CAPITAL LETTER A

                    case '\u1EAA':

                        sb.Append('\u0041');

                        break; //  Ẫ → A    LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE → LATIN CAPITAL LETTER A

                    case '\u1EAC':

                        sb.Append('\u0041');

                        break; //  Ậ → A    LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW → LATIN CAPITAL LETTER A

                    case '\u1EAE':

                        sb.Append('\u0041');

                        break; //  Ắ → A    LATIN CAPITAL LETTER A WITH BREVE AND ACUTE → LATIN CAPITAL LETTER A

                    case '\u1EB0':

                        sb.Append('\u0041');

                        break; //  Ằ → A    LATIN CAPITAL LETTER A WITH BREVE AND GRAVE → LATIN CAPITAL LETTER A

                    case '\u1EB2':

                        sb.Append('\u0041');

                        break; //  Ẳ → A    LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE → LATIN CAPITAL LETTER A

                    case '\u1EB4':

                        sb.Append('\u0041');

                        break; //  Ẵ → A    LATIN CAPITAL LETTER A WITH BREVE AND TILDE → LATIN CAPITAL LETTER A

                    case '\u1EB6':

                        sb.Append('\u0041');

                        break; //  Ặ → A    LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW → LATIN CAPITAL LETTER A

                    case '\u0181':

                        sb.Append('\u0042');

                        break; //  Ɓ → B    LATIN CAPITAL LETTER B WITH HOOK → LATIN CAPITAL LETTER B

                    case '\u0182':

                        sb.Append('\u0042');

                        break; //  Ƃ → B    LATIN CAPITAL LETTER B WITH TOPBAR → LATIN CAPITAL LETTER B

                    case '\u1E02':

                        sb.Append('\u0042');

                        break; //  Ḃ → B    LATIN CAPITAL LETTER B WITH DOT ABOVE → LATIN CAPITAL LETTER B

                    case '\u1E04':

                        sb.Append('\u0042');

                        break; //  Ḅ → B    LATIN CAPITAL LETTER B WITH DOT BELOW → LATIN CAPITAL LETTER B

                    case '\u1E06':

                        sb.Append('\u0042');

                        break; //  Ḇ → B    LATIN CAPITAL LETTER B WITH LINE BELOW → LATIN CAPITAL LETTER B

                    case '\u00C7':

                        sb.Append('\u0043');

                        break; //  Ç → C    LATIN CAPITAL LETTER C WITH CEDILLA → LATIN CAPITAL LETTER C

                    case '\u0106':

                        sb.Append('\u0043');

                        break; //  Ć → C    LATIN CAPITAL LETTER C WITH ACUTE → LATIN CAPITAL LETTER C

                    case '\u0108':

                        sb.Append('\u0043');

                        break; //  Ĉ → C    LATIN CAPITAL LETTER C WITH CIRCUMFLEX → LATIN CAPITAL LETTER C

                    case '\u010A':

                        sb.Append('\u0043');

                        break; //  Ċ → C    LATIN CAPITAL LETTER C WITH DOT ABOVE → LATIN CAPITAL LETTER C

                    case '\u010C':

                        sb.Append('\u0043');

                        break; //  Č → C    LATIN CAPITAL LETTER C WITH CARON → LATIN CAPITAL LETTER C

                    case '\u0187':

                        sb.Append('\u0043');

                        break; //  Ƈ → C    LATIN CAPITAL LETTER C WITH HOOK → LATIN CAPITAL LETTER C

                    case '\u1E08':

                        sb.Append('\u0043');

                        break; //  Ḉ → C    LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE → LATIN CAPITAL LETTER C

                    case '\u010E':

                        sb.Append('\u0044');

                        break; //  Ď → D    LATIN CAPITAL LETTER D WITH CARON → LATIN CAPITAL LETTER D

                    case '\u0110':

                        sb.Append('\u0044');

                        break; //  Đ → D    LATIN CAPITAL LETTER D WITH STROKE → LATIN CAPITAL LETTER D

                    case '\u018A':

                        sb.Append('\u0044');

                        break; //  Ɗ → D    LATIN CAPITAL LETTER D WITH HOOK → LATIN CAPITAL LETTER D

                    case '\u018B':

                        sb.Append('\u0044');

                        break; //  Ƌ → D    LATIN CAPITAL LETTER D WITH TOPBAR → LATIN CAPITAL LETTER D

                    case '\u1E0A':

                        sb.Append('\u0044');

                        break; //  Ḋ → D    LATIN CAPITAL LETTER D WITH DOT ABOVE → LATIN CAPITAL LETTER D

                    case '\u1E0C':

                        sb.Append('\u0044');

                        break; //  Ḍ → D    LATIN CAPITAL LETTER D WITH DOT BELOW → LATIN CAPITAL LETTER D

                    case '\u1E0E':

                        sb.Append('\u0044');

                        break; //  Ḏ → D    LATIN CAPITAL LETTER D WITH LINE BELOW → LATIN CAPITAL LETTER D

                    case '\u1E10':

                        sb.Append('\u0044');

                        break; //  Ḑ → D    LATIN CAPITAL LETTER D WITH CEDILLA → LATIN CAPITAL LETTER D

                    case '\u1E12':

                        sb.Append('\u0044');

                        break; //  Ḓ → D    LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW → LATIN CAPITAL LETTER D

                    case '\u00C8':

                        sb.Append('\u0045');

                        break; //  È → E    LATIN CAPITAL LETTER E WITH GRAVE → LATIN CAPITAL LETTER E

                    case '\u00C9':

                        sb.Append('\u0045');

                        break; //  É → E    LATIN CAPITAL LETTER E WITH ACUTE → LATIN CAPITAL LETTER E

                    case '\u00CA':

                        sb.Append('\u0045');

                        break; //  Ê → E    LATIN CAPITAL LETTER E WITH CIRCUMFLEX → LATIN CAPITAL LETTER E

                    case '\u00CB':

                        sb.Append('\u0045');

                        break; //  Ë → E    LATIN CAPITAL LETTER E WITH DIAERESIS → LATIN CAPITAL LETTER E

                    case '\u0112':

                        sb.Append('\u0045');

                        break; //  Ē → E    LATIN CAPITAL LETTER E WITH MACRON → LATIN CAPITAL LETTER E

                    case '\u0114':

                        sb.Append('\u0045');

                        break; //  Ĕ → E    LATIN CAPITAL LETTER E WITH BREVE → LATIN CAPITAL LETTER E

                    case '\u0116':

                        sb.Append('\u0045');

                        break; //  Ė → E    LATIN CAPITAL LETTER E WITH DOT ABOVE → LATIN CAPITAL LETTER E

                    case '\u0118':

                        sb.Append('\u0045');

                        break; //  Ę → E    LATIN CAPITAL LETTER E WITH OGONEK → LATIN CAPITAL LETTER E

                    case '\u011A':

                        sb.Append('\u0045');

                        break; //  Ě → E    LATIN CAPITAL LETTER E WITH CARON → LATIN CAPITAL LETTER E

                    case '\u0204':

                        sb.Append('\u0045');

                        break; //  Ȅ → E    LATIN CAPITAL LETTER E WITH DOUBLE GRAVE → LATIN CAPITAL LETTER E

                    case '\u0206':

                        sb.Append('\u0045');

                        break; //  Ȇ → E    LATIN CAPITAL LETTER E WITH INVERTED BREVE → LATIN CAPITAL LETTER E

                    case '\u0228':

                        sb.Append('\u0045');

                        break; //  Ȩ → E    LATIN CAPITAL LETTER E WITH CEDILLA → LATIN CAPITAL LETTER E

                    case '\u1E14':

                        sb.Append('\u0045');

                        break; //  Ḕ → E    LATIN CAPITAL LETTER E WITH MACRON AND GRAVE → LATIN CAPITAL LETTER E

                    case '\u1E16':

                        sb.Append('\u0045');

                        break; //  Ḗ → E    LATIN CAPITAL LETTER E WITH MACRON AND ACUTE → LATIN CAPITAL LETTER E

                    case '\u1E18':

                        sb.Append('\u0045');

                        break; //  Ḙ → E    LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW → LATIN CAPITAL LETTER E

                    case '\u1E1A':

                        sb.Append('\u0045');

                        break; //  Ḛ → E    LATIN CAPITAL LETTER E WITH TILDE BELOW → LATIN CAPITAL LETTER E

                    case '\u1E1C':

                        sb.Append('\u0045');

                        break; //  Ḝ → E    LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE → LATIN CAPITAL LETTER E

                    case '\u1EB8':

                        sb.Append('\u0045');

                        break; //  Ẹ → E    LATIN CAPITAL LETTER E WITH DOT BELOW → LATIN CAPITAL LETTER E

                    case '\u1EBA':

                        sb.Append('\u0045');

                        break; //  Ẻ → E    LATIN CAPITAL LETTER E WITH HOOK ABOVE → LATIN CAPITAL LETTER E

                    case '\u1EBC':

                        sb.Append('\u0045');

                        break; //  Ẽ → E    LATIN CAPITAL LETTER E WITH TILDE → LATIN CAPITAL LETTER E

                    case '\u1EBE':

                        sb.Append('\u0045');

                        break; //  Ế → E    LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE → LATIN CAPITAL LETTER E

                    case '\u1EC0':

                        sb.Append('\u0045');

                        break; //  Ề → E    LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE → LATIN CAPITAL LETTER E

                    case '\u1EC2':

                        sb.Append('\u0045');

                        break; //  Ể → E    LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE → LATIN CAPITAL LETTER E

                    case '\u1EC4':

                        sb.Append('\u0045');

                        break; //  Ễ → E    LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE → LATIN CAPITAL LETTER E

                    case '\u1EC6':

                        sb.Append('\u0045');

                        break; //  Ệ → E    LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW → LATIN CAPITAL LETTER E

                    case '\u0191':

                        sb.Append('\u0046');

                        break; //  Ƒ → F    LATIN CAPITAL LETTER F WITH HOOK → LATIN CAPITAL LETTER F

                    case '\u1E1E':

                        sb.Append('\u0046');

                        break; //  Ḟ → F    LATIN CAPITAL LETTER F WITH DOT ABOVE → LATIN CAPITAL LETTER F

                    case '\u011C':

                        sb.Append('\u0047');

                        break; //  Ĝ → G    LATIN CAPITAL LETTER G WITH CIRCUMFLEX → LATIN CAPITAL LETTER G

                    case '\u011E':

                        sb.Append('\u0047');

                        break; //  Ğ → G    LATIN CAPITAL LETTER G WITH BREVE → LATIN CAPITAL LETTER G

                    case '\u0120':

                        sb.Append('\u0047');

                        break; //  Ġ → G    LATIN CAPITAL LETTER G WITH DOT ABOVE → LATIN CAPITAL LETTER G

                    case '\u0122':

                        sb.Append('\u0047');

                        break; //  Ģ → G    LATIN CAPITAL LETTER G WITH CEDILLA → LATIN CAPITAL LETTER G

                    case '\u0193':

                        sb.Append('\u0047');

                        break; //  Ɠ → G    LATIN CAPITAL LETTER G WITH HOOK → LATIN CAPITAL LETTER G

                    case '\u01E4':

                        sb.Append('\u0047');

                        break; //  Ǥ → G    LATIN CAPITAL LETTER G WITH STROKE → LATIN CAPITAL LETTER G

                    case '\u01E6':

                        sb.Append('\u0047');

                        break; //  Ǧ → G    LATIN CAPITAL LETTER G WITH CARON → LATIN CAPITAL LETTER G

                    case '\u01F4':

                        sb.Append('\u0047');

                        break; //  Ǵ → G    LATIN CAPITAL LETTER G WITH ACUTE → LATIN CAPITAL LETTER G

                    case '\u1E20':

                        sb.Append('\u0047');

                        break; //  Ḡ → G    LATIN CAPITAL LETTER G WITH MACRON → LATIN CAPITAL LETTER G

                    case '\u0124':

                        sb.Append('\u0048');

                        break; //  Ĥ → H    LATIN CAPITAL LETTER H WITH CIRCUMFLEX → LATIN CAPITAL LETTER H

                    case '\u0126':

                        sb.Append('\u0048');

                        break; //  Ħ → H    LATIN CAPITAL LETTER H WITH STROKE → LATIN CAPITAL LETTER H

                    case '\u021E':

                        sb.Append('\u0048');

                        break; //  Ȟ → H    LATIN CAPITAL LETTER H WITH CARON → LATIN CAPITAL LETTER H

                    case '\u1E22':

                        sb.Append('\u0048');

                        break; //  Ḣ → H    LATIN CAPITAL LETTER H WITH DOT ABOVE → LATIN CAPITAL LETTER H

                    case '\u1E24':

                        sb.Append('\u0048');

                        break; //  Ḥ → H    LATIN CAPITAL LETTER H WITH DOT BELOW → LATIN CAPITAL LETTER H

                    case '\u1E26':

                        sb.Append('\u0048');

                        break; //  Ḧ → H    LATIN CAPITAL LETTER H WITH DIAERESIS → LATIN CAPITAL LETTER H

                    case '\u1E28':

                        sb.Append('\u0048');

                        break; //  Ḩ → H    LATIN CAPITAL LETTER H WITH CEDILLA → LATIN CAPITAL LETTER H

                    case '\u1E2A':

                        sb.Append('\u0048');

                        break; //  Ḫ → H    LATIN CAPITAL LETTER H WITH BREVE BELOW → LATIN CAPITAL LETTER H

                    case '\u00CC':

                        sb.Append('\u0049');

                        break; //  Ì → I    LATIN CAPITAL LETTER I WITH GRAVE → LATIN CAPITAL LETTER I

                    case '\u00CD':

                        sb.Append('\u0049');

                        break; //  Í → I    LATIN CAPITAL LETTER I WITH ACUTE → LATIN CAPITAL LETTER I

                    case '\u00CE':

                        sb.Append('\u0049');

                        break; //  Î → I    LATIN CAPITAL LETTER I WITH CIRCUMFLEX → LATIN CAPITAL LETTER I

                    case '\u00CF':

                        sb.Append('\u0049');

                        break; //  Ï → I    LATIN CAPITAL LETTER I WITH DIAERESIS → LATIN CAPITAL LETTER I

                    case '\u0128':

                        sb.Append('\u0049');

                        break; //  Ĩ → I    LATIN CAPITAL LETTER I WITH TILDE → LATIN CAPITAL LETTER I

                    case '\u012A':

                        sb.Append('\u0049');

                        break; //  Ī → I    LATIN CAPITAL LETTER I WITH MACRON → LATIN CAPITAL LETTER I

                    case '\u012C':

                        sb.Append('\u0049');

                        break; //  Ĭ → I    LATIN CAPITAL LETTER I WITH BREVE → LATIN CAPITAL LETTER I

                    case '\u012E':

                        sb.Append('\u0049');

                        break; //  Į → I    LATIN CAPITAL LETTER I WITH OGONEK → LATIN CAPITAL LETTER I

                    case '\u0130':

                        sb.Append('\u0049');

                        break; //  İ → I    LATIN CAPITAL LETTER I WITH DOT ABOVE → LATIN CAPITAL LETTER I

                    case '\u0197':

                        sb.Append('\u0049');

                        break; //  Ɨ → I    LATIN CAPITAL LETTER I WITH STROKE → LATIN CAPITAL LETTER I

                    case '\u01CF':

                        sb.Append('\u0049');

                        break; //  Ǐ → I    LATIN CAPITAL LETTER I WITH CARON → LATIN CAPITAL LETTER I

                    case '\u0208':

                        sb.Append('\u0049');

                        break; //  Ȉ → I    LATIN CAPITAL LETTER I WITH DOUBLE GRAVE → LATIN CAPITAL LETTER I

                    case '\u020A':

                        sb.Append('\u0049');

                        break; //  Ȋ → I    LATIN CAPITAL LETTER I WITH INVERTED BREVE → LATIN CAPITAL LETTER I

                    case '\u1E2C':

                        sb.Append('\u0049');

                        break; //  Ḭ → I    LATIN CAPITAL LETTER I WITH TILDE BELOW → LATIN CAPITAL LETTER I

                    case '\u1E2E':

                        sb.Append('\u0049');

                        break; //  Ḯ → I    LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE → LATIN CAPITAL LETTER I

                    case '\u1EC8':

                        sb.Append('\u0049');

                        break; //  Ỉ → I    LATIN CAPITAL LETTER I WITH HOOK ABOVE → LATIN CAPITAL LETTER I

                    case '\u1ECA':

                        sb.Append('\u0049');

                        break; //  Ị → I    LATIN CAPITAL LETTER I WITH DOT BELOW → LATIN CAPITAL LETTER I

                    case '\u0134':

                        sb.Append('\u004A');

                        break; //  Ĵ → J    LATIN CAPITAL LETTER J WITH CIRCUMFLEX → LATIN CAPITAL LETTER J

                    case '\u0136':

                        sb.Append('\u004B');

                        break; //  Ķ → K    LATIN CAPITAL LETTER K WITH CEDILLA → LATIN CAPITAL LETTER K

                    case '\u0198':

                        sb.Append('\u004B');

                        break; //  Ƙ → K    LATIN CAPITAL LETTER K WITH HOOK → LATIN CAPITAL LETTER K

                    case '\u01E8':

                        sb.Append('\u004B');

                        break; //  Ǩ → K    LATIN CAPITAL LETTER K WITH CARON → LATIN CAPITAL LETTER K

                    case '\u1E30':

                        sb.Append('\u004B');

                        break; //  Ḱ → K    LATIN CAPITAL LETTER K WITH ACUTE → LATIN CAPITAL LETTER K

                    case '\u1E32':

                        sb.Append('\u004B');

                        break; //  Ḳ → K    LATIN CAPITAL LETTER K WITH DOT BELOW → LATIN CAPITAL LETTER K

                    case '\u1E34':

                        sb.Append('\u004B');

                        break; //  Ḵ → K    LATIN CAPITAL LETTER K WITH LINE BELOW → LATIN CAPITAL LETTER K

                    case '\u0139':

                        sb.Append('\u004C');

                        break; //  Ĺ → L    LATIN CAPITAL LETTER L WITH ACUTE → LATIN CAPITAL LETTER L

                    case '\u013B':

                        sb.Append('\u004C');

                        break; //  Ļ → L    LATIN CAPITAL LETTER L WITH CEDILLA → LATIN CAPITAL LETTER L

                    case '\u013D':

                        sb.Append('\u004C');

                        break; //  Ľ → L    LATIN CAPITAL LETTER L WITH CARON → LATIN CAPITAL LETTER L

                    case '\u0141':

                        sb.Append('\u004C');

                        break; //  Ł → L    LATIN CAPITAL LETTER L WITH STROKE → LATIN CAPITAL LETTER L

                    case '\u1E36':

                        sb.Append('\u004C');

                        break; //  Ḷ → L    LATIN CAPITAL LETTER L WITH DOT BELOW → LATIN CAPITAL LETTER L

                    case '\u1E38':

                        sb.Append('\u004C');

                        break; //  Ḹ → L    LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON → LATIN CAPITAL LETTER L

                    case '\u1E3A':

                        sb.Append('\u004C');

                        break; //  Ḻ → L    LATIN CAPITAL LETTER L WITH LINE BELOW → LATIN CAPITAL LETTER L

                    case '\u1E3C':

                        sb.Append('\u004C');

                        break; //  Ḽ → L    LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW → LATIN CAPITAL LETTER L

                    case '\u1E3E':

                        sb.Append('\u004D');

                        break; //  Ḿ → M    LATIN CAPITAL LETTER M WITH ACUTE → LATIN CAPITAL LETTER M

                    case '\u1E40':

                        sb.Append('\u004D');

                        break; //  Ṁ → M    LATIN CAPITAL LETTER M WITH DOT ABOVE → LATIN CAPITAL LETTER M

                    case '\u1E42':

                        sb.Append('\u004D');

                        break; //  Ṃ → M    LATIN CAPITAL LETTER M WITH DOT BELOW → LATIN CAPITAL LETTER M

                    case '\u00D1':

                        sb.Append('\u004E');

                        break; //  Ñ → N    LATIN CAPITAL LETTER N WITH TILDE → LATIN CAPITAL LETTER N

                    case '\u0143':

                        sb.Append('\u004E');

                        break; //  Ń → N    LATIN CAPITAL LETTER N WITH ACUTE → LATIN CAPITAL LETTER N

                    case '\u0145':

                        sb.Append('\u004E');

                        break; //  Ņ → N    LATIN CAPITAL LETTER N WITH CEDILLA → LATIN CAPITAL LETTER N

                    case '\u0147':

                        sb.Append('\u004E');

                        break; //  Ň → N    LATIN CAPITAL LETTER N WITH CARON → LATIN CAPITAL LETTER N

                    case '\u019D':

                        sb.Append('\u004E');

                        break; //  Ɲ → N    LATIN CAPITAL LETTER N WITH LEFT HOOK → LATIN CAPITAL LETTER N

                    case '\u01F8':

                        sb.Append('\u004E');

                        break; //  Ǹ → N    LATIN CAPITAL LETTER N WITH GRAVE → LATIN CAPITAL LETTER N

                    case '\u0220':

                        sb.Append('\u004E');

                        break; //  Ƞ → N    LATIN CAPITAL LETTER N WITH LONG RIGHT LEG → LATIN CAPITAL LETTER N

                    case '\u1E44':

                        sb.Append('\u004E');

                        break; //  Ṅ → N    LATIN CAPITAL LETTER N WITH DOT ABOVE → LATIN CAPITAL LETTER N

                    case '\u1E46':

                        sb.Append('\u004E');

                        break; //  Ṇ → N    LATIN CAPITAL LETTER N WITH DOT BELOW → LATIN CAPITAL LETTER N

                    case '\u1E48':

                        sb.Append('\u004E');

                        break; //  Ṉ → N    LATIN CAPITAL LETTER N WITH LINE BELOW → LATIN CAPITAL LETTER N

                    case '\u1E4A':

                        sb.Append('\u004E');

                        break; //  Ṋ → N    LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW → LATIN CAPITAL LETTER N

                    case '\u00D2':

                        sb.Append('\u004F');

                        break; //  Ò → O    LATIN CAPITAL LETTER O WITH GRAVE → LATIN CAPITAL LETTER O

                    case '\u00D3':

                        sb.Append('\u004F');

                        break; //  Ó → O    LATIN CAPITAL LETTER O WITH ACUTE → LATIN CAPITAL LETTER O

                    case '\u00D4':

                        sb.Append('\u004F');

                        break; //  Ô → O    LATIN CAPITAL LETTER O WITH CIRCUMFLEX → LATIN CAPITAL LETTER O

                    case '\u00D5':

                        sb.Append('\u004F');

                        break; //  Õ → O    LATIN CAPITAL LETTER O WITH TILDE → LATIN CAPITAL LETTER O

                    case '\u00D6':

                        sb.Append('\u004F');

                        break; //  Ö → O    LATIN CAPITAL LETTER O WITH DIAERESIS → LATIN CAPITAL LETTER O

                    case '\u00D8':

                        sb.Append('\u004F');

                        break; //  Ø → O    LATIN CAPITAL LETTER O WITH STROKE → LATIN CAPITAL LETTER O

                    case '\u014C':

                        sb.Append('\u004F');

                        break; //  Ō → O    LATIN CAPITAL LETTER O WITH MACRON → LATIN CAPITAL LETTER O

                    case '\u014E':

                        sb.Append('\u004F');

                        break; //  Ŏ → O    LATIN CAPITAL LETTER O WITH BREVE → LATIN CAPITAL LETTER O

                    case '\u0150':

                        sb.Append('\u004F');

                        break; //  Ő → O    LATIN CAPITAL LETTER O WITH DOUBLE ACUTE → LATIN CAPITAL LETTER O

                    case '\u019F':

                        sb.Append('\u004F');

                        break; //  Ɵ → O    LATIN CAPITAL LETTER O WITH MIDDLE TILDE → LATIN CAPITAL LETTER O

                    case '\u01A0':

                        sb.Append('\u004F');

                        break; //  Ơ → O    LATIN CAPITAL LETTER O WITH HORN → LATIN CAPITAL LETTER O

                    case '\u01D1':

                        sb.Append('\u004F');

                        break; //  Ǒ → O    LATIN CAPITAL LETTER O WITH CARON → LATIN CAPITAL LETTER O

                    case '\u01EA':

                        sb.Append('\u004F');

                        break; //  Ǫ → O    LATIN CAPITAL LETTER O WITH OGONEK → LATIN CAPITAL LETTER O

                    case '\u01EC':

                        sb.Append('\u004F');

                        break; //  Ǭ → O    LATIN CAPITAL LETTER O WITH OGONEK AND MACRON → LATIN CAPITAL LETTER O

                    case '\u01FE':

                        sb.Append('\u004F');

                        break; //  Ǿ → O    LATIN CAPITAL LETTER O WITH STROKE AND ACUTE → LATIN CAPITAL LETTER O

                    case '\u020C':

                        sb.Append('\u004F');

                        break; //  Ȍ → O    LATIN CAPITAL LETTER O WITH DOUBLE GRAVE → LATIN CAPITAL LETTER O

                    case '\u020E':

                        sb.Append('\u004F');

                        break; //  Ȏ → O    LATIN CAPITAL LETTER O WITH INVERTED BREVE → LATIN CAPITAL LETTER O

                    case '\u022A':

                        sb.Append('\u004F');

                        break; //  Ȫ → O    LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON → LATIN CAPITAL LETTER O

                    case '\u022C':

                        sb.Append('\u004F');

                        break; //  Ȭ → O    LATIN CAPITAL LETTER O WITH TILDE AND MACRON → LATIN CAPITAL LETTER O

                    case '\u022E':

                        sb.Append('\u004F');

                        break; //  Ȯ → O    LATIN CAPITAL LETTER O WITH DOT ABOVE → LATIN CAPITAL LETTER O

                    case '\u0230':

                        sb.Append('\u004F');

                        break; //  Ȱ → O    LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON → LATIN CAPITAL LETTER O

                    case '\u1E4C':

                        sb.Append('\u004F');

                        break; //  Ṍ → O    LATIN CAPITAL LETTER O WITH TILDE AND ACUTE → LATIN CAPITAL LETTER O

                    case '\u1E4E':

                        sb.Append('\u004F');

                        break; //  Ṏ → O    LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS → LATIN CAPITAL LETTER O

                    case '\u1E50':

                        sb.Append('\u004F');

                        break; //  Ṑ → O    LATIN CAPITAL LETTER O WITH MACRON AND GRAVE → LATIN CAPITAL LETTER O

                    case '\u1E52':

                        sb.Append('\u004F');

                        break; //  Ṓ → O    LATIN CAPITAL LETTER O WITH MACRON AND ACUTE → LATIN CAPITAL LETTER O

                    case '\u1ECC':

                        sb.Append('\u004F');

                        break; //  Ọ → O    LATIN CAPITAL LETTER O WITH DOT BELOW → LATIN CAPITAL LETTER O

                    case '\u1ECE':

                        sb.Append('\u004F');

                        break; //  Ỏ → O    LATIN CAPITAL LETTER O WITH HOOK ABOVE → LATIN CAPITAL LETTER O

                    case '\u1ED0':

                        sb.Append('\u004F');

                        break; //  Ố → O    LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE → LATIN CAPITAL LETTER O

                    case '\u1ED2':

                        sb.Append('\u004F');

                        break; //  Ồ → O    LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE → LATIN CAPITAL LETTER O

                    case '\u1ED4':

                        sb.Append('\u004F');

                        break; //  Ổ → O    LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE → LATIN CAPITAL LETTER O

                    case '\u1ED6':

                        sb.Append('\u004F');

                        break; //  Ỗ → O    LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE → LATIN CAPITAL LETTER O

                    case '\u1ED8':

                        sb.Append('\u004F');

                        break; //  Ộ → O    LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW → LATIN CAPITAL LETTER O

                    case '\u1EDA':

                        sb.Append('\u004F');

                        break; //  Ớ → O    LATIN CAPITAL LETTER O WITH HORN AND ACUTE → LATIN CAPITAL LETTER O

                    case '\u1EDC':

                        sb.Append('\u004F');

                        break; //  Ờ → O    LATIN CAPITAL LETTER O WITH HORN AND GRAVE → LATIN CAPITAL LETTER O

                    case '\u1EDE':

                        sb.Append('\u004F');

                        break; //  Ở → O    LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE → LATIN CAPITAL LETTER O

                    case '\u1EE0':

                        sb.Append('\u004F');

                        break; //  Ỡ → O    LATIN CAPITAL LETTER O WITH HORN AND TILDE → LATIN CAPITAL LETTER O

                    case '\u1EE2':

                        sb.Append('\u004F');

                        break; //  Ợ → O    LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW → LATIN CAPITAL LETTER O

                    case '\u01A4':

                        sb.Append('\u0050');

                        break; //  Ƥ → P    LATIN CAPITAL LETTER P WITH HOOK → LATIN CAPITAL LETTER P

                    case '\u1E54':

                        sb.Append('\u0050');

                        break; //  Ṕ → P    LATIN CAPITAL LETTER P WITH ACUTE → LATIN CAPITAL LETTER P

                    case '\u1E56':

                        sb.Append('\u0050');

                        break; //  Ṗ → P    LATIN CAPITAL LETTER P WITH DOT ABOVE → LATIN CAPITAL LETTER P

                    case '\u0154':

                        sb.Append('\u0052');

                        break; //  Ŕ → R    LATIN CAPITAL LETTER R WITH ACUTE → LATIN CAPITAL LETTER R

                    case '\u0156':

                        sb.Append('\u0052');

                        break; //  Ŗ → R    LATIN CAPITAL LETTER R WITH CEDILLA → LATIN CAPITAL LETTER R

                    case '\u0158':

                        sb.Append('\u0052');

                        break; //  Ř → R    LATIN CAPITAL LETTER R WITH CARON → LATIN CAPITAL LETTER R

                    case '\u0210':

                        sb.Append('\u0052');

                        break; //  Ȑ → R    LATIN CAPITAL LETTER R WITH DOUBLE GRAVE → LATIN CAPITAL LETTER R

                    case '\u0212':

                        sb.Append('\u0052');

                        break; //  Ȓ → R    LATIN CAPITAL LETTER R WITH INVERTED BREVE → LATIN CAPITAL LETTER R

                    case '\u1E58':

                        sb.Append('\u0052');

                        break; //  Ṙ → R    LATIN CAPITAL LETTER R WITH DOT ABOVE → LATIN CAPITAL LETTER R

                    case '\u1E5A':

                        sb.Append('\u0052');

                        break; //  Ṛ → R    LATIN CAPITAL LETTER R WITH DOT BELOW → LATIN CAPITAL LETTER R

                    case '\u1E5C':

                        sb.Append('\u0052');

                        break; //  Ṝ → R    LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON → LATIN CAPITAL LETTER R

                    case '\u1E5E':

                        sb.Append('\u0052');

                        break; //  Ṟ → R    LATIN CAPITAL LETTER R WITH LINE BELOW → LATIN CAPITAL LETTER R

                    case '\u015A':

                        sb.Append('\u0053');

                        break; //  Ś → S    LATIN CAPITAL LETTER S WITH ACUTE → LATIN CAPITAL LETTER S

                    case '\u015C':

                        sb.Append('\u0053');

                        break; //  Ŝ → S    LATIN CAPITAL LETTER S WITH CIRCUMFLEX → LATIN CAPITAL LETTER S

                    case '\u015E':

                        sb.Append('\u0053');

                        break; //  Ş → S    LATIN CAPITAL LETTER S WITH CEDILLA → LATIN CAPITAL LETTER S

                    case '\u0160':

                        sb.Append('\u0053');

                        break; //  Š → S    LATIN CAPITAL LETTER S WITH CARON → LATIN CAPITAL LETTER S

                    case '\u0218':

                        sb.Append('\u0053');

                        break; //  Ș → S    LATIN CAPITAL LETTER S WITH COMMA BELOW → LATIN CAPITAL LETTER S

                    case '\u1E60':

                        sb.Append('\u0053');

                        break; //  Ṡ → S    LATIN CAPITAL LETTER S WITH DOT ABOVE → LATIN CAPITAL LETTER S

                    case '\u1E62':

                        sb.Append('\u0053');

                        break; //  Ṣ → S    LATIN CAPITAL LETTER S WITH DOT BELOW → LATIN CAPITAL LETTER S

                    case '\u1E64':

                        sb.Append('\u0053');

                        break; //  Ṥ → S    LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE → LATIN CAPITAL LETTER S

                    case '\u1E66':

                        sb.Append('\u0053');

                        break; //  Ṧ → S    LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE → LATIN CAPITAL LETTER S

                    case '\u1E68':

                        sb.Append('\u0053');

                        break; //  Ṩ → S    LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE → LATIN CAPITAL LETTER S

                    case '\u0162':

                        sb.Append('\u0054');

                        break; //  Ţ → T    LATIN CAPITAL LETTER T WITH CEDILLA → LATIN CAPITAL LETTER T

                    case '\u0164':

                        sb.Append('\u0054');

                        break; //  Ť → T    LATIN CAPITAL LETTER T WITH CARON → LATIN CAPITAL LETTER T

                    case '\u0166':

                        sb.Append('\u0054');

                        break; //  Ŧ → T    LATIN CAPITAL LETTER T WITH STROKE → LATIN CAPITAL LETTER T

                    case '\u01AC':

                        sb.Append('\u0054');

                        break; //  Ƭ → T    LATIN CAPITAL LETTER T WITH HOOK → LATIN CAPITAL LETTER T

                    case '\u01AE':

                        sb.Append('\u0054');

                        break; //  Ʈ → T    LATIN CAPITAL LETTER T WITH RETROFLEX HOOK → LATIN CAPITAL LETTER T

                    case '\u021A':

                        sb.Append('\u0054');

                        break; //  Ț → T    LATIN CAPITAL LETTER T WITH COMMA BELOW → LATIN CAPITAL LETTER T

                    case '\u1E6A':

                        sb.Append('\u0054');

                        break; //  Ṫ → T    LATIN CAPITAL LETTER T WITH DOT ABOVE → LATIN CAPITAL LETTER T

                    case '\u1E6C':

                        sb.Append('\u0054');

                        break; //  Ṭ → T    LATIN CAPITAL LETTER T WITH DOT BELOW → LATIN CAPITAL LETTER T

                    case '\u1E6E':

                        sb.Append('\u0054');

                        break; //  Ṯ → T    LATIN CAPITAL LETTER T WITH LINE BELOW → LATIN CAPITAL LETTER T

                    case '\u1E70':

                        sb.Append('\u0054');

                        break; //  Ṱ → T    LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW → LATIN CAPITAL LETTER T

                    case '\u00D9':

                        sb.Append('\u0055');

                        break; //  Ù → U    LATIN CAPITAL LETTER U WITH GRAVE → LATIN CAPITAL LETTER U

                    case '\u00DA':

                        sb.Append('\u0055');

                        break; //  Ú → U    LATIN CAPITAL LETTER U WITH ACUTE → LATIN CAPITAL LETTER U

                    case '\u00DB':

                        sb.Append('\u0055');

                        break; //  Û → U    LATIN CAPITAL LETTER U WITH CIRCUMFLEX → LATIN CAPITAL LETTER U

                    case '\u00DC':

                        sb.Append('\u0055');

                        break; //  Ü → U    LATIN CAPITAL LETTER U WITH DIAERESIS → LATIN CAPITAL LETTER U

                    case '\u0168':

                        sb.Append('\u0055');

                        break; //  Ũ → U    LATIN CAPITAL LETTER U WITH TILDE → LATIN CAPITAL LETTER U

                    case '\u016A':

                        sb.Append('\u0055');

                        break; //  Ū → U    LATIN CAPITAL LETTER U WITH MACRON → LATIN CAPITAL LETTER U

                    case '\u016C':

                        sb.Append('\u0055');

                        break; //  Ŭ → U    LATIN CAPITAL LETTER U WITH BREVE → LATIN CAPITAL LETTER U

                    case '\u016E':

                        sb.Append('\u0055');

                        break; //  Ů → U    LATIN CAPITAL LETTER U WITH RING ABOVE → LATIN CAPITAL LETTER U

                    case '\u0170':

                        sb.Append('\u0055');

                        break; //  Ű → U    LATIN CAPITAL LETTER U WITH DOUBLE ACUTE → LATIN CAPITAL LETTER U

                    case '\u0172':

                        sb.Append('\u0055');

                        break; //  Ų → U    LATIN CAPITAL LETTER U WITH OGONEK → LATIN CAPITAL LETTER U

                    case '\u01AF':

                        sb.Append('\u0055');

                        break; //  Ư → U    LATIN CAPITAL LETTER U WITH HORN → LATIN CAPITAL LETTER U

                    case '\u01D3':

                        sb.Append('\u0055');

                        break; //  Ǔ → U    LATIN CAPITAL LETTER U WITH CARON → LATIN CAPITAL LETTER U

                    case '\u01D5':

                        sb.Append('\u0055');

                        break; //  Ǖ → U    LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON → LATIN CAPITAL LETTER U

                    case '\u01D7':

                        sb.Append('\u0055');

                        break; //  Ǘ → U    LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE → LATIN CAPITAL LETTER U

                    case '\u01D9':

                        sb.Append('\u0055');

                        break; //  Ǚ → U    LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON → LATIN CAPITAL LETTER U

                    case '\u01DB':

                        sb.Append('\u0055');

                        break; //  Ǜ → U    LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE → LATIN CAPITAL LETTER U

                    case '\u0214':

                        sb.Append('\u0055');

                        break; //  Ȕ → U    LATIN CAPITAL LETTER U WITH DOUBLE GRAVE → LATIN CAPITAL LETTER U

                    case '\u0216':

                        sb.Append('\u0055');

                        break; //  Ȗ → U    LATIN CAPITAL LETTER U WITH INVERTED BREVE → LATIN CAPITAL LETTER U

                    case '\u1E72':

                        sb.Append('\u0055');

                        break; //  Ṳ → U    LATIN CAPITAL LETTER U WITH DIAERESIS BELOW → LATIN CAPITAL LETTER U

                    case '\u1E74':

                        sb.Append('\u0055');

                        break; //  Ṵ → U    LATIN CAPITAL LETTER U WITH TILDE BELOW → LATIN CAPITAL LETTER U

                    case '\u1E76':

                        sb.Append('\u0055');

                        break; //  Ṷ → U    LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW → LATIN CAPITAL LETTER U

                    case '\u1E78':

                        sb.Append('\u0055');

                        break; //  Ṹ → U    LATIN CAPITAL LETTER U WITH TILDE AND ACUTE → LATIN CAPITAL LETTER U

                    case '\u1E7A':

                        sb.Append('\u0055');

                        break; //  Ṻ → U    LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS → LATIN CAPITAL LETTER U

                    case '\u1EE4':

                        sb.Append('\u0055');

                        break; //  Ụ → U    LATIN CAPITAL LETTER U WITH DOT BELOW → LATIN CAPITAL LETTER U

                    case '\u1EE6':

                        sb.Append('\u0055');

                        break; //  Ủ → U    LATIN CAPITAL LETTER U WITH HOOK ABOVE → LATIN CAPITAL LETTER U

                    case '\u1EE8':

                        sb.Append('\u0055');

                        break; //  Ứ → U    LATIN CAPITAL LETTER U WITH HORN AND ACUTE → LATIN CAPITAL LETTER U

                    case '\u1EEA':

                        sb.Append('\u0055');

                        break; //  Ừ → U    LATIN CAPITAL LETTER U WITH HORN AND GRAVE → LATIN CAPITAL LETTER U

                    case '\u1EEC':

                        sb.Append('\u0055');

                        break; //  Ử → U    LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE → LATIN CAPITAL LETTER U

                    case '\u1EEE':

                        sb.Append('\u0055');

                        break; //  Ữ → U    LATIN CAPITAL LETTER U WITH HORN AND TILDE → LATIN CAPITAL LETTER U

                    case '\u1EF0':

                        sb.Append('\u0055');

                        break; //  Ự → U    LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW → LATIN CAPITAL LETTER U

                    case '\u01B2':

                        sb.Append('\u0056');

                        break; //  Ʋ → V    LATIN CAPITAL LETTER V WITH HOOK → LATIN CAPITAL LETTER V

                    case '\u1E7C':

                        sb.Append('\u0056');

                        break; //  Ṽ → V    LATIN CAPITAL LETTER V WITH TILDE → LATIN CAPITAL LETTER V

                    case '\u1E7E':

                        sb.Append('\u0056');

                        break; //  Ṿ → V    LATIN CAPITAL LETTER V WITH DOT BELOW → LATIN CAPITAL LETTER V

                    case '\u0174':

                        sb.Append('\u0057');

                        break; //  Ŵ → W    LATIN CAPITAL LETTER W WITH CIRCUMFLEX → LATIN CAPITAL LETTER W

                    case '\u1E80':

                        sb.Append('\u0057');

                        break; //  Ẁ → W    LATIN CAPITAL LETTER W WITH GRAVE → LATIN CAPITAL LETTER W

                    case '\u1E82':

                        sb.Append('\u0057');

                        break; //  Ẃ → W    LATIN CAPITAL LETTER W WITH ACUTE → LATIN CAPITAL LETTER W

                    case '\u1E84':

                        sb.Append('\u0057');

                        break; //  Ẅ → W    LATIN CAPITAL LETTER W WITH DIAERESIS → LATIN CAPITAL LETTER W

                    case '\u1E86':

                        sb.Append('\u0057');

                        break; //  Ẇ → W    LATIN CAPITAL LETTER W WITH DOT ABOVE → LATIN CAPITAL LETTER W

                    case '\u1E88':

                        sb.Append('\u0057');

                        break; //  Ẉ → W    LATIN CAPITAL LETTER W WITH DOT BELOW → LATIN CAPITAL LETTER W

                    case '\u1E8A':

                        sb.Append('\u0058');

                        break; //  Ẋ → X    LATIN CAPITAL LETTER X WITH DOT ABOVE → LATIN CAPITAL LETTER X

                    case '\u1E8C':

                        sb.Append('\u0058');

                        break; //  Ẍ → X    LATIN CAPITAL LETTER X WITH DIAERESIS → LATIN CAPITAL LETTER X

                    case '\u00DD':

                        sb.Append('\u0059');

                        break; //  Ý → Y    LATIN CAPITAL LETTER Y WITH ACUTE → LATIN CAPITAL LETTER Y

                    case '\u0176':

                        sb.Append('\u0059');

                        break; //  Ŷ → Y    LATIN CAPITAL LETTER Y WITH CIRCUMFLEX → LATIN CAPITAL LETTER Y

                    case '\u0178':

                        sb.Append('\u0059');

                        break; //  Ÿ → Y    LATIN CAPITAL LETTER Y WITH DIAERESIS → LATIN CAPITAL LETTER Y

                    case '\u01B3':

                        sb.Append('\u0059');

                        break; //  Ƴ → Y    LATIN CAPITAL LETTER Y WITH HOOK → LATIN CAPITAL LETTER Y

                    case '\u0232':

                        sb.Append('\u0059');

                        break; //  Ȳ → Y    LATIN CAPITAL LETTER Y WITH MACRON → LATIN CAPITAL LETTER Y

                    case '\u1E8E':

                        sb.Append('\u0059');

                        break; //  Ẏ → Y    LATIN CAPITAL LETTER Y WITH DOT ABOVE → LATIN CAPITAL LETTER Y

                    case '\u1EF2':

                        sb.Append('\u0059');

                        break; //  Ỳ → Y    LATIN CAPITAL LETTER Y WITH GRAVE → LATIN CAPITAL LETTER Y

                    case '\u1EF4':

                        sb.Append('\u0059');

                        break; //  Ỵ → Y    LATIN CAPITAL LETTER Y WITH DOT BELOW → LATIN CAPITAL LETTER Y

                    case '\u1EF6':

                        sb.Append('\u0059');

                        break; //  Ỷ → Y    LATIN CAPITAL LETTER Y WITH HOOK ABOVE → LATIN CAPITAL LETTER Y

                    case '\u1EF8':

                        sb.Append('\u0059');

                        break; //  Ỹ → Y    LATIN CAPITAL LETTER Y WITH TILDE → LATIN CAPITAL LETTER Y

                    case '\u0179':

                        sb.Append('\u005A');

                        break; //  Ź → Z    LATIN CAPITAL LETTER Z WITH ACUTE → LATIN CAPITAL LETTER Z

                    case '\u017B':

                        sb.Append('\u005A');

                        break; //  Ż → Z    LATIN CAPITAL LETTER Z WITH DOT ABOVE → LATIN CAPITAL LETTER Z

                    case '\u017D':

                        sb.Append('\u005A');

                        break; //  Ž → Z    LATIN CAPITAL LETTER Z WITH CARON → LATIN CAPITAL LETTER Z

                    case '\u01B5':

                        sb.Append('\u005A');

                        break; //  Ƶ → Z    LATIN CAPITAL LETTER Z WITH STROKE → LATIN CAPITAL LETTER Z

                    case '\u0224':

                        sb.Append('\u005A');

                        break; //  Ȥ → Z    LATIN CAPITAL LETTER Z WITH HOOK → LATIN CAPITAL LETTER Z

                    case '\u1E90':

                        sb.Append('\u005A');

                        break; //  Ẑ → Z    LATIN CAPITAL LETTER Z WITH CIRCUMFLEX → LATIN CAPITAL LETTER Z

                    case '\u1E92':

                        sb.Append('\u005A');

                        break; //  Ẓ → Z    LATIN CAPITAL LETTER Z WITH DOT BELOW → LATIN CAPITAL LETTER Z

                    case '\u1E94':

                        sb.Append('\u005A');

                        break; //  Ẕ → Z    LATIN CAPITAL LETTER Z WITH LINE BELOW → LATIN CAPITAL LETTER Z

                    case '\u00E0':

                        sb.Append('\u0061');

                        break; //  à → a    LATIN SMALL LETTER A WITH GRAVE → LATIN SMALL LETTER A

                    case '\u00E1':

                        sb.Append('\u0061');

                        break; //  á → a    LATIN SMALL LETTER A WITH ACUTE → LATIN SMALL LETTER A

                    case '\u00E2':

                        sb.Append('\u0061');

                        break; //  â → a    LATIN SMALL LETTER A WITH CIRCUMFLEX → LATIN SMALL LETTER A

                    case '\u00E3':

                        sb.Append('\u0061');

                        break; //  ã → a    LATIN SMALL LETTER A WITH TILDE → LATIN SMALL LETTER A

                    case '\u00E4':

                        sb.Append('\u0061');

                        break; //  ä → a    LATIN SMALL LETTER A WITH DIAERESIS → LATIN SMALL LETTER A

                    case '\u00E5':

                        sb.Append('\u0061');

                        break; //  å → a    LATIN SMALL LETTER A WITH RING ABOVE → LATIN SMALL LETTER A

                    case '\u0101':

                        sb.Append('\u0061');

                        break; //  ā → a    LATIN SMALL LETTER A WITH MACRON → LATIN SMALL LETTER A

                    case '\u0103':

                        sb.Append('\u0061');

                        break; //  ă → a    LATIN SMALL LETTER A WITH BREVE → LATIN SMALL LETTER A

                    case '\u0105':

                        sb.Append('\u0061');

                        break; //  ą → a    LATIN SMALL LETTER A WITH OGONEK → LATIN SMALL LETTER A

                    case '\u01CE':

                        sb.Append('\u0061');

                        break; //  ǎ → a    LATIN SMALL LETTER A WITH CARON → LATIN SMALL LETTER A

                    case '\u01DF':

                        sb.Append('\u0061');

                        break; //  ǟ → a    LATIN SMALL LETTER A WITH DIAERESIS AND MACRON → LATIN SMALL LETTER A

                    case '\u01E1':

                        sb.Append('\u0061');

                        break; //  ǡ → a    LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON → LATIN SMALL LETTER A

                    case '\u01FB':

                        sb.Append('\u0061');

                        break; //  ǻ → a    LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE → LATIN SMALL LETTER A

                    case '\u0201':

                        sb.Append('\u0061');

                        break; //  ȁ → a    LATIN SMALL LETTER A WITH DOUBLE GRAVE → LATIN SMALL LETTER A

                    case '\u0203':

                        sb.Append('\u0061');

                        break; //  ȃ → a    LATIN SMALL LETTER A WITH INVERTED BREVE → LATIN SMALL LETTER A

                    case '\u0227':

                        sb.Append('\u0061');

                        break; //  ȧ → a    LATIN SMALL LETTER A WITH DOT ABOVE → LATIN SMALL LETTER A

                    case '\u1E01':

                        sb.Append('\u0061');

                        break; //  ḁ → a    LATIN SMALL LETTER A WITH RING BELOW → LATIN SMALL LETTER A

                    case '\u1E9A':

                        sb.Append('\u0061');

                        break; //  ẚ → a    LATIN SMALL LETTER A WITH RIGHT HALF RING → LATIN SMALL LETTER A

                    case '\u1EA1':

                        sb.Append('\u0061');

                        break; //  ạ → a    LATIN SMALL LETTER A WITH DOT BELOW → LATIN SMALL LETTER A

                    case '\u1EA3':

                        sb.Append('\u0061');

                        break; //  ả → a    LATIN SMALL LETTER A WITH HOOK ABOVE → LATIN SMALL LETTER A

                    case '\u1EA5':

                        sb.Append('\u0061');

                        break; //  ấ → a    LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE → LATIN SMALL LETTER A

                    case '\u1EA7':

                        sb.Append('\u0061');

                        break; //  ầ → a    LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE → LATIN SMALL LETTER A

                    case '\u1EA9':

                        sb.Append('\u0061');

                        break; //  ẩ → a    LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE → LATIN SMALL LETTER A

                    case '\u1EAB':

                        sb.Append('\u0061');

                        break; //  ẫ → a    LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE → LATIN SMALL LETTER A

                    case '\u1EAD':

                        sb.Append('\u0061');

                        break; //  ậ → a    LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW → LATIN SMALL LETTER A

                    case '\u1EAF':

                        sb.Append('\u0061');

                        break; //  ắ → a    LATIN SMALL LETTER A WITH BREVE AND ACUTE → LATIN SMALL LETTER A

                    case '\u1EB1':

                        sb.Append('\u0061');

                        break; //  ằ → a    LATIN SMALL LETTER A WITH BREVE AND GRAVE → LATIN SMALL LETTER A

                    case '\u1EB3':

                        sb.Append('\u0061');

                        break; //  ẳ → a    LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE → LATIN SMALL LETTER A

                    case '\u1EB5':

                        sb.Append('\u0061');

                        break; //  ẵ → a    LATIN SMALL LETTER A WITH BREVE AND TILDE → LATIN SMALL LETTER A

                    case '\u1EB7':

                        sb.Append('\u0061');

                        break; //  ặ → a    LATIN SMALL LETTER A WITH BREVE AND DOT BELOW → LATIN SMALL LETTER A

                    case '\u0180':

                        sb.Append('\u0062');

                        break; //  ƀ → b    LATIN SMALL LETTER B WITH STROKE → LATIN SMALL LETTER B

                    case '\u0183':

                        sb.Append('\u0062');

                        break; //  ƃ → b    LATIN SMALL LETTER B WITH TOPBAR → LATIN SMALL LETTER B

                    case '\u0253':

                        sb.Append('\u0062');

                        break; //  ɓ → b    LATIN SMALL LETTER B WITH HOOK → LATIN SMALL LETTER B

                    case '\u1E03':

                        sb.Append('\u0062');

                        break; //  ḃ → b    LATIN SMALL LETTER B WITH DOT ABOVE → LATIN SMALL LETTER B

                    case '\u1E05':

                        sb.Append('\u0062');

                        break; //  ḅ → b    LATIN SMALL LETTER B WITH DOT BELOW → LATIN SMALL LETTER B

                    case '\u1E07':

                        sb.Append('\u0062');

                        break; //  ḇ → b    LATIN SMALL LETTER B WITH LINE BELOW → LATIN SMALL LETTER B

                    case '\u00E7':

                        sb.Append('\u0063');

                        break; //  ç → c    LATIN SMALL LETTER C WITH CEDILLA → LATIN SMALL LETTER C

                    case '\u0107':

                        sb.Append('\u0063');

                        break; //  ć → c    LATIN SMALL LETTER C WITH ACUTE → LATIN SMALL LETTER C

                    case '\u0109':

                        sb.Append('\u0063');

                        break; //  ĉ → c    LATIN SMALL LETTER C WITH CIRCUMFLEX → LATIN SMALL LETTER C

                    case '\u010B':

                        sb.Append('\u0063');

                        break; //  ċ → c    LATIN SMALL LETTER C WITH DOT ABOVE → LATIN SMALL LETTER C

                    case '\u010D':

                        sb.Append('\u0063');

                        break; //  č → c    LATIN SMALL LETTER C WITH CARON → LATIN SMALL LETTER C

                    case '\u0188':

                        sb.Append('\u0063');

                        break; //  ƈ → c    LATIN SMALL LETTER C WITH HOOK → LATIN SMALL LETTER C

                    case '\u0255':

                        sb.Append('\u0063');

                        break; //  ɕ → c    LATIN SMALL LETTER C WITH CURL → LATIN SMALL LETTER C

                    case '\u1E09':

                        sb.Append('\u0063');

                        break; //  ḉ → c    LATIN SMALL LETTER C WITH CEDILLA AND ACUTE → LATIN SMALL LETTER C

                    case '\u010F':

                        sb.Append('\u0064');

                        break; //  ď → d    LATIN SMALL LETTER D WITH CARON → LATIN SMALL LETTER D

                    case '\u0111':

                        sb.Append('\u0064');

                        break; //  đ → d    LATIN SMALL LETTER D WITH STROKE → LATIN SMALL LETTER D

                    case '\u018C':

                        sb.Append('\u0064');

                        break; //  ƌ → d    LATIN SMALL LETTER D WITH TOPBAR → LATIN SMALL LETTER D

                    case '\u0221':

                        sb.Append('\u0064');

                        break; //  ȡ → d    LATIN SMALL LETTER D WITH CURL → LATIN SMALL LETTER D

                    case '\u0256':

                        sb.Append('\u0064');

                        break; //  ɖ → d    LATIN SMALL LETTER D WITH TAIL → LATIN SMALL LETTER D

                    case '\u0257':

                        sb.Append('\u0064');

                        break; //  ɗ → d    LATIN SMALL LETTER D WITH HOOK → LATIN SMALL LETTER D

                    case '\u1E0B':

                        sb.Append('\u0064');

                        break; //  ḋ → d    LATIN SMALL LETTER D WITH DOT ABOVE → LATIN SMALL LETTER D

                    case '\u1E0D':

                        sb.Append('\u0064');

                        break; //  ḍ → d    LATIN SMALL LETTER D WITH DOT BELOW → LATIN SMALL LETTER D

                    case '\u1E0F':

                        sb.Append('\u0064');

                        break; //  ḏ → d    LATIN SMALL LETTER D WITH LINE BELOW → LATIN SMALL LETTER D

                    case '\u1E11':

                        sb.Append('\u0064');

                        break; //  ḑ → d    LATIN SMALL LETTER D WITH CEDILLA → LATIN SMALL LETTER D

                    case '\u1E13':

                        sb.Append('\u0064');

                        break; //  ḓ → d    LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW → LATIN SMALL LETTER D

                    case '\u00E8':

                        sb.Append('\u0065');

                        break; //  è → e    LATIN SMALL LETTER E WITH GRAVE → LATIN SMALL LETTER E

                    case '\u00E9':

                        sb.Append('\u0065');

                        break; //  é → e    LATIN SMALL LETTER E WITH ACUTE → LATIN SMALL LETTER E

                    case '\u00EA':

                        sb.Append('\u0065');

                        break; //  ê → e    LATIN SMALL LETTER E WITH CIRCUMFLEX → LATIN SMALL LETTER E

                    case '\u00EB':

                        sb.Append('\u0065');

                        break; //  ë → e    LATIN SMALL LETTER E WITH DIAERESIS → LATIN SMALL LETTER E

                    case '\u0113':

                        sb.Append('\u0065');

                        break; //  ē → e    LATIN SMALL LETTER E WITH MACRON → LATIN SMALL LETTER E

                    case '\u0115':

                        sb.Append('\u0065');

                        break; //  ĕ → e    LATIN SMALL LETTER E WITH BREVE → LATIN SMALL LETTER E

                    case '\u0117':

                        sb.Append('\u0065');

                        break; //  ė → e    LATIN SMALL LETTER E WITH DOT ABOVE → LATIN SMALL LETTER E

                    case '\u0119':

                        sb.Append('\u0065');

                        break; //  ę → e    LATIN SMALL LETTER E WITH OGONEK → LATIN SMALL LETTER E

                    case '\u011B':

                        sb.Append('\u0065');

                        break; //  ě → e    LATIN SMALL LETTER E WITH CARON → LATIN SMALL LETTER E

                    case '\u0205':

                        sb.Append('\u0065');

                        break; //  ȅ → e    LATIN SMALL LETTER E WITH DOUBLE GRAVE → LATIN SMALL LETTER E

                    case '\u0207':

                        sb.Append('\u0065');

                        break; //  ȇ → e    LATIN SMALL LETTER E WITH INVERTED BREVE → LATIN SMALL LETTER E

                    case '\u0229':

                        sb.Append('\u0065');

                        break; //  ȩ → e    LATIN SMALL LETTER E WITH CEDILLA → LATIN SMALL LETTER E

                    case '\u1E15':

                        sb.Append('\u0065');

                        break; //  ḕ → e    LATIN SMALL LETTER E WITH MACRON AND GRAVE → LATIN SMALL LETTER E

                    case '\u1E17':

                        sb.Append('\u0065');

                        break; //  ḗ → e    LATIN SMALL LETTER E WITH MACRON AND ACUTE → LATIN SMALL LETTER E

                    case '\u1E19':

                        sb.Append('\u0065');

                        break; //  ḙ → e    LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW → LATIN SMALL LETTER E

                    case '\u1E1B':

                        sb.Append('\u0065');

                        break; //  ḛ → e    LATIN SMALL LETTER E WITH TILDE BELOW → LATIN SMALL LETTER E

                    case '\u1E1D':

                        sb.Append('\u0065');

                        break; //  ḝ → e    LATIN SMALL LETTER E WITH CEDILLA AND BREVE → LATIN SMALL LETTER E

                    case '\u1EB9':

                        sb.Append('\u0065');

                        break; //  ẹ → e    LATIN SMALL LETTER E WITH DOT BELOW → LATIN SMALL LETTER E

                    case '\u1EBB':

                        sb.Append('\u0065');

                        break; //  ẻ → e    LATIN SMALL LETTER E WITH HOOK ABOVE → LATIN SMALL LETTER E

                    case '\u1EBD':

                        sb.Append('\u0065');

                        break; //  ẽ → e    LATIN SMALL LETTER E WITH TILDE → LATIN SMALL LETTER E

                    case '\u1EBF':

                        sb.Append('\u0065');

                        break; //  ế → e    LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE → LATIN SMALL LETTER E

                    case '\u1EC1':

                        sb.Append('\u0065');

                        break; //  ề → e    LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE → LATIN SMALL LETTER E

                    case '\u1EC3':

                        sb.Append('\u0065');

                        break; //  ể → e    LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE → LATIN SMALL LETTER E

                    case '\u1EC5':

                        sb.Append('\u0065');

                        break; //  ễ → e    LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE → LATIN SMALL LETTER E

                    case '\u1EC7':

                        sb.Append('\u0065');

                        break; //  ệ → e    LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW → LATIN SMALL LETTER E

                    case '\u0192':

                        sb.Append('\u0066');

                        break; //  ƒ → f    LATIN SMALL LETTER F WITH HOOK → LATIN SMALL LETTER F

                    case '\u1E1F':

                        sb.Append('\u0066');

                        break; //  ḟ → f    LATIN SMALL LETTER F WITH DOT ABOVE → LATIN SMALL LETTER F

                    case '\u011D':

                        sb.Append('\u0067');

                        break; //  ĝ → g    LATIN SMALL LETTER G WITH CIRCUMFLEX → LATIN SMALL LETTER G

                    case '\u011F':

                        sb.Append('\u0067');

                        break; //  ğ → g    LATIN SMALL LETTER G WITH BREVE → LATIN SMALL LETTER G

                    case '\u0121':

                        sb.Append('\u0067');

                        break; //  ġ → g    LATIN SMALL LETTER G WITH DOT ABOVE → LATIN SMALL LETTER G

                    case '\u0123':

                        sb.Append('\u0067');

                        break; //  ģ → g    LATIN SMALL LETTER G WITH CEDILLA → LATIN SMALL LETTER G

                    case '\u01E5':

                        sb.Append('\u0067');

                        break; //  ǥ → g    LATIN SMALL LETTER G WITH STROKE → LATIN SMALL LETTER G

                    case '\u01E7':

                        sb.Append('\u0067');

                        break; //  ǧ → g    LATIN SMALL LETTER G WITH CARON → LATIN SMALL LETTER G

                    case '\u01F5':

                        sb.Append('\u0067');

                        break; //  ǵ → g    LATIN SMALL LETTER G WITH ACUTE → LATIN SMALL LETTER G

                    case '\u0260':

                        sb.Append('\u0067');

                        break; //  ɠ → g    LATIN SMALL LETTER G WITH HOOK → LATIN SMALL LETTER G

                    case '\u1E21':

                        sb.Append('\u0067');

                        break; //  ḡ → g    LATIN SMALL LETTER G WITH MACRON → LATIN SMALL LETTER G

                    case '\u0125':

                        sb.Append('\u0068');

                        break; //  ĥ → h    LATIN SMALL LETTER H WITH CIRCUMFLEX → LATIN SMALL LETTER H

                    case '\u0127':

                        sb.Append('\u0068');

                        break; //  ħ → h    LATIN SMALL LETTER H WITH STROKE → LATIN SMALL LETTER H

                    case '\u021F':

                        sb.Append('\u0068');

                        break; //  ȟ → h    LATIN SMALL LETTER H WITH CARON → LATIN SMALL LETTER H

                    case '\u0266':

                        sb.Append('\u0068');

                        break; //  ɦ → h    LATIN SMALL LETTER H WITH HOOK → LATIN SMALL LETTER H

                    case '\u1E23':

                        sb.Append('\u0068');

                        break; //  ḣ → h    LATIN SMALL LETTER H WITH DOT ABOVE → LATIN SMALL LETTER H

                    case '\u1E25':

                        sb.Append('\u0068');

                        break; //  ḥ → h    LATIN SMALL LETTER H WITH DOT BELOW → LATIN SMALL LETTER H

                    case '\u1E27':

                        sb.Append('\u0068');

                        break; //  ḧ → h    LATIN SMALL LETTER H WITH DIAERESIS → LATIN SMALL LETTER H

                    case '\u1E29':

                        sb.Append('\u0068');

                        break; //  ḩ → h    LATIN SMALL LETTER H WITH CEDILLA → LATIN SMALL LETTER H

                    case '\u1E2B':

                        sb.Append('\u0068');

                        break; //  ḫ → h    LATIN SMALL LETTER H WITH BREVE BELOW → LATIN SMALL LETTER H

                    case '\u1E96':

                        sb.Append('\u0068');

                        break; //  ẖ → h    LATIN SMALL LETTER H WITH LINE BELOW → LATIN SMALL LETTER H

                    case '\u00EC':

                        sb.Append('\u0069');

                        break; //  ì → i    LATIN SMALL LETTER I WITH GRAVE → LATIN SMALL LETTER I

                    case '\u00ED':

                        sb.Append('\u0069');

                        break; //  í → i    LATIN SMALL LETTER I WITH ACUTE → LATIN SMALL LETTER I

                    case '\u00EE':

                        sb.Append('\u0069');

                        break; //  î → i    LATIN SMALL LETTER I WITH CIRCUMFLEX → LATIN SMALL LETTER I

                    case '\u00EF':

                        sb.Append('\u0069');

                        break; //  ï → i    LATIN SMALL LETTER I WITH DIAERESIS → LATIN SMALL LETTER I

                    case '\u0129':

                        sb.Append('\u0069');

                        break; //  ĩ → i    LATIN SMALL LETTER I WITH TILDE → LATIN SMALL LETTER I

                    case '\u012B':

                        sb.Append('\u0069');

                        break; //  ī → i    LATIN SMALL LETTER I WITH MACRON → LATIN SMALL LETTER I

                    case '\u012D':

                        sb.Append('\u0069');

                        break; //  ĭ → i    LATIN SMALL LETTER I WITH BREVE → LATIN SMALL LETTER I

                    case '\u012F':

                        sb.Append('\u0069');

                        break; //  į → i    LATIN SMALL LETTER I WITH OGONEK → LATIN SMALL LETTER I

                    case '\u01D0':

                        sb.Append('\u0069');

                        break; //  ǐ → i    LATIN SMALL LETTER I WITH CARON → LATIN SMALL LETTER I

                    case '\u0209':

                        sb.Append('\u0069');

                        break; //  ȉ → i    LATIN SMALL LETTER I WITH DOUBLE GRAVE → LATIN SMALL LETTER I

                    case '\u020B':

                        sb.Append('\u0069');

                        break; //  ȋ → i    LATIN SMALL LETTER I WITH INVERTED BREVE → LATIN SMALL LETTER I

                    case '\u0268':

                        sb.Append('\u0069');

                        break; //  ɨ → i    LATIN SMALL LETTER I WITH STROKE → LATIN SMALL LETTER I

                    case '\u1E2D':

                        sb.Append('\u0069');

                        break; //  ḭ → i    LATIN SMALL LETTER I WITH TILDE BELOW → LATIN SMALL LETTER I

                    case '\u1E2F':

                        sb.Append('\u0069');

                        break; //  ḯ → i    LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE → LATIN SMALL LETTER I

                    case '\u1EC9':

                        sb.Append('\u0069');

                        break; //  ỉ → i    LATIN SMALL LETTER I WITH HOOK ABOVE → LATIN SMALL LETTER I

                    case '\u1ECB':

                        sb.Append('\u0069');

                        break; //  ị → i    LATIN SMALL LETTER I WITH DOT BELOW → LATIN SMALL LETTER I

                    case '\u0135':

                        sb.Append('\u006A');

                        break; //  ĵ → j    LATIN SMALL LETTER J WITH CIRCUMFLEX → LATIN SMALL LETTER J

                    case '\u01F0':

                        sb.Append('\u006A');

                        break; //  ǰ → j    LATIN SMALL LETTER J WITH CARON → LATIN SMALL LETTER J

                    case '\u029D':

                        sb.Append('\u006A');

                        break; //  ʝ → j    LATIN SMALL LETTER J WITH CROSSED-TAIL → LATIN SMALL LETTER J

                    case '\u0137':

                        sb.Append('\u006B');

                        break; //  ķ → k    LATIN SMALL LETTER K WITH CEDILLA → LATIN SMALL LETTER K

                    case '\u0199':

                        sb.Append('\u006B');

                        break; //  ƙ → k    LATIN SMALL LETTER K WITH HOOK → LATIN SMALL LETTER K

                    case '\u01E9':

                        sb.Append('\u006B');

                        break; //  ǩ → k    LATIN SMALL LETTER K WITH CARON → LATIN SMALL LETTER K

                    case '\u1E31':

                        sb.Append('\u006B');

                        break; //  ḱ → k    LATIN SMALL LETTER K WITH ACUTE → LATIN SMALL LETTER K

                    case '\u1E33':

                        sb.Append('\u006B');

                        break; //  ḳ → k    LATIN SMALL LETTER K WITH DOT BELOW → LATIN SMALL LETTER K

                    case '\u1E35':

                        sb.Append('\u006B');

                        break; //  ḵ → k    LATIN SMALL LETTER K WITH LINE BELOW → LATIN SMALL LETTER K

                    case '\u013A':

                        sb.Append('\u006C');

                        break; //  ĺ → l    LATIN SMALL LETTER L WITH ACUTE → LATIN SMALL LETTER L

                    case '\u013C':

                        sb.Append('\u006C');

                        break; //  ļ → l    LATIN SMALL LETTER L WITH CEDILLA → LATIN SMALL LETTER L

                    case '\u013E':

                        sb.Append('\u006C');

                        break; //  ľ → l    LATIN SMALL LETTER L WITH CARON → LATIN SMALL LETTER L

                    case '\u0140':

                        sb.Append('\u006C');

                        break; //  ŀ → l    LATIN SMALL LETTER L WITH MIDDLE DOT → LATIN SMALL LETTER L

                    case '\u0142':

                        sb.Append('\u006C');

                        break; //  ł → l    LATIN SMALL LETTER L WITH STROKE → LATIN SMALL LETTER L

                    case '\u019A':

                        sb.Append('\u006C');

                        break; //  ƚ → l    LATIN SMALL LETTER L WITH BAR → LATIN SMALL LETTER L

                    case '\u0234':

                        sb.Append('\u006C');

                        break; //  ȴ → l    LATIN SMALL LETTER L WITH CURL → LATIN SMALL LETTER L

                    case '\u026B':

                        sb.Append('\u006C');

                        break; //  ɫ → l    LATIN SMALL LETTER L WITH MIDDLE TILDE → LATIN SMALL LETTER L

                    case '\u026C':

                        sb.Append('\u006C');

                        break; //  ɬ → l    LATIN SMALL LETTER L WITH BELT → LATIN SMALL LETTER L

                    case '\u026D':

                        sb.Append('\u006C');

                        break; //  ɭ → l    LATIN SMALL LETTER L WITH RETROFLEX HOOK → LATIN SMALL LETTER L

                    case '\u1E37':

                        sb.Append('\u006C');

                        break; //  ḷ → l    LATIN SMALL LETTER L WITH DOT BELOW → LATIN SMALL LETTER L

                    case '\u1E39':

                        sb.Append('\u006C');

                        break; //  ḹ → l    LATIN SMALL LETTER L WITH DOT BELOW AND MACRON → LATIN SMALL LETTER L

                    case '\u1E3B':

                        sb.Append('\u006C');

                        break; //  ḻ → l    LATIN SMALL LETTER L WITH LINE BELOW → LATIN SMALL LETTER L

                    case '\u1E3D':

                        sb.Append('\u006C');

                        break; //  ḽ → l    LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW → LATIN SMALL LETTER L

                    case '\u0271':

                        sb.Append('\u006D');

                        break; //  ɱ → m    LATIN SMALL LETTER M WITH HOOK → LATIN SMALL LETTER M

                    case '\u1E3F':

                        sb.Append('\u006D');

                        break; //  ḿ → m    LATIN SMALL LETTER M WITH ACUTE → LATIN SMALL LETTER M

                    case '\u1E41':

                        sb.Append('\u006D');

                        break; //  ṁ → m    LATIN SMALL LETTER M WITH DOT ABOVE → LATIN SMALL LETTER M

                    case '\u1E43':

                        sb.Append('\u006D');

                        break; //  ṃ → m    LATIN SMALL LETTER M WITH DOT BELOW → LATIN SMALL LETTER M

                    case '\u00F1':

                        sb.Append('\u006E');

                        break; //  ñ → n    LATIN SMALL LETTER N WITH TILDE → LATIN SMALL LETTER N

                    case '\u0144':

                        sb.Append('\u006E');

                        break; //  ń → n    LATIN SMALL LETTER N WITH ACUTE → LATIN SMALL LETTER N

                    case '\u0146':

                        sb.Append('\u006E');

                        break; //  ņ → n    LATIN SMALL LETTER N WITH CEDILLA → LATIN SMALL LETTER N

                    case '\u0148':

                        sb.Append('\u006E');

                        break; //  ň → n    LATIN SMALL LETTER N WITH CARON → LATIN SMALL LETTER N

                    case '\u019E':

                        sb.Append('\u006E');

                        break; //  ƞ → n    LATIN SMALL LETTER N WITH LONG RIGHT LEG → LATIN SMALL LETTER N

                    case '\u01F9':

                        sb.Append('\u006E');

                        break; //  ǹ → n    LATIN SMALL LETTER N WITH GRAVE → LATIN SMALL LETTER N

                    case '\u0235':

                        sb.Append('\u006E');

                        break; //  ȵ → n    LATIN SMALL LETTER N WITH CURL → LATIN SMALL LETTER N

                    case '\u0272':

                        sb.Append('\u006E');

                        break; //  ɲ → n    LATIN SMALL LETTER N WITH LEFT HOOK → LATIN SMALL LETTER N

                    case '\u0273':

                        sb.Append('\u006E');

                        break; //  ɳ → n    LATIN SMALL LETTER N WITH RETROFLEX HOOK → LATIN SMALL LETTER N

                    case '\u1E45':

                        sb.Append('\u006E');

                        break; //  ṅ → n    LATIN SMALL LETTER N WITH DOT ABOVE → LATIN SMALL LETTER N

                    case '\u1E47':

                        sb.Append('\u006E');

                        break; //  ṇ → n    LATIN SMALL LETTER N WITH DOT BELOW → LATIN SMALL LETTER N

                    case '\u1E49':

                        sb.Append('\u006E');

                        break; //  ṉ → n    LATIN SMALL LETTER N WITH LINE BELOW → LATIN SMALL LETTER N

                    case '\u1E4B':

                        sb.Append('\u006E');

                        break; //  ṋ → n    LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW → LATIN SMALL LETTER N

                    case '\u00F2':

                        sb.Append('\u006F');

                        break; //  ò → o    LATIN SMALL LETTER O WITH GRAVE → LATIN SMALL LETTER O

                    case '\u00F3':

                        sb.Append('\u006F');

                        break; //  ó → o    LATIN SMALL LETTER O WITH ACUTE → LATIN SMALL LETTER O

                    case '\u00F4':

                        sb.Append('\u006F');

                        break; //  ô → o    LATIN SMALL LETTER O WITH CIRCUMFLEX → LATIN SMALL LETTER O

                    case '\u00F5':

                        sb.Append('\u006F');

                        break; //  õ → o    LATIN SMALL LETTER O WITH TILDE → LATIN SMALL LETTER O

                    case '\u00F6':

                        sb.Append('\u006F');

                        break; //  ö → o    LATIN SMALL LETTER O WITH DIAERESIS → LATIN SMALL LETTER O

                    case '\u00F8':

                        sb.Append('\u006F');

                        break; //  ø → o    LATIN SMALL LETTER O WITH STROKE → LATIN SMALL LETTER O

                    case '\u014D':

                        sb.Append('\u006F');

                        break; //  ō → o    LATIN SMALL LETTER O WITH MACRON → LATIN SMALL LETTER O

                    case '\u014F':

                        sb.Append('\u006F');

                        break; //  ŏ → o    LATIN SMALL LETTER O WITH BREVE → LATIN SMALL LETTER O

                    case '\u0151':

                        sb.Append('\u006F');

                        break; //  ő → o    LATIN SMALL LETTER O WITH DOUBLE ACUTE → LATIN SMALL LETTER O

                    case '\u01A1':

                        sb.Append('\u006F');

                        break; //  ơ → o    LATIN SMALL LETTER O WITH HORN → LATIN SMALL LETTER O

                    case '\u01D2':

                        sb.Append('\u006F');

                        break; //  ǒ → o    LATIN SMALL LETTER O WITH CARON → LATIN SMALL LETTER O

                    case '\u01EB':

                        sb.Append('\u006F');

                        break; //  ǫ → o    LATIN SMALL LETTER O WITH OGONEK → LATIN SMALL LETTER O

                    case '\u01ED':

                        sb.Append('\u006F');

                        break; //  ǭ → o    LATIN SMALL LETTER O WITH OGONEK AND MACRON → LATIN SMALL LETTER O

                    case '\u01FF':

                        sb.Append('\u006F');

                        break; //  ǿ → o    LATIN SMALL LETTER O WITH STROKE AND ACUTE → LATIN SMALL LETTER O

                    case '\u020D':

                        sb.Append('\u006F');

                        break; //  ȍ → o    LATIN SMALL LETTER O WITH DOUBLE GRAVE → LATIN SMALL LETTER O

                    case '\u020F':

                        sb.Append('\u006F');

                        break; //  ȏ → o    LATIN SMALL LETTER O WITH INVERTED BREVE → LATIN SMALL LETTER O

                    case '\u022B':

                        sb.Append('\u006F');

                        break; //  ȫ → o    LATIN SMALL LETTER O WITH DIAERESIS AND MACRON → LATIN SMALL LETTER O

                    case '\u022D':

                        sb.Append('\u006F');

                        break; //  ȭ → o    LATIN SMALL LETTER O WITH TILDE AND MACRON → LATIN SMALL LETTER O

                    case '\u022F':

                        sb.Append('\u006F');

                        break; //  ȯ → o    LATIN SMALL LETTER O WITH DOT ABOVE → LATIN SMALL LETTER O

                    case '\u0231':

                        sb.Append('\u006F');

                        break; //  ȱ → o    LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON → LATIN SMALL LETTER O

                    case '\u1E4D':

                        sb.Append('\u006F');

                        break; //  ṍ → o    LATIN SMALL LETTER O WITH TILDE AND ACUTE → LATIN SMALL LETTER O

                    case '\u1E4F':

                        sb.Append('\u006F');

                        break; //  ṏ → o    LATIN SMALL LETTER O WITH TILDE AND DIAERESIS → LATIN SMALL LETTER O

                    case '\u1E51':

                        sb.Append('\u006F');

                        break; //  ṑ → o    LATIN SMALL LETTER O WITH MACRON AND GRAVE → LATIN SMALL LETTER O

                    case '\u1E53':

                        sb.Append('\u006F');

                        break; //  ṓ → o    LATIN SMALL LETTER O WITH MACRON AND ACUTE → LATIN SMALL LETTER O

                    case '\u1ECD':

                        sb.Append('\u006F');

                        break; //  ọ → o    LATIN SMALL LETTER O WITH DOT BELOW → LATIN SMALL LETTER O

                    case '\u1ECF':

                        sb.Append('\u006F');

                        break; //  ỏ → o    LATIN SMALL LETTER O WITH HOOK ABOVE → LATIN SMALL LETTER O

                    case '\u1ED1':

                        sb.Append('\u006F');

                        break; //  ố → o    LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE → LATIN SMALL LETTER O

                    case '\u1ED3':

                        sb.Append('\u006F');

                        break; //  ồ → o    LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE → LATIN SMALL LETTER O

                    case '\u1ED5':

                        sb.Append('\u006F');

                        break; //  ổ → o    LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE → LATIN SMALL LETTER O

                    case '\u1ED7':

                        sb.Append('\u006F');

                        break; //  ỗ → o    LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE → LATIN SMALL LETTER O

                    case '\u1ED9':

                        sb.Append('\u006F');

                        break; //  ộ → o    LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW → LATIN SMALL LETTER O

                    case '\u1EDB':

                        sb.Append('\u006F');

                        break; //  ớ → o    LATIN SMALL LETTER O WITH HORN AND ACUTE → LATIN SMALL LETTER O

                    case '\u1EDD':

                        sb.Append('\u006F');

                        break; //  ờ → o    LATIN SMALL LETTER O WITH HORN AND GRAVE → LATIN SMALL LETTER O

                    case '\u1EDF':

                        sb.Append('\u006F');

                        break; //  ở → o    LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE → LATIN SMALL LETTER O

                    case '\u1EE1':

                        sb.Append('\u006F');

                        break; //  ỡ → o    LATIN SMALL LETTER O WITH HORN AND TILDE → LATIN SMALL LETTER O

                    case '\u1EE3':

                        sb.Append('\u006F');

                        break; //  ợ → o    LATIN SMALL LETTER O WITH HORN AND DOT BELOW → LATIN SMALL LETTER O

                    case '\u01A5':

                        sb.Append('\u0070');

                        break; //  ƥ → p    LATIN SMALL LETTER P WITH HOOK → LATIN SMALL LETTER P

                    case '\u1E55':

                        sb.Append('\u0070');

                        break; //  ṕ → p    LATIN SMALL LETTER P WITH ACUTE → LATIN SMALL LETTER P

                    case '\u1E57':

                        sb.Append('\u0070');

                        break; //  ṗ → p    LATIN SMALL LETTER P WITH DOT ABOVE → LATIN SMALL LETTER P

                    case '\u02A0':

                        sb.Append('\u0071');

                        break; //  ʠ → q    LATIN SMALL LETTER Q WITH HOOK → LATIN SMALL LETTER Q

                    case '\u0155':

                        sb.Append('\u0072');

                        break; //  ŕ → r    LATIN SMALL LETTER R WITH ACUTE → LATIN SMALL LETTER R

                    case '\u0157':

                        sb.Append('\u0072');

                        break; //  ŗ → r    LATIN SMALL LETTER R WITH CEDILLA → LATIN SMALL LETTER R

                    case '\u0159':

                        sb.Append('\u0072');

                        break; //  ř → r    LATIN SMALL LETTER R WITH CARON → LATIN SMALL LETTER R

                    case '\u0211':

                        sb.Append('\u0072');

                        break; //  ȑ → r    LATIN SMALL LETTER R WITH DOUBLE GRAVE → LATIN SMALL LETTER R

                    case '\u0213':

                        sb.Append('\u0072');

                        break; //  ȓ → r    LATIN SMALL LETTER R WITH INVERTED BREVE → LATIN SMALL LETTER R

                    case '\u027C':

                        sb.Append('\u0072');

                        break; //  ɼ → r    LATIN SMALL LETTER R WITH LONG LEG → LATIN SMALL LETTER R

                    case '\u027D':

                        sb.Append('\u0072');

                        break; //  ɽ → r    LATIN SMALL LETTER R WITH TAIL → LATIN SMALL LETTER R

                    case '\u1E59':

                        sb.Append('\u0072');

                        break; //  ṙ → r    LATIN SMALL LETTER R WITH DOT ABOVE → LATIN SMALL LETTER R

                    case '\u1E5B':

                        sb.Append('\u0072');

                        break; //  ṛ → r    LATIN SMALL LETTER R WITH DOT BELOW → LATIN SMALL LETTER R

                    case '\u1E5D':

                        sb.Append('\u0072');

                        break; //  ṝ → r    LATIN SMALL LETTER R WITH DOT BELOW AND MACRON → LATIN SMALL LETTER R

                    case '\u1E5F':

                        sb.Append('\u0072');

                        break; //  ṟ → r    LATIN SMALL LETTER R WITH LINE BELOW → LATIN SMALL LETTER R

                    case '\u015B':

                        sb.Append('\u0073');

                        break; //  ś → s    LATIN SMALL LETTER S WITH ACUTE → LATIN SMALL LETTER S

                    case '\u015D':

                        sb.Append('\u0073');

                        break; //  ŝ → s    LATIN SMALL LETTER S WITH CIRCUMFLEX → LATIN SMALL LETTER S

                    case '\u015F':

                        sb.Append('\u0073');

                        break; //  ş → s    LATIN SMALL LETTER S WITH CEDILLA → LATIN SMALL LETTER S

                    case '\u0161':

                        sb.Append('\u0073');

                        break; //  š → s    LATIN SMALL LETTER S WITH CARON → LATIN SMALL LETTER S

                    case '\u0219':

                        sb.Append('\u0073');

                        break; //  ș → s    LATIN SMALL LETTER S WITH COMMA BELOW → LATIN SMALL LETTER S

                    case '\u0282':

                        sb.Append('\u0073');

                        break; //  ʂ → s    LATIN SMALL LETTER S WITH HOOK → LATIN SMALL LETTER S

                    case '\u1E61':

                        sb.Append('\u0073');

                        break; //  ṡ → s    LATIN SMALL LETTER S WITH DOT ABOVE → LATIN SMALL LETTER S

                    case '\u1E63':

                        sb.Append('\u0073');

                        break; //  ṣ → s    LATIN SMALL LETTER S WITH DOT BELOW → LATIN SMALL LETTER S

                    case '\u1E65':

                        sb.Append('\u0073');

                        break; //  ṥ → s    LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE → LATIN SMALL LETTER S

                    case '\u1E67':

                        sb.Append('\u0073');

                        break; //  ṧ → s    LATIN SMALL LETTER S WITH CARON AND DOT ABOVE → LATIN SMALL LETTER S

                    case '\u1E69':

                        sb.Append('\u0073');

                        break; //  ṩ → s    LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE → LATIN SMALL LETTER S

                    case '\u0163':

                        sb.Append('\u0074');

                        break; //  ţ → t    LATIN SMALL LETTER T WITH CEDILLA → LATIN SMALL LETTER T

                    case '\u0165':

                        sb.Append('\u0074');

                        break; //  ť → t    LATIN SMALL LETTER T WITH CARON → LATIN SMALL LETTER T

                    case '\u0167':

                        sb.Append('\u0074');

                        break; //  ŧ → t    LATIN SMALL LETTER T WITH STROKE → LATIN SMALL LETTER T

                    case '\u01AB':

                        sb.Append('\u0074');

                        break; //  ƫ → t    LATIN SMALL LETTER T WITH PALATAL HOOK → LATIN SMALL LETTER T

                    case '\u01AD':

                        sb.Append('\u0074');

                        break; //  ƭ → t    LATIN SMALL LETTER T WITH HOOK → LATIN SMALL LETTER T

                    case '\u021B':

                        sb.Append('\u0074');

                        break; //  ț → t    LATIN SMALL LETTER T WITH COMMA BELOW → LATIN SMALL LETTER T

                    case '\u0236':

                        sb.Append('\u0074');

                        break; //  ȶ → t    LATIN SMALL LETTER T WITH CURL → LATIN SMALL LETTER T

                    case '\u0288':

                        sb.Append('\u0074');

                        break; //  ʈ → t    LATIN SMALL LETTER T WITH RETROFLEX HOOK → LATIN SMALL LETTER T

                    case '\u1E6B':

                        sb.Append('\u0074');

                        break; //  ṫ → t    LATIN SMALL LETTER T WITH DOT ABOVE → LATIN SMALL LETTER T

                    case '\u1E6D':

                        sb.Append('\u0074');

                        break; //  ṭ → t    LATIN SMALL LETTER T WITH DOT BELOW → LATIN SMALL LETTER T

                    case '\u1E6F':

                        sb.Append('\u0074');

                        break; //  ṯ → t    LATIN SMALL LETTER T WITH LINE BELOW → LATIN SMALL LETTER T

                    case '\u1E71':

                        sb.Append('\u0074');

                        break; //  ṱ → t    LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW → LATIN SMALL LETTER T

                    case '\u1E97':

                        sb.Append('\u0074');

                        break; //  ẗ → t    LATIN SMALL LETTER T WITH DIAERESIS → LATIN SMALL LETTER T

                    case '\u00F9':

                        sb.Append('\u0075');

                        break; //  ù → u    LATIN SMALL LETTER U WITH GRAVE → LATIN SMALL LETTER U

                    case '\u00FA':

                        sb.Append('\u0075');

                        break; //  ú → u    LATIN SMALL LETTER U WITH ACUTE → LATIN SMALL LETTER U

                    case '\u00FB':

                        sb.Append('\u0075');

                        break; //  û → u    LATIN SMALL LETTER U WITH CIRCUMFLEX → LATIN SMALL LETTER U

                    case '\u00FC':

                        sb.Append('\u0075');

                        break; //  ü → u    LATIN SMALL LETTER U WITH DIAERESIS → LATIN SMALL LETTER U

                    case '\u0169':

                        sb.Append('\u0075');

                        break; //  ũ → u    LATIN SMALL LETTER U WITH TILDE → LATIN SMALL LETTER U

                    case '\u016B':

                        sb.Append('\u0075');

                        break; //  ū → u    LATIN SMALL LETTER U WITH MACRON → LATIN SMALL LETTER U

                    case '\u016D':

                        sb.Append('\u0075');

                        break; //  ŭ → u    LATIN SMALL LETTER U WITH BREVE → LATIN SMALL LETTER U

                    case '\u016F':

                        sb.Append('\u0075');

                        break; //  ů → u    LATIN SMALL LETTER U WITH RING ABOVE → LATIN SMALL LETTER U

                    case '\u0171':

                        sb.Append('\u0075');

                        break; //  ű → u    LATIN SMALL LETTER U WITH DOUBLE ACUTE → LATIN SMALL LETTER U

                    case '\u0173':

                        sb.Append('\u0075');

                        break; //  ų → u    LATIN SMALL LETTER U WITH OGONEK → LATIN SMALL LETTER U

                    case '\u01B0':

                        sb.Append('\u0075');

                        break; //  ư → u    LATIN SMALL LETTER U WITH HORN → LATIN SMALL LETTER U

                    case '\u01D4':

                        sb.Append('\u0075');

                        break; //  ǔ → u    LATIN SMALL LETTER U WITH CARON → LATIN SMALL LETTER U

                    case '\u01D6':

                        sb.Append('\u0075');

                        break; //  ǖ → u    LATIN SMALL LETTER U WITH DIAERESIS AND MACRON → LATIN SMALL LETTER U

                    case '\u01D8':

                        sb.Append('\u0075');

                        break; //  ǘ → u    LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE → LATIN SMALL LETTER U

                    case '\u01DA':

                        sb.Append('\u0075');

                        break; //  ǚ → u    LATIN SMALL LETTER U WITH DIAERESIS AND CARON → LATIN SMALL LETTER U

                    case '\u01DC':

                        sb.Append('\u0075');

                        break; //  ǜ → u    LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE → LATIN SMALL LETTER U

                    case '\u0215':

                        sb.Append('\u0075');

                        break; //  ȕ → u    LATIN SMALL LETTER U WITH DOUBLE GRAVE → LATIN SMALL LETTER U

                    case '\u0217':

                        sb.Append('\u0075');

                        break; //  ȗ → u    LATIN SMALL LETTER U WITH INVERTED BREVE → LATIN SMALL LETTER U

                    case '\u1E73':

                        sb.Append('\u0075');

                        break; //  ṳ → u    LATIN SMALL LETTER U WITH DIAERESIS BELOW → LATIN SMALL LETTER U

                    case '\u1E75':

                        sb.Append('\u0075');

                        break; //  ṵ → u    LATIN SMALL LETTER U WITH TILDE BELOW → LATIN SMALL LETTER U

                    case '\u1E77':

                        sb.Append('\u0075');

                        break; //  ṷ → u    LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW → LATIN SMALL LETTER U

                    case '\u1E79':

                        sb.Append('\u0075');

                        break; //  ṹ → u    LATIN SMALL LETTER U WITH TILDE AND ACUTE → LATIN SMALL LETTER U

                    case '\u1E7B':

                        sb.Append('\u0075');

                        break; //  ṻ → u    LATIN SMALL LETTER U WITH MACRON AND DIAERESIS → LATIN SMALL LETTER U

                    case '\u1EE5':

                        sb.Append('\u0075');

                        break; //  ụ → u    LATIN SMALL LETTER U WITH DOT BELOW → LATIN SMALL LETTER U

                    case '\u1EE7':

                        sb.Append('\u0075');

                        break; //  ủ → u    LATIN SMALL LETTER U WITH HOOK ABOVE → LATIN SMALL LETTER U

                    case '\u1EE9':

                        sb.Append('\u0075');

                        break; //  ứ → u    LATIN SMALL LETTER U WITH HORN AND ACUTE → LATIN SMALL LETTER U

                    case '\u1EEB':

                        sb.Append('\u0075');

                        break; //  ừ → u    LATIN SMALL LETTER U WITH HORN AND GRAVE → LATIN SMALL LETTER U

                    case '\u1EED':

                        sb.Append('\u0075');

                        break; //  ử → u    LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE → LATIN SMALL LETTER U

                    case '\u1EEF':

                        sb.Append('\u0075');

                        break; //  ữ → u    LATIN SMALL LETTER U WITH HORN AND TILDE → LATIN SMALL LETTER U

                    case '\u1EF1':

                        sb.Append('\u0075');

                        break; //  ự → u    LATIN SMALL LETTER U WITH HORN AND DOT BELOW → LATIN SMALL LETTER U

                    case '\u028B':

                        sb.Append('\u0076');

                        break; //  ʋ → v    LATIN SMALL LETTER V WITH HOOK → LATIN SMALL LETTER V

                    case '\u1E7D':

                        sb.Append('\u0076');

                        break; //  ṽ → v    LATIN SMALL LETTER V WITH TILDE → LATIN SMALL LETTER V

                    case '\u1E7F':

                        sb.Append('\u0076');

                        break; //  ṿ → v    LATIN SMALL LETTER V WITH DOT BELOW → LATIN SMALL LETTER V

                    case '\u0175':

                        sb.Append('\u0077');

                        break; //  ŵ → w    LATIN SMALL LETTER W WITH CIRCUMFLEX → LATIN SMALL LETTER W

                    case '\u1E81':

                        sb.Append('\u0077');

                        break; //  ẁ → w    LATIN SMALL LETTER W WITH GRAVE → LATIN SMALL LETTER W

                    case '\u1E83':

                        sb.Append('\u0077');

                        break; //  ẃ → w    LATIN SMALL LETTER W WITH ACUTE → LATIN SMALL LETTER W

                    case '\u1E85':

                        sb.Append('\u0077');

                        break; //  ẅ → w    LATIN SMALL LETTER W WITH DIAERESIS → LATIN SMALL LETTER W

                    case '\u1E87':

                        sb.Append('\u0077');

                        break; //  ẇ → w    LATIN SMALL LETTER W WITH DOT ABOVE → LATIN SMALL LETTER W

                    case '\u1E89':

                        sb.Append('\u0077');

                        break; //  ẉ → w    LATIN SMALL LETTER W WITH DOT BELOW → LATIN SMALL LETTER W

                    case '\u1E98':

                        sb.Append('\u0077');

                        break; //  ẘ → w    LATIN SMALL LETTER W WITH RING ABOVE → LATIN SMALL LETTER W

                    case '\u1E8B':

                        sb.Append('\u0078');

                        break; //  ẋ → x    LATIN SMALL LETTER X WITH DOT ABOVE → LATIN SMALL LETTER X

                    case '\u1E8D':

                        sb.Append('\u0078');

                        break; //  ẍ → x    LATIN SMALL LETTER X WITH DIAERESIS → LATIN SMALL LETTER X

                    case '\u00FD':

                        sb.Append('\u0079');

                        break; //  ý → y    LATIN SMALL LETTER Y WITH ACUTE → LATIN SMALL LETTER Y

                    case '\u00FF':

                        sb.Append('\u0079');

                        break; //  ÿ → y    LATIN SMALL LETTER Y WITH DIAERESIS → LATIN SMALL LETTER Y

                    case '\u0177':

                        sb.Append('\u0079');

                        break; //  ŷ → y    LATIN SMALL LETTER Y WITH CIRCUMFLEX → LATIN SMALL LETTER Y

                    case '\u01B4':

                        sb.Append('\u0079');

                        break; //  ƴ → y    LATIN SMALL LETTER Y WITH HOOK → LATIN SMALL LETTER Y

                    case '\u0233':

                        sb.Append('\u0079');

                        break; //  ȳ → y    LATIN SMALL LETTER Y WITH MACRON → LATIN SMALL LETTER Y

                    case '\u1E8F':

                        sb.Append('\u0079');

                        break; //  ẏ → y    LATIN SMALL LETTER Y WITH DOT ABOVE → LATIN SMALL LETTER Y

                    case '\u1E99':

                        sb.Append('\u0079');

                        break; //  ẙ → y    LATIN SMALL LETTER Y WITH RING ABOVE → LATIN SMALL LETTER Y

                    case '\u1EF3':

                        sb.Append('\u0079');

                        break; //  ỳ → y    LATIN SMALL LETTER Y WITH GRAVE → LATIN SMALL LETTER Y

                    case '\u1EF5':

                        sb.Append('\u0079');

                        break; //  ỵ → y    LATIN SMALL LETTER Y WITH DOT BELOW → LATIN SMALL LETTER Y

                    case '\u1EF7':

                        sb.Append('\u0079');

                        break; //  ỷ → y    LATIN SMALL LETTER Y WITH HOOK ABOVE → LATIN SMALL LETTER Y

                    case '\u1EF9':

                        sb.Append('\u0079');

                        break; //  ỹ → y    LATIN SMALL LETTER Y WITH TILDE → LATIN SMALL LETTER Y

                    case '\u017A':

                        sb.Append('\u007A');

                        break; //  ź → z    LATIN SMALL LETTER Z WITH ACUTE → LATIN SMALL LETTER Z

                    case '\u017C':

                        sb.Append('\u007A');

                        break; //  ż → z    LATIN SMALL LETTER Z WITH DOT ABOVE → LATIN SMALL LETTER Z

                    case '\u017E':

                        sb.Append('\u007A');

                        break; //  ž → z    LATIN SMALL LETTER Z WITH CARON → LATIN SMALL LETTER Z

                    case '\u01B6':

                        sb.Append('\u007A');

                        break; //  ƶ → z    LATIN SMALL LETTER Z WITH STROKE → LATIN SMALL LETTER Z

                    case '\u0225':

                        sb.Append('\u007A');

                        break; //  ȥ → z    LATIN SMALL LETTER Z WITH HOOK → LATIN SMALL LETTER Z

                    case '\u0290':

                        sb.Append('\u007A');

                        break; //  ʐ → z    LATIN SMALL LETTER Z WITH RETROFLEX HOOK → LATIN SMALL LETTER Z

                    case '\u0291':

                        sb.Append('\u007A');

                        break; //  ʑ → z    LATIN SMALL LETTER Z WITH CURL → LATIN SMALL LETTER Z

                    case '\u1E91':

                        sb.Append('\u007A');

                        break; //  ẑ → z    LATIN SMALL LETTER Z WITH CIRCUMFLEX → LATIN SMALL LETTER Z

                    case '\u1E93':

                        sb.Append('\u007A');

                        break; //  ẓ → z    LATIN SMALL LETTER Z WITH DOT BELOW → LATIN SMALL LETTER Z

                    case '\u1E95':

                        sb.Append('\u007A');

                        break; //  ẕ → z    LATIN SMALL LETTER Z WITH LINE BELOW → LATIN SMALL LETTER Z

                    default:

                        sb.Append(letter);

                        break;

                }

            }

            return sb.ToString();

        }

     

    Wednesday, January 03, 2007 4:39 PM
    Moderator
  • Thanks Peter. Wow, that looks like a lot of work. I was checking out String.Normalize, as Hans suggested, and considered something like:

    string decomposed = foreign.Normalize(NormalizationForm.FormKD).ToCharArray();
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    foreach (int c in decomposed)
        {
        if ((c <= 0x0300)) || (c > 0x03FF))
           sb.Add((char)c);
        }
        string folder = sb.ToString();

    All diacritical marks are in the range 0x0300 to 0x03FF. Waddya think?


    Wednesday, January 03, 2007 9:02 PM
  •  Richard Hough wrote:
    Thanks Peter. Wow, that looks like a lot of work. I was checking out String.Normalize, as Hans suggested, and considered something like:

    string decomposed = foreign.Normalize(NormalizationForm.FormKD).ToCharArray();
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    foreach (int c in decomposed)
        {
        if ((c <= 0x0300)) || (c > 0x03FF))
           sb.Add((char)c);
        }
        string folder = sb.ToString();

    All diacritical marks are in the range 0x0300 to 0x03FF. Waddya think?


    I couldn't get String.Normalize to be useful for me.  I tried running "Białowieżaéèê" through that algorithm and ended up with "Białowiezaeèe".  It folds some diacriticals; but not all...
    Wednesday, January 03, 2007 9:34 PM
    Moderator
  • I made a typo; the comparison should be if ((c < 0x0300) || (c > 0x03FF)).

    Are you sure you're using NormalizationForm.FormKD? The others will convert accented letters to their canonical form, which is not what I want.

    When I tried your string I got "Białowiezaeee". I wondered why the "ł" was not decomposed, and it turns out "ł" is a separate letter in Polish and not considered an accented character. I will check with our clients and see if this is what they want.

    Wednesday, January 03, 2007 10:19 PM
  • Actually, I copied your code verbatim--fixing the extra parenthesis and using StringBuilder.Append instead of "Add"... it didn't convert the circumflex-accented e; which suggests the folding is culture-specific if yours is converting.  I would test it out with many different diacriticals to make sure it does what you want (assuming Latin l with stroke isn't a priority for your clients).
    Wednesday, January 03, 2007 10:38 PM
    Moderator
  • Hi,

    I had the same problem as you. After seeing the post from Peter Ritchie I investigated and found the win32 api function FoldString that can be used to solve our problem. I'm not sure it works 100% but it should be close enough, and much better than having our own table of substitutions.
    The FoldString interop would be best to use a "ref char source" parameter in this case, for performance reasons. I'll leave the tunning to you. PS, if you find any problems/improvements with the code please inform me. Thanks ;)

    Here is the code:

    public static string ToNoAccent(string str) {
    if( string.IsNullOrEmpty(str) ) {
    return str;
    }

    StringBuilder folded = new StringBuilder(32);
    StringBuilder result = new StringBuilder(str.Length * 2 + 2);

    for( int i = 0; i < str.Length; i++ ) {

    string character = str.Substring(i, 1);

    int count = Kernel32.FoldString(
    Kernel32.MapFlags.MAP_COMPOSITE,
    character,
    1,
    folded,
    folded.Capacity);

    result.Append(folded[0]);
    }

    return result.ToString();
    }

    public enum MapFlags: uint {
    /// <summary>
    /// Fold compatibility zone characters into standard Unicode equivalents. For information about compatibility zone characters, see the following Remarks section.
    /// </summary>
    MAP_FOLDCZONE = 0x00000010,
    /// <summary>
    /// Map all digits to Unicode characters 0 through 9.
    /// </summary>
    MAP_FOLDDIGITS = 0x00000080,
    /// <summary>
    /// Map accented characters to precomposed characters, in which the accent and base character are combined into a single character value. This value cannot be combined with MAP_COMPOSITE.
    /// </summary>
    MAP_PRECOMPOSED = 0x00000020,
    /// <summary>
    /// Map accented characters to composite characters, in which the accent and base character are represented by two character values. This value cannot be combined with MAP_PRECOMPOSED.
    /// </summary>
    MAP_COMPOSITE = 0x00000040,
    /// <summary>
    /// Expand all ligature characters so that they are represented by their two-character equivalent. For example, the ligature '?' expands to the two characters 'a' and 'e'. This value cannot be combined with MAP_PRECOMPOSED or MAP_COMPOSITE.
    /// </summary>
    MAP_EXPAND_LIGATURES = 0x00002000,
    }

    [DllImport("kernel32.dll")]
    [PreserveSig]
    public static extern int FoldString(MapFlags flags, string source, int sourceSize, StringBuilder dest, int destSize);




    Friday, January 05, 2007 2:32 PM
  • Actually, String.Normalize is the recommended equivalent of FoldString in .NET 2.0.  As long as you agree with what it considers diacriticals it will do what you want.

    The results of FoldString depend on what NLS table is currently loaded--which means it will result in different conversions depending on the computer that runs it.

    A bit more research yielded:

        static string RemoveDiacritics(string stIn) {
          string stFormD = stIn.Normalize(NormalizationForm.FormD);
          StringBuilder sb = new StringBuilder();

          for(int ich = 0; ich < stFormD.Length; ich++) {
            UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
            if(uc != UnicodeCategory.NonSpacingMark) {
              sb.Append(stFormD[ich]);
            }
          }

          return(sb.ToString());
        }
    From https://blogs.gotdotnet.com/michkap/archive/2005/02/19/376617.aspx

    Friday, January 05, 2007 5:28 PM
    Moderator
  • The typo I meant was changing "(c <= 0x0300)" to "(c < 0x0300)". This may be why you were getting an accented e.

    I got a response from the client and it's worse than I suspected. They're trying to use user-entered strings for filenames and URLs, so they not only want diacritics removed, but converted to 7-bit ASCII with metacharacters like :, ", ', ?, /, *, and so on removed. Ugh.

    I'm going to use a function like your FoldDiacriticals to convert all non-file and URL-safe characters to safe characters.

    I learned a lot from this thread, thanks for your responses.
    Friday, January 05, 2007 7:27 PM
  • System.IO.Path.InvalidPathChars may help.  Good luck.
    Friday, January 05, 2007 7:33 PM
    Moderator
  • You can use Path.GetInvalidFileNameChars and Path.GetInvalidPathChars to test for the non-diacritical characters you want to remove...
    Friday, January 05, 2007 7:37 PM
    Moderator
  • Thanks Peter, 100% .Net code is even better! :)

    I wonder why the RemoveDiacritics does not work with the string "Białowieża", the ending result will be "Białowieza" instead of "Bialowieza". FoldString manages to fold the character ł correctly.

    Debug shows us that:

    "ł".Normalize(NormalizationForm.FormD).ToCharArray() = { 'ł' }


    Is this a bug on the Normalize function? :| I don't know what version to use now. Argh...
    Monday, January 08, 2007 11:14 AM
  • Check out the definitions for NormalizationForm D and character decomposition at http://unicode.org. Characters like é and ż are considered compositions of the ordinary latin characters e and z with combining diacritical marks.

    Normalize(NormalizationForm.FormD) separates the base characters from the combining characters, and UnicodeCategory.NonSpacingMark identifies the diacritical marks as non-spacing marks so they don't get appended to the string.

    Ł is a separate Unicode character with its own code point, it is not considered a latin character with a "slash" combining mark. It is as different from L as M or ß is, is not a NonSpacingMark, and will get appended to the string.

    Peter is describing folding, which is different from normalization. We want to treat L and Ł the same, even though they are different characters. Similarly, in German we would want to treat ß and ss the same, even though they are different strngs with different characters. Normalization can't do this, the comparison is based on human understanding of the characters, not Unicode code points. There is no way to do that without a case-by-case comparison, as Peter posted.

    Monday, January 08, 2007 6:04 PM
  • Is there a .Net string method that will strip diacriticals from strings? That is, what can I replace ToNoDiacriticals with to get the following to work:

    string foreign = "Białowieża";
    if (foreign.ToNoDiacriticals().Equals("Bialowieza"))
        System.Console.Writeln("Works!");



       I don't understand. In your example you asked how to remove the diacritical from Ł in a way that Ł equals L. (Does it have a diacritical or not?)
       We come to the conclusion that what we need to do is to do a "diacritical fold" of the string.
       kernel32.dll
    FoldString function transforms Ł into L + some other character, which is what we want.
       .Net 2.0 string.Normalize() is the equivalent of FoldString, even better.
      
    string.Normalize() does not break Ł into L + some other character (Because the letter
    Ł does not have a composed version?).

    I come to the conclusion that what we want is neither Folding nor Normalization. I didn't know that we want to treat
    ß and ss as the same and this is the main reason I am searching for a way to test this kind of string equivalence between 2 strings. Its impossible to know all equivaleces of every language.

    For the purpose of what I require
    string.Normalize() is close enough, and that is what I will be using. :|

    Regards
    Monday, January 08, 2007 7:18 PM