You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@joshua.apache.org by mj...@apache.org on 2016/08/17 10:32:04 UTC

[23/56] [partial] incubator-joshua git commit: maven multi-module layout 1st commit: moving files into joshua-core

http://git-wip-us.apache.org/repos/asf/incubator-joshua/blob/5735d9ae/joshua-core/src/main/java/org/apache/joshua/util/UnicodeCharacterName.java
----------------------------------------------------------------------
diff --git a/joshua-core/src/main/java/org/apache/joshua/util/UnicodeCharacterName.java b/joshua-core/src/main/java/org/apache/joshua/util/UnicodeCharacterName.java
new file mode 100644
index 0000000..93c759e
--- /dev/null
+++ b/joshua-core/src/main/java/org/apache/joshua/util/UnicodeCharacterName.java
@@ -0,0 +1,22466 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.joshua.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class UnicodeCharacterName {
+
+  private final Map<Character, String> map;
+
+  public UnicodeCharacterName() {
+
+    int expectedSize = 21927;
+
+    map = new HashMap<Character, String>(expectedSize);
+
+    basicLatin(map);
+    latin1Supplement(map);
+    latinExtendedA(map);
+    latinExtendedB(map);
+    ipaExtensions(map);
+    spacingModifierLetters(map);
+    combiningDiacriticMarks(map);
+    greekAndCoptic(map);
+    cyrillic(map);
+    cyrillicSupplement(map);
+    armenian(map);
+    hebrew(map);
+    arabic(map);
+    syriac(map);
+    arabicSupplement(map);
+    thaana(map);
+    nko(map);
+    samaritan(map);
+    devanagari(map);
+    bengali(map);
+    gurmukhi(map);
+    gujarati(map);
+    oriya(map);
+    tamil(map);
+    telugu(map);
+    kannada(map);
+    malayalam(map);
+    sinhala(map);
+    thai(map);
+    lao(map);
+    tibetan(map);
+    myanmar(map);
+    georgian(map);
+    hangulJamo(map);
+    ethiopic(map);
+    ethiopicSupplement(map);
+    cherokee(map);
+    canadianAboriginalSyllabics(map);
+    ogham(map);
+    runic(map);
+    tagalog(map);
+    hanunoo(map);
+    buhid(map);
+    tagbanwa(map);
+    khmer(map);
+    mongolian(map);
+    canadianSyllabics(map);
+    limbu(map);
+    taiLe(map);
+    newTaiLue(map);
+    khmerSymbols(map);
+    buginese(map);
+    balinese(map);
+    sudanese(map);
+    lepcha(map);
+    olChiki(map);
+    vedic(map);
+    phoneticExtensions(map);
+    phoneticExtensionsSupplement(map);
+    combiningDiacriticalMarksSupplement(map);
+    latinExtendedAdditional(map);
+    greekExtended(map);
+    generalPunctuation(map);
+    cjkSymbolsAndPunctuation(map);
+    hangulSyllables(map);
+  }
+
+  public static final void basicLatin(Map<Character, String> map) {
+
+    // C0 Controls
+    map.put('\u0000', "NULL");
+    map.put('\u0001', "START OF HEADING");
+    map.put('\u0002', "START OF TEXT");
+    map.put('\u0003', "END OF TEXT");
+    map.put('\u0004', "END OF TRANSMISSION");
+    map.put('\u0005', "ENQUIRY");
+    map.put('\u0006', "ACKNOWLEDGE");
+    map.put('\u0007', "BELL");
+    map.put('\u0008', "BACKSPACE");
+    map.put('\u0009', "CHARACTER TABULATION");
+    map.put('\u000B', "LINE TABULATION");
+    map.put('\u000C', "FORM FEED");
+    map.put('\u000E', "SHIFT OUT");
+    map.put('\u000F', "SHIFT IN");
+    map.put('\u0010', "DATA LINK ESCAPE");
+    map.put('\u0011', "DEVICE CONTROL ONE");
+    map.put('\u0012', "DEVICE CONTROL TWO");
+    map.put('\u0013', "DEVICE CONTROL THREE");
+    map.put('\u0014', "DEVICE CONTROL FOUR");
+    map.put('\u0015', "NEGATIVE ACKNOWLEDGE");
+    map.put('\u0016', "SYNCHRONOUS IDLE");
+    map.put('\u0017', "END OF TRANSMISSION BLOCK");
+    map.put('\u0018', "CANCEL");
+    map.put('\u0019', "END OF MEDIUM");
+    map.put('\u001A', "SUBSTITUTE");
+    map.put('\u001B', "ESCAPE");
+    map.put('\u001C', "FILE SEPARATOR");
+    map.put('\u001D', "GROUP SEPARATOR");
+    map.put('\u001E', "RECORD SEPARATOR");
+    map.put('\u001F', "UNIT SEPARATOR");
+
+    // ASCII punctuation and symbols
+    map.put('\u0020', "SPACE");
+    map.put('\u0021', "EXCLAMATION MARK");
+    map.put('\u0022', "QUOTATION MARK");
+    map.put('\u0023', "NUMBER SIGN");
+    map.put('\u0024', "DOLLAR SIGN");
+    map.put('\u0025', "PERCENT SIGN");
+    map.put('\u0026', "AMPERSAND");
+    map.put('\'', "APOSTROPHE");
+    map.put('\u0028', "LEFT PARENTHESIS");
+    map.put('\u0029', "RIGHT PARENTHESIS");
+    map.put('\u002A', "ASTERISK");
+    map.put('\u002B', "PLUS SIGN");
+    map.put('\u002C', "COMMA");
+    map.put('\u002D', "HYPHEN-MINUS");
+    map.put('\u002E', "FULL STOP");
+    map.put('\u002F', "SOLIDUS");
+
+    // ASCII digits
+    map.put('\u0030', "DIGIT ZERO");
+    map.put('\u0031', "DIGIT ONE");
+    map.put('\u0032', "DIGIT TWO");
+    map.put('\u0033', "DIGIT THREE");
+    map.put('\u0034', "DIGIT FOUR");
+    map.put('\u0035', "DIGIT FIVE");
+    map.put('\u0036', "DIGIT SIX");
+    map.put('\u0037', "DIGIT SEVEN");
+    map.put('\u0038', "DIGIT EIGHT");
+    map.put('\u0039', "DIGIT NINE");
+
+    // ASCII punctuation and symbols
+    map.put('\u003A', "COLON");
+    map.put('\u003B', "SEMICOLON");
+    map.put('\u003C', "LESS-THAN SIGN");
+    map.put('\u003D', "EQUALS SIGN");
+    map.put('\u003E', "GREATER-THAN SIGN");
+    map.put('\u003F', "QUESTION MARK");
+    map.put('\u0040', "COMMERCIAL AT");
+
+    // Uppercase Latin alphabet
+    map.put('\u0041', "LATIN CAPITAL LETTER A");
+    map.put('\u0042', "LATIN CAPITAL LETTER B");
+    map.put('\u0043', "LATIN CAPITAL LETTER C");
+    map.put('\u0044', "LATIN CAPITAL LETTER D");
+    map.put('\u0045', "LATIN CAPITAL LETTER E");
+    map.put('\u0046', "LATIN CAPITAL LETTER F");
+    map.put('\u0047', "LATIN CAPITAL LETTER G");
+    map.put('\u0048', "LATIN CAPITAL LETTER H");
+    map.put('\u0049', "LATIN CAPITAL LETTER I");
+    map.put('\u004A', "LATIN CAPITAL LETTER J");
+    map.put('\u004B', "LATIN CAPITAL LETTER K");
+    map.put('\u004C', "LATIN CAPITAL LETTER L");
+    map.put('\u004D', "LATIN CAPITAL LETTER M");
+    map.put('\u004E', "LATIN CAPITAL LETTER N");
+    map.put('\u004F', "LATIN CAPITAL LETTER O");
+    map.put('\u0050', "LATIN CAPITAL LETTER P");
+    map.put('\u0051', "LATIN CAPITAL LETTER Q");
+    map.put('\u0052', "LATIN CAPITAL LETTER R");
+    map.put('\u0053', "LATIN CAPITAL LETTER S");
+    map.put('\u0054', "LATIN CAPITAL LETTER T");
+    map.put('\u0055', "LATIN CAPITAL LETTER U");
+    map.put('\u0056', "LATIN CAPITAL LETTER V");
+    map.put('\u0057', "LATIN CAPITAL LETTER W");
+    map.put('\u0058', "LATIN CAPITAL LETTER X");
+    map.put('\u0059', "LATIN CAPITAL LETTER Y");
+    map.put('\u005A', "LATIN CAPITAL LETTER Z");
+
+    // ASCII punctuation and symbols
+    map.put('\u005B', "LEFT SQUARE BRACKET");
+    map.put('\\', "REVERSE SOLIDUS");
+    map.put('\u005D', "RIGHT SQUARE BRACKET");
+    map.put('\u005E', "CIRCUMFLEX ACCENT");
+    map.put('\u005F', "LOW LINE");
+    map.put('\u0060', "GRAVE ACCENT");
+
+    // Lowercase Latin alphabet
+    map.put('\u0061', "LATIN SMALL LETTER A");
+    map.put('\u0062', "LATIN SMALL LETTER B");
+    map.put('\u0063', "LATIN SMALL LETTER C");
+    map.put('\u0064', "LATIN SMALL LETTER D");
+    map.put('\u0065', "LATIN SMALL LETTER E");
+    map.put('\u0066', "LATIN SMALL LETTER F");
+    map.put('\u0067', "LATIN SMALL LETTER G");
+    map.put('\u0068', "LATIN SMALL LETTER H");
+    map.put('\u0069', "LATIN SMALL LETTER I");
+    map.put('\u006A', "LATIN SMALL LETTER J");
+    map.put('\u006B', "LATIN SMALL LETTER K");
+    map.put('\u006C', "LATIN SMALL LETTER L");
+    map.put('\u006D', "LATIN SMALL LETTER M");
+    map.put('\u006E', "LATIN SMALL LETTER N");
+    map.put('\u006F', "LATIN SMALL LETTER O");
+    map.put('\u0070', "LATIN SMALL LETTER P");
+    map.put('\u0071', "LATIN SMALL LETTER Q");
+    map.put('\u0072', "LATIN SMALL LETTER R");
+    map.put('\u0073', "LATIN SMALL LETTER S");
+    map.put('\u0074', "LATIN SMALL LETTER T");
+    map.put('\u0075', "LATIN SMALL LETTER U");
+    map.put('\u0076', "LATIN SMALL LETTER V");
+    map.put('\u0077', "LATIN SMALL LETTER W");
+    map.put('\u0078', "LATIN SMALL LETTER X");
+    map.put('\u0079', "LATIN SMALL LETTER Y");
+    map.put('\u007A', "LATIN SMALL LETTER Z");
+
+    // ASCII punctuation and symbols
+    map.put('\u007B', "LEFT CURLY BRACKET");
+    map.put('\u007C', "VERTICAL LINE");
+    map.put('\u007D', "RIGHT CURLY BRACKET");
+    map.put('\u007E', "TILDE");
+
+    // Control character
+    map.put('\u007F', "DELETE");
+
+  }
+
+  public static final void latin1Supplement(Map<Character, String> map) {
+
+    // C1 controls
+    map.put('\u0080', "<control>");
+    map.put('\u0081', "<control>");
+    map.put('\u0082', "BREAK PERMITTED HERE");
+    map.put('\u0083', "NO BREAK HERE");
+    map.put('\u0084', "<control>");
+    map.put('\u0085', "NEXT LINE");
+    map.put('\u0086', "START OF SELECTED AREA");
+    map.put('\u0087', "END OF SELECTED AREA");
+    map.put('\u0088', "CHARACTER TABULATION SET");
+    map.put('\u0089', "CHARACTER TABULATION WITH JUSTIFICATION");
+    map.put('\u008A', "LINE TABULATION SET");
+    map.put('\u008B', "PARTIAL LINE FORWARD");
+    map.put('\u008C', "PARTIAL LINE BACKWARD");
+    map.put('\u008D', "REVERSE LINE FEED");
+    map.put('\u008E', "SINGLE SHIFT TWO");
+    map.put('\u008F', "SINGLE SHIFT THREE");
+    map.put('\u0090', "DEVICE CONTROL STRING");
+    map.put('\u0091', "PRIVATE USE ONE");
+    map.put('\u0092', "PRIVATE USE TWO");
+    map.put('\u0093', "SET TRANSMIT STATE");
+    map.put('\u0094', "CANCEL CHARACTER");
+    map.put('\u0095', "MESSAGE WAITING");
+    map.put('\u0096', "START OF GUARDED AREA");
+    map.put('\u0097', "END OF GUARDED AREA");
+    map.put('\u0098', "START OF STRING");
+    map.put('\u0099', "<control>");
+    map.put('\u009A', "SINGLE CHARACTER INTRODUCER");
+    map.put('\u009B', "CONTROL SEQUENCE INTRODUCER");
+    map.put('\u009C', "STRING TERMINATOR");
+    map.put('\u009D', "OPERATING SYSTEM COMMAND");
+    map.put('\u009E', "PRIVACY MESSAGE");
+    map.put('\u009F', "APPLICATION PROGRAM COMMAND");
+
+    // Latin-1 punctuation and symbols
+    map.put('\u00A0', "NO-BREAK SPACE");
+    map.put('\u00A1', "INVERTED EXCLAMATION MARK");
+    map.put('\u00A2', "CENT SIGN");
+    map.put('\u00A3', "POUND SIGN");
+    map.put('\u00A4', "CURRENCY SIGN");
+    map.put('\u00A5', "YEN SIGN");
+    map.put('\u00A6', "BROKEN BAR");
+    map.put('\u00A7', "SECTION SIGN");
+    map.put('\u00A8', "DIAERESIS");
+    map.put('\u00A9', "COPYRIGHT SIGN");
+    map.put('\u00AA', "FEMININE ORDINAL INDICATOR");
+    map.put('\u00AB', "LEFT-POINTING DOUBLE ANGLE QUOTATION MARK");
+    map.put('\u00AC', "NOT SIGN");
+    map.put('\u00AD', "SOFT HYPHEN");
+    map.put('\u00AE', "REGISTERED SIGN");
+    map.put('\u00AF', "MACRON");
+    map.put('\u00B0', "DEGREE SIGN");
+    map.put('\u00B1', "PLUS-MINUS SIGN");
+    map.put('\u00B2', "SUPERSCRIPT TWO");
+    map.put('\u00B3', "SUPERSCRIPT THREE");
+    map.put('\u00B4', "ACUTE ACCENT");
+    map.put('\u00B5', "MICRO SIGN");
+    map.put('\u00B6', "PILCROW SIGN");
+    map.put('\u00B7', "MIDDLE DOT");
+    map.put('\u00B8', "CEDILLA");
+    map.put('\u00B9', "SUPERSCRIPT ONE");
+    map.put('\u00BA', "MASCULINE ORDINAL INDICATOR");
+    map.put('\u00BB', "RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK");
+    map.put('\u00BC', "VULGAR FRACTION ONE QUARTER");
+    map.put('\u00BD', "VULGAR FRACTION ONE HALF");
+    map.put('\u00BE', "VULGAR FRACTION THREE QUARTERS");
+    map.put('\u00BF', "INVERTED QUESTION MARK");
+
+    // Letters
+    map.put('\u00C0', "LATIN CAPITAL LETTER A WITH GRAVE");
+    map.put('\u00C1', "LATIN CAPITAL LETTER A WITH ACUTE");
+    map.put('\u00C2', "LATIN CAPITAL LETTER A WITH CIRCUMFLEX");
+    map.put('\u00C3', "LATIN CAPITAL LETTER A WITH TILDE");
+    map.put('\u00C4', "LATIN CAPITAL LETTER A WITH DIAERESIS");
+    map.put('\u00C5', "LATIN CAPITAL LETTER A WITH RING ABOVE");
+    map.put('\u00C6', "LATIN CAPITAL LETTER AE");
+    map.put('\u00C7', "LATIN CAPITAL LETTER C WITH CEDILLA");
+    map.put('\u00C8', "LATIN CAPITAL LETTER E WITH GRAVE");
+    map.put('\u00C9', "LATIN CAPITAL LETTER E WITH ACUTE");
+    map.put('\u00CA', "LATIN CAPITAL LETTER E WITH CIRCUMFLEX");
+    map.put('\u00CB', "LATIN CAPITAL LETTER E WITH DIAERESIS");
+    map.put('\u00CC', "LATIN CAPITAL LETTER I WITH GRAVE");
+    map.put('\u00CD', "LATIN CAPITAL LETTER I WITH ACUTE");
+    map.put('\u00CE', "LATIN CAPITAL LETTER I WITH CIRCUMFLEX");
+    map.put('\u00CF', "LATIN CAPITAL LETTER I WITH DIAERESIS");
+    map.put('\u00D0', "LATIN CAPITAL LETTER ETH");
+    map.put('\u00D1', "LATIN CAPITAL LETTER N WITH TILDE");
+    map.put('\u00D2', "LATIN CAPITAL LETTER O WITH GRAVE");
+    map.put('\u00D3', "LATIN CAPITAL LETTER O WITH ACUTE");
+    map.put('\u00D4', "LATIN CAPITAL LETTER O WITH CIRCUMFLEX");
+    map.put('\u00D5', "LATIN CAPITAL LETTER O WITH TILDE");
+    map.put('\u00D6', "LATIN CAPITAL LETTER O WITH DIAERESIS");
+
+    // Mathematical operator
+    map.put('\u00D7', "MULTIPLICATION SIGN");
+
+    // Letters
+    map.put('\u00D8', "LATIN CAPITAL LETTER O WITH STROKE");
+    map.put('\u00D9', "LATIN CAPITAL LETTER U WITH GRAVE");
+    map.put('\u00DA', "LATIN CAPITAL LETTER U WITH ACUTE");
+    map.put('\u00DB', "LATIN CAPITAL LETTER U WITH CIRCUMFLEX");
+    map.put('\u00DC', "LATIN CAPITAL LETTER U WITH DIAERESIS");
+    map.put('\u00DD', "LATIN CAPITAL LETTER Y WITH ACUTE");
+    map.put('\u00DE', "LATIN CAPITAL LETTER THORN");
+    map.put('\u00DF', "LATIN SMALL LETTER SHARP S");
+    map.put('\u00E0', "LATIN SMALL LETTER A WITH GRAVE");
+    map.put('\u00E1', "LATIN SMALL LETTER A WITH ACUTE");
+    map.put('\u00E2', "LATIN SMALL LETTER A WITH CIRCUMFLEX");
+    map.put('\u00E3', "LATIN SMALL LETTER A WITH TILDE");
+    map.put('\u00E4', "LATIN SMALL LETTER A WITH DIAERESIS");
+    map.put('\u00E5', "LATIN SMALL LETTER A WITH RING ABOVE");
+    map.put('\u00E6', "LATIN SMALL LETTER AE");
+    map.put('\u00E7', "LATIN SMALL LETTER C WITH CEDILLA");
+    map.put('\u00E8', "LATIN SMALL LETTER E WITH GRAVE");
+    map.put('\u00E9', "LATIN SMALL LETTER E WITH ACUTE");
+    map.put('\u00EA', "LATIN SMALL LETTER E WITH CIRCUMFLEX");
+    map.put('\u00EB', "LATIN SMALL LETTER E WITH DIAERESIS");
+    map.put('\u00EC', "LATIN SMALL LETTER I WITH GRAVE");
+    map.put('\u00ED', "LATIN SMALL LETTER I WITH ACUTE");
+    map.put('\u00EE', "LATIN SMALL LETTER I WITH CIRCUMFLEX");
+    map.put('\u00EF', "LATIN SMALL LETTER I WITH DIAERESIS");
+    map.put('\u00F0', "LATIN SMALL LETTER ETH");
+    map.put('\u00F1', "LATIN SMALL LETTER N WITH TILDE");
+    map.put('\u00F2', "LATIN SMALL LETTER O WITH GRAVE");
+    map.put('\u00F3', "LATIN SMALL LETTER O WITH ACUTE");
+    map.put('\u00F4', "LATIN SMALL LETTER O WITH CIRCUMFLEX");
+    map.put('\u00F5', "LATIN SMALL LETTER O WITH TILDE");
+    map.put('\u00F6', "LATIN SMALL LETTER O WITH DIAERESIS");
+
+    // Mathematical operator
+    map.put('\u00F7', "DIVISION SIGN");
+
+    // Letters
+    map.put('\u00F8', "LATIN SMALL LETTER O WITH STROKE");
+    map.put('\u00F9', "LATIN SMALL LETTER U WITH GRAVE");
+    map.put('\u00FA', "LATIN SMALL LETTER U WITH ACUTE");
+    map.put('\u00FB', "LATIN SMALL LETTER U WITH CIRCUMFLEX");
+    map.put('\u00FC', "LATIN SMALL LETTER U WITH DIAERESIS");
+    map.put('\u00FD', "LATIN SMALL LETTER Y WITH ACUTE");
+    map.put('\u00FE', "LATIN SMALL LETTER THORN");
+    map.put('\u00FF', "LATIN SMALL LETTER Y WITH DIAERESIS");
+
+  }
+
+  public static final void latinExtendedA(Map<Character, String> map) {
+
+    // European Latin
+    map.put('\u0100', "LATIN CAPITAL LETTER A WITH MACRON");
+    map.put('\u0101', "LATIN SMALL LETTER A WITH MACRON");
+    map.put('\u0102', "LATIN CAPITAL LETTER A WITH BREVE");
+    map.put('\u0103', "LATIN SMALL LETTER A WITH BREVE");
+    map.put('\u0104', "LATIN CAPITAL LETTER A WITH OGONEK");
+    map.put('\u0105', "LATIN SMALL LETTER A WITH OGONEK");
+    map.put('\u0106', "LATIN CAPITAL LETTER C WITH ACUTE");
+    map.put('\u0107', "LATIN SMALL LETTER C WITH ACUTE");
+    map.put('\u0108', "LATIN CAPITAL LETTER C WITH CIRCUMFLEX");
+    map.put('\u0109', "LATIN SMALL LETTER C WITH CIRCUMFLEX");
+    map.put('\u010A', "LATIN CAPITAL LETTER C WITH DOT ABOVE");
+    map.put('\u010B', "LATIN SMALL LETTER C WITH DOT ABOVE");
+    map.put('\u010C', "LATIN CAPITAL LETTER C WITH CARON");
+    map.put('\u010D', "LATIN SMALL LETTER C WITH CARON");
+    map.put('\u010E', "LATIN CAPITAL LETTER D WITH CARON");
+    map.put('\u010F', "LATIN SMALL LETTER D WITH CARON");
+    map.put('\u0110', "LATIN CAPITAL LETTER D WITH STROKE");
+    map.put('\u0111', "LATIN SMALL LETTER D WITH STROKE");
+    map.put('\u0112', "LATIN CAPITAL LETTER E WITH MACRON");
+    map.put('\u0113', "LATIN SMALL LETTER E WITH MACRON");
+    map.put('\u0114', "LATIN CAPITAL LETTER E WITH BREVE");
+    map.put('\u0115', "LATIN SMALL LETTER E WITH BREVE");
+    map.put('\u0116', "LATIN CAPITAL LETTER E WITH DOT ABOVE");
+    map.put('\u0117', "LATIN SMALL LETTER E WITH DOT ABOVE");
+    map.put('\u0118', "LATIN CAPITAL LETTER E WITH OGONEK");
+    map.put('\u0119', "LATIN SMALL LETTER E WITH OGONEK");
+    map.put('\u011A', "LATIN CAPITAL LETTER E WITH CARON");
+    map.put('\u011B', "LATIN SMALL LETTER E WITH CARON");
+    map.put('\u011C', "LATIN CAPITAL LETTER G WITH CIRCUMFLEX");
+    map.put('\u011D', "LATIN SMALL LETTER G WITH CIRCUMFLEX");
+    map.put('\u011E', "LATIN CAPITAL LETTER G WITH BREVE");
+    map.put('\u011F', "LATIN SMALL LETTER G WITH BREVE");
+    map.put('\u0120', "LATIN CAPITAL LETTER G WITH DOT ABOVE");
+    map.put('\u0121', "LATIN SMALL LETTER G WITH DOT ABOVE");
+    map.put('\u0122', "LATIN CAPITAL LETTER G WITH CEDILLA");
+    map.put('\u0123', "LATIN SMALL LETTER G WITH CEDILLA");
+    map.put('\u0124', "LATIN CAPITAL LETTER H WITH CIRCUMFLEX");
+    map.put('\u0125', "LATIN SMALL LETTER H WITH CIRCUMFLEX");
+    map.put('\u0126', "LATIN CAPITAL LETTER H WITH STROKE");
+    map.put('\u0127', "LATIN SMALL LETTER H WITH STROKE");
+    map.put('\u0128', "LATIN CAPITAL LETTER I WITH TILDE");
+    map.put('\u0129', "LATIN SMALL LETTER I WITH TILDE");
+    map.put('\u012A', "LATIN CAPITAL LETTER I WITH MACRON");
+    map.put('\u012B', "LATIN SMALL LETTER I WITH MACRON");
+    map.put('\u012C', "LATIN CAPITAL LETTER I WITH BREVE");
+    map.put('\u012D', "LATIN SMALL LETTER I WITH BREVE");
+    map.put('\u012E', "LATIN CAPITAL LETTER I WITH OGONEK");
+    map.put('\u012F', "LATIN SMALL LETTER I WITH OGONEK");
+    map.put('\u0130', "LATIN CAPITAL LETTER I WITH DOT ABOVE");
+    map.put('\u0131', "LATIN SMALL LETTER DOTLESS I");
+    map.put('\u0132', "LATIN CAPITAL LIGATURE IJ");
+    map.put('\u0133', "LATIN SMALL LIGATURE IJ");
+    map.put('\u0134', "LATIN CAPITAL LETTER J WITH CIRCUMFLEX");
+    map.put('\u0135', "LATIN SMALL LETTER J WITH CIRCUMFLEX");
+    map.put('\u0136', "LATIN CAPITAL LETTER K WITH CEDILLA");
+    map.put('\u0137', "LATIN SMALL LETTER K WITH CEDILLA");
+    map.put('\u0138', "LATIN SMALL LETTER KRA");
+    map.put('\u0139', "LATIN CAPITAL LETTER L WITH ACUTE");
+    map.put('\u013A', "LATIN SMALL LETTER L WITH ACUTE");
+    map.put('\u013B', "LATIN CAPITAL LETTER L WITH CEDILLA");
+    map.put('\u013C', "LATIN SMALL LETTER L WITH CEDILLA");
+    map.put('\u013D', "LATIN CAPITAL LETTER L WITH CARON");
+    map.put('\u013E', "LATIN SMALL LETTER L WITH CARON");
+    map.put('\u013F', "LATIN CAPITAL LETTER L WITH MIDDLE DOT");
+    map.put('\u0140', "LATIN SMALL LETTER L WITH MIDDLE DOT");
+    map.put('\u0141', "LATIN CAPITAL LETTER L WITH STROKE");
+    map.put('\u0142', "LATIN SMALL LETTER L WITH STROKE");
+    map.put('\u0143', "LATIN CAPITAL LETTER N WITH ACUTE");
+    map.put('\u0144', "LATIN SMALL LETTER N WITH ACUTE");
+    map.put('\u0145', "LATIN CAPITAL LETTER N WITH CEDILLA");
+    map.put('\u0146', "LATIN SMALL LETTER N WITH CEDILLA");
+    map.put('\u0147', "LATIN CAPITAL LETTER N WITH CARON");
+    map.put('\u0148', "LATIN SMALL LETTER N WITH CARON");
+
+    // Deprecated letter
+    map.put('\u0149', "LATIN SMALL LETTER N PRECEDED BY APOSTROPHE");
+
+    // European Latin
+    map.put('\u014A', "LATIN CAPITAL LETTER ENG");
+    map.put('\u014B', "LATIN SMALL LETTER ENG");
+    map.put('\u014C', "LATIN CAPITAL LETTER O WITH MACRON");
+    map.put('\u014D', "LATIN SMALL LETTER O WITH MACRON");
+    map.put('\u014E', "LATIN CAPITAL LETTER O WITH BREVE");
+    map.put('\u014F', "LATIN SMALL LETTER O WITH BREVE");
+    map.put('\u0150', "LATIN CAPITAL LETTER O WITH DOUBLE ACUTE");
+    map.put('\u0151', "LATIN SMALL LETTER O WITH DOUBLE ACUTE");
+    map.put('\u0152', "LATIN CAPITAL LIGATURE OE");
+    map.put('\u0153', "LATIN SMALL LIGATURE OE");
+    map.put('\u0154', "LATIN CAPITAL LETTER R WITH ACUTE");
+    map.put('\u0155', "LATIN SMALL LETTER R WITH ACUTE");
+    map.put('\u0156', "LATIN CAPITAL LETTER R WITH CEDILLA");
+    map.put('\u0157', "LATIN SMALL LETTER R WITH CEDILLA");
+    map.put('\u0158', "LATIN CAPITAL LETTER R WITH CARON");
+    map.put('\u0159', "LATIN SMALL LETTER R WITH CARON");
+    map.put('\u015A', "LATIN CAPITAL LETTER S WITH ACUTE");
+    map.put('\u015B', "LATIN SMALL LETTER S WITH ACUTE");
+    map.put('\u015C', "LATIN CAPITAL LETTER S WITH CIRCUMFLEX");
+    map.put('\u015D', "LATIN SMALL LETTER S WITH CIRCUMFLEX");
+    map.put('\u015E', "LATIN CAPITAL LETTER S WITH CEDILLA");
+    map.put('\u015F', "LATIN SMALL LETTER S WITH CEDILLA");
+    map.put('\u0160', "LATIN CAPITAL LETTER S WITH CARON");
+    map.put('\u0161', "LATIN SMALL LETTER S WITH CARON");
+    map.put('\u0162', "LATIN CAPITAL LETTER T WITH CEDILLA");
+    map.put('\u0163', "LATIN SMALL LETTER T WITH CEDILLA");
+    map.put('\u0164', "LATIN CAPITAL LETTER T WITH CARON");
+    map.put('\u0165', "LATIN SMALL LETTER T WITH CARON");
+    map.put('\u0166', "LATIN CAPITAL LETTER T WITH STROKE");
+    map.put('\u0167', "LATIN SMALL LETTER T WITH STROKE");
+    map.put('\u0168', "LATIN CAPITAL LETTER U WITH TILDE");
+    map.put('\u0169', "LATIN SMALL LETTER U WITH TILDE");
+    map.put('\u016A', "LATIN CAPITAL LETTER U WITH MACRON");
+    map.put('\u016B', "LATIN SMALL LETTER U WITH MACRON");
+    map.put('\u016C', "LATIN CAPITAL LETTER U WITH BREVE");
+    map.put('\u016D', "LATIN SMALL LETTER U WITH BREVE");
+    map.put('\u016E', "LATIN CAPITAL LETTER U WITH RING ABOVE");
+    map.put('\u016F', "LATIN SMALL LETTER U WITH RING ABOVE");
+    map.put('\u0170', "LATIN CAPITAL LETTER U WITH DOUBLE ACUTE");
+    map.put('\u0171', "LATIN SMALL LETTER U WITH DOUBLE ACUTE");
+    map.put('\u0172', "LATIN CAPITAL LETTER U WITH OGONEK");
+    map.put('\u0173', "LATIN SMALL LETTER U WITH OGONEK");
+    map.put('\u0174', "LATIN CAPITAL LETTER W WITH CIRCUMFLEX");
+    map.put('\u0175', "LATIN SMALL LETTER W WITH CIRCUMFLEX");
+    map.put('\u0176', "LATIN CAPITAL LETTER Y WITH CIRCUMFLEX");
+    map.put('\u0177', "LATIN SMALL LETTER Y WITH CIRCUMFLEX");
+    map.put('\u0178', "LATIN CAPITAL LETTER Y WITH DIAERESIS");
+    map.put('\u0179', "LATIN CAPITAL LETTER Z WITH ACUTE");
+    map.put('\u017A', "LATIN SMALL LETTER Z WITH ACUTE");
+    map.put('\u017B', "LATIN CAPITAL LETTER Z WITH DOT ABOVE");
+    map.put('\u017C', "LATIN SMALL LETTER Z WITH DOT ABOVE");
+    map.put('\u017D', "LATIN CAPITAL LETTER Z WITH CARON");
+    map.put('\u017E', "LATIN SMALL LETTER Z WITH CARON");
+    map.put('\u017F', "LATIN SMALL LETTER LONG S");
+
+  }
+
+  public static final void latinExtendedB(Map<Character, String> map) {
+
+    // Non-European and historic Latin
+    map.put('\u0180', "LATIN SMALL LETTER B WITH STROKE");
+    map.put('\u0181', "LATIN CAPITAL LETTER B WITH HOOK");
+    map.put('\u0182', "LATIN CAPITAL LETTER B WITH TOPBAR");
+    map.put('\u0183', "LATIN SMALL LETTER B WITH TOPBAR");
+    map.put('\u0184', "LATIN CAPITAL LETTER TONE SIX");
+    map.put('\u0185', "LATIN SMALL LETTER TONE SIX");
+    map.put('\u0186', "LATIN CAPITAL LETTER OPEN O");
+    map.put('\u0187', "LATIN CAPITAL LETTER C WITH HOOK");
+    map.put('\u0188', "LATIN SMALL LETTER C WITH HOOK");
+    map.put('\u0189', "LATIN CAPITAL LETTER AFRICAN D");
+    map.put('\u018A', "LATIN CAPITAL LETTER D WITH HOOK");
+    map.put('\u018B', "LATIN CAPITAL LETTER D WITH TOPBAR");
+    map.put('\u018C', "LATIN SMALL LETTER D WITH TOPBAR");
+    map.put('\u018D', "LATIN SMALL LETTER TURNED DELTA");
+    map.put('\u018E', "LATIN CAPITAL LETTER REVERSED E");
+    map.put('\u018F', "LATIN CAPITAL LETTER SCHWA");
+    map.put('\u0190', "LATIN CAPITAL LETTER OPEN E");
+    map.put('\u0191', "LATIN CAPITAL LETTER F WITH HOOK");
+    map.put('\u0192', "LATIN SMALL LETTER F WITH HOOK");
+    map.put('\u0193', "LATIN CAPITAL LETTER G WITH HOOK");
+    map.put('\u0194', "LATIN CAPITAL LETTER GAMMA");
+    map.put('\u0195', "LATIN SMALL LETTER HV");
+    map.put('\u0196', "LATIN CAPITAL LETTER IOTA");
+    map.put('\u0197', "LATIN CAPITAL LETTER I WITH STROKE");
+    map.put('\u0198', "LATIN CAPITAL LETTER K WITH HOOK");
+    map.put('\u0199', "LATIN SMALL LETTER K WITH HOOK");
+    map.put('\u019A', "LATIN SMALL LETTER L WITH BAR");
+    map.put('\u019B', "LATIN SMALL LETTER LAMBDA WITH STROKE");
+    map.put('\u019C', "LATIN CAPITAL LETTER TURNED M");
+    map.put('\u019D', "LATIN CAPITAL LETTER N WITH LEFT HOOK");
+    map.put('\u019E', "LATIN SMALL LETTER N WITH LONG RIGHT LEG");
+    map.put('\u019F', "LATIN CAPITAL LETTER O WITH MIDDLE TILDE");
+    map.put('\u01A0', "LATIN CAPITAL LETTER O WITH HORN");
+    map.put('\u01A1', "LATIN SMALL LETTER O WITH HORN");
+    map.put('\u01A2', "LATIN CAPITAL LETTER OI");
+    map.put('\u01A3', "LATIN SMALL LETTER OI");
+    map.put('\u01A4', "LATIN CAPITAL LETTER P WITH HOOK");
+    map.put('\u01A5', "LATIN SMALL LETTER P WITH HOOK");
+    map.put('\u01A6', "LATIN LETTER YR");
+    map.put('\u01A7', "LATIN CAPITAL LETTER TONE TWO");
+    map.put('\u01A8', "LATIN SMALL LETTER TONE TWO");
+    map.put('\u01A9', "LATIN CAPITAL LETTER ESH");
+    map.put('\u01AA', "LATIN LETTER REVERSED ESH LOOP");
+    map.put('\u01AB', "LATIN SMALL LETTER T WITH PALATAL HOOK");
+    map.put('\u01AC', "LATIN CAPITAL LETTER T WITH HOOK");
+    map.put('\u01AD', "LATIN SMALL LETTER T WITH HOOK");
+    map.put('\u01AE', "LATIN CAPITAL LETTER T WITH RETROFLEX HOOK");
+    map.put('\u01AF', "LATIN CAPITAL LETTER U WITH HORN");
+    map.put('\u01B0', "LATIN SMALL LETTER U WITH HORN");
+    map.put('\u01B1', "LATIN CAPITAL LETTER UPSILON");
+    map.put('\u01B2', "LATIN CAPITAL LETTER V WITH HOOK");
+    map.put('\u01B3', "LATIN CAPITAL LETTER Y WITH HOOK");
+    map.put('\u01B4', "LATIN SMALL LETTER Y WITH HOOK");
+    map.put('\u01B5', "LATIN CAPITAL LETTER Z WITH STROKE");
+    map.put('\u01B6', "LATIN SMALL LETTER Z WITH STROKE");
+    map.put('\u01B7', "LATIN CAPITAL LETTER EZH");
+    map.put('\u01B8', "LATIN CAPITAL LETTER EZH REVERSED");
+    map.put('\u01B9', "LATIN SMALL LETTER EZH REVERSED");
+    map.put('\u01BA', "LATIN SMALL LETTER EZH WITH TAIL");
+    map.put('\u01BB', "LATIN LETTER TWO WITH STROKE");
+    map.put('\u01BC', "LATIN CAPITAL LETTER TONE FIVE");
+    map.put('\u01BD', "LATIN SMALL LETTER TONE FIVE");
+    map.put('\u01BE', "LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE");
+    map.put('\u01BF', "LATIN LETTER WYNN");
+
+    // African letters for clicks
+    map.put('\u01C0', "LATIN LETTER DENTAL CLICK");
+    map.put('\u01C1', "LATIN LETTER LATERAL CLICK");
+    map.put('\u01C2', "LATIN LETTER ALVEOLAR CLICK");
+    map.put('\u01C3', "LATIN LETTER RETROFLEX CLICK");
+
+    // Croatian digraphs matching Serbian Cyrillic letters
+    map.put('\u01C4', "LATIN CAPITAL LETTER DZ WITH CARON");
+    map.put('\u01C5', "LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON");
+    map.put('\u01C6', "LATIN SMALL LETTER DZ WITH CARON");
+    map.put('\u01C7', "LATIN CAPITAL LETTER LJ");
+    map.put('\u01C8', "LATIN CAPITAL LETTER L WITH SMALL LETTER J");
+    map.put('\u01C9', "LATIN SMALL LETTER LJ");
+    map.put('\u01CA', "LATIN CAPITAL LETTER NJ");
+    map.put('\u01CB', "LATIN CAPITAL LETTER N WITH SMALL LETTER J");
+    map.put('\u01CC', "LATIN SMALL LETTER NJ");
+
+    // Pinyin diacritic-vowel combinations
+    map.put('\u01CD', "LATIN CAPITAL LETTER A WITH CARON");
+    map.put('\u01CE', "LATIN SMALL LETTER A WITH CARON");
+    map.put('\u01CF', "LATIN CAPITAL LETTER I WITH CARON");
+    map.put('\u01D0', "LATIN SMALL LETTER I WITH CARON");
+    map.put('\u01D1', "LATIN CAPITAL LETTER O WITH CARON");
+    map.put('\u01D2', "LATIN SMALL LETTER O WITH CARON");
+    map.put('\u01D3', "LATIN CAPITAL LETTER U WITH CARON");
+    map.put('\u01D4', "LATIN SMALL LETTER U WITH CARON");
+    map.put('\u01D5', "LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON");
+    map.put('\u01D6', "LATIN SMALL LETTER U WITH DIAERESIS AND MACRON");
+    map.put('\u01D7', "LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE");
+    map.put('\u01D8', "LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE");
+    map.put('\u01D9', "LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON");
+    map.put('\u01DA', "LATIN SMALL LETTER U WITH DIAERESIS AND CARON");
+    map.put('\u01DB', "LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE");
+    map.put('\u01DC', "LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE");
+
+    // Phonetic and historic letters
+    map.put('\u01DD', "LATIN SMALL LETTER TURNED E");
+    map.put('\u01DE', "LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON");
+    map.put('\u01DF', "LATIN SMALL LETTER A WITH DIAERESIS AND MACRON");
+    map.put('\u01E0', "LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON");
+    map.put('\u01E1', "LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON");
+    map.put('\u01E2', "LATIN CAPITAL LETTER AE WITH MACRON");
+    map.put('\u01E3', "LATIN SMALL LETTER AE WITH MACRON");
+    map.put('\u01E4', "LATIN CAPITAL LETTER G WITH STROKE");
+    map.put('\u01E5', "LATIN SMALL LETTER G WITH STROKE");
+    map.put('\u01E6', "LATIN CAPITAL LETTER G WITH CARON");
+    map.put('\u01E7', "LATIN SMALL LETTER G WITH CARON");
+    map.put('\u01E8', "LATIN CAPITAL LETTER K WITH CARON");
+    map.put('\u01E9', "LATIN SMALL LETTER K WITH CARON");
+    map.put('\u01EA', "LATIN CAPITAL LETTER O WITH OGONEK");
+    map.put('\u01EB', "LATIN SMALL LETTER O WITH OGONEK");
+    map.put('\u01EC', "LATIN CAPITAL LETTER O WITH OGONEK AND MACRON");
+    map.put('\u01ED', "LATIN SMALL LETTER O WITH OGONEK AND MACRON");
+    map.put('\u01EE', "LATIN CAPITAL LETTER EZH WITH CARON");
+    map.put('\u01EF', "LATIN SMALL LETTER EZH WITH CARON");
+    map.put('\u01F0', "LATIN SMALL LETTER J WITH CARON");
+    map.put('\u01F1', "LATIN CAPITAL LETTER DZ");
+    map.put('\u01F2', "LATIN CAPITAL LETTER D WITH SMALL LETTER Z");
+    map.put('\u01F3', "LATIN SMALL LETTER DZ");
+    map.put('\u01F4', "LATIN CAPITAL LETTER G WITH ACUTE");
+    map.put('\u01F5', "LATIN SMALL LETTER G WITH ACUTE");
+    map.put('\u01F6', "LATIN CAPITAL LETTER HWAIR");
+    map.put('\u01F7', "LATIN CAPITAL LETTER WYNN");
+    map.put('\u01F8', "LATIN CAPITAL LETTER N WITH GRAVE");
+    map.put('\u01F9', "LATIN SMALL LETTER N WITH GRAVE");
+    map.put('\u01FA', "LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE");
+    map.put('\u01FB', "LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE");
+    map.put('\u01FC', "LATIN CAPITAL LETTER AE WITH ACUTE");
+    map.put('\u01FD', "LATIN SMALL LETTER AE WITH ACUTE");
+    map.put('\u01FE', "LATIN CAPITAL LETTER O WITH STROKE AND ACUTE");
+    map.put('\u01FF', "LATIN SMALL LETTER O WITH STROKE AND ACUTE");
+
+    // Additions for Slovenian and Croatian
+    map.put('\u0200', "LATIN CAPITAL LETTER A WITH DOUBLE GRAVE");
+    map.put('\u0201', "LATIN SMALL LETTER A WITH DOUBLE GRAVE");
+    map.put('\u0202', "LATIN CAPITAL LETTER A WITH INVERTED BREVE");
+    map.put('\u0203', "LATIN SMALL LETTER A WITH INVERTED BREVE");
+    map.put('\u0204', "LATIN CAPITAL LETTER E WITH DOUBLE GRAVE");
+    map.put('\u0205', "LATIN SMALL LETTER E WITH DOUBLE GRAVE");
+    map.put('\u0206', "LATIN CAPITAL LETTER E WITH INVERTED BREVE");
+    map.put('\u0207', "LATIN SMALL LETTER E WITH INVERTED BREVE");
+    map.put('\u0208', "LATIN CAPITAL LETTER I WITH DOUBLE GRAVE");
+    map.put('\u0209', "LATIN SMALL LETTER I WITH DOUBLE GRAVE");
+    map.put('\u020A', "LATIN CAPITAL LETTER I WITH INVERTED BREVE");
+    map.put('\u020B', "LATIN SMALL LETTER I WITH INVERTED BREVE");
+    map.put('\u020C', "LATIN CAPITAL LETTER O WITH DOUBLE GRAVE");
+    map.put('\u020D', "LATIN SMALL LETTER O WITH DOUBLE GRAVE");
+    map.put('\u020E', "LATIN CAPITAL LETTER O WITH INVERTED BREVE");
+    map.put('\u020F', "LATIN SMALL LETTER O WITH INVERTED BREVE");
+    map.put('\u0210', "LATIN CAPITAL LETTER R WITH DOUBLE GRAVE");
+    map.put('\u0211', "LATIN SMALL LETTER R WITH DOUBLE GRAVE");
+    map.put('\u0212', "LATIN CAPITAL LETTER R WITH INVERTED BREVE");
+    map.put('\u0213', "LATIN SMALL LETTER R WITH INVERTED BREVE");
+    map.put('\u0214', "LATIN CAPITAL LETTER U WITH DOUBLE GRAVE");
+    map.put('\u0215', "LATIN SMALL LETTER U WITH DOUBLE GRAVE");
+    map.put('\u0216', "LATIN CAPITAL LETTER U WITH INVERTED BREVE");
+    map.put('\u0217', "LATIN SMALL LETTER U WITH INVERTED BREVE");
+
+    // Additions for Romanian
+    map.put('\u0218', "LATIN CAPITAL LETTER S WITH COMMA BELOW");
+    map.put('\u0219', "LATIN SMALL LETTER S WITH COMMA BELOW");
+    map.put('\u021A', "LATIN CAPITAL LETTER T WITH COMMA BELOW");
+    map.put('\u021B', "LATIN SMALL LETTER T WITH COMMA BELOW");
+
+    // Miscellaneous additions
+    map.put('\u021C', "LATIN CAPITAL LETTER YOGH");
+    map.put('\u021D', "LATIN SMALL LETTER YOGH");
+    map.put('\u021E', "LATIN CAPITAL LETTER H WITH CARON");
+    map.put('\u021F', "LATIN SMALL LETTER H WITH CARON");
+    map.put('\u0220', "LATIN CAPITAL LETTER N WITH LONG RIGHT LEG");
+    map.put('\u0221', "LATIN SMALL LETTER D WITH CURL");
+    map.put('\u0222', "LATIN CAPITAL LETTER OU");
+    map.put('\u0223', "LATIN SMALL LETTER OU");
+    map.put('\u0224', "LATIN CAPITAL LETTER Z WITH HOOK");
+    map.put('\u0225', "LATIN SMALL LETTER Z WITH HOOK");
+    map.put('\u0226', "LATIN CAPITAL LETTER A WITH DOT ABOVE");
+    map.put('\u0227', "LATIN SMALL LETTER A WITH DOT ABOVE");
+    map.put('\u0228', "LATIN CAPITAL LETTER E WITH CEDILLA");
+    map.put('\u0229', "LATIN SMALL LETTER E WITH CEDILLA");
+
+    // Additions for Livonian
+    map.put('\u022A', "LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON");
+    map.put('\u022B', "LATIN SMALL LETTER O WITH DIAERESIS AND MACRON");
+    map.put('\u022C', "LATIN CAPITAL LETTER O WITH TILDE AND MACRON");
+    map.put('\u022D', "LATIN SMALL LETTER O WITH TILDE AND MACRON");
+    map.put('\u022E', "LATIN CAPITAL LETTER O WITH DOT ABOVE");
+    map.put('\u022F', "LATIN SMALL LETTER O WITH DOT ABOVE");
+    map.put('\u0230', "LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON");
+    map.put('\u0231', "LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON");
+    map.put('\u0232', "LATIN CAPITAL LETTER Y WITH MACRON");
+    map.put('\u0233', "LATIN SMALL LETTER Y WITH MACRON");
+
+    // Additions for Sinology
+    map.put('\u0234', "LATIN SMALL LETTER L WITH CURL");
+    map.put('\u0235', "LATIN SMALL LETTER N WITH CURL");
+    map.put('\u0236', "LATIN SMALL LETTER T WITH CURL");
+
+    // Miscellaneous additions
+    map.put('\u0237', "LATIN SMALL LETTER DOTLESS J");
+    map.put('\u0238', "LATIN SMALL LETTER DB DIGRAPH");
+    map.put('\u0239', "LATIN SMALL LETTER QP DIGRAPH");
+    map.put('\u023A', "LATIN CAPITAL LETTER A WITH STROKE");
+    map.put('\u023B', "LATIN CAPITAL LETTER C WITH STROKE");
+    map.put('\u023C', "LATIN SMALL LETTER C WITH STROKE");
+    map.put('\u023D', "LATIN CAPITAL LETTER L WITH BAR");
+    map.put('\u023E', "LATIN CAPITAL LETTER T WITH DIAGONAL STROKE");
+    map.put('\u023F', "LATIN SMALL LETTER S WITH SWASH TAIL");
+    map.put('\u0240', "LATIN SMALL LETTER Z WITH SWASH TAIL");
+    map.put('\u0241', "LATIN CAPITAL LETTER GLOTTAL STOP");
+    map.put('\u0242', "LATIN SMALL LETTER GLOTTAL STOP");
+    map.put('\u0243', "LATIN CAPITAL LETTER B WITH STROKE");
+    map.put('\u0244', "LATIN CAPITAL LETTER U BAR");
+    map.put('\u0245', "LATIN CAPITAL LETTER TURNED V");
+    map.put('\u0246', "LATIN CAPITAL LETTER E WITH STROKE");
+    map.put('\u0247', "LATIN SMALL LETTER E WITH STROKE");
+    map.put('\u0248', "LATIN CAPITAL LETTER J WITH STROKE");
+    map.put('\u0249', "LATIN SMALL LETTER J WITH STROKE");
+    map.put('\u024A', "LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL");
+    map.put('\u024B', "LATIN SMALL LETTER Q WITH HOOK TAIL");
+    map.put('\u024C', "LATIN CAPITAL LETTER R WITH STROKE");
+    map.put('\u024D', "LATIN SMALL LETTER R WITH STROKE");
+    map.put('\u024E', "LATIN CAPITAL LETTER Y WITH STROKE");
+    map.put('\u024F', "LATIN SMALL LETTER Y WITH STROKE");
+
+  }
+
+  public static final void ipaExtensions(Map<Character, String> map) {
+
+    // IPA extensions
+    map.put('\u0250', "LATIN SMALL LETTER TURNED A");
+    map.put('\u0251', "LATIN SMALL LETTER ALPHA");
+    map.put('\u0252', "LATIN SMALL LETTER TURNED ALPHA");
+    map.put('\u0253', "LATIN SMALL LETTER B WITH HOOK");
+    map.put('\u0254', "LATIN SMALL LETTER OPEN O");
+    map.put('\u0255', "LATIN SMALL LETTER C WITH CURL");
+    map.put('\u0256', "LATIN SMALL LETTER D WITH TAIL");
+    map.put('\u0257', "LATIN SMALL LETTER D WITH HOOK");
+    map.put('\u0258', "LATIN SMALL LETTER REVERSED E");
+    map.put('\u0259', "LATIN SMALL LETTER SCHWA");
+    map.put('\u025A', "LATIN SMALL LETTER SCHWA WITH HOOK");
+    map.put('\u025B', "LATIN SMALL LETTER OPEN E");
+    map.put('\u025C', "LATIN SMALL LETTER REVERSED OPEN E");
+    map.put('\u025D', "LATIN SMALL LETTER REVERSED OPEN E WITH HOOK");
+    map.put('\u025E', "LATIN SMALL LETTER CLOSED REVERSED OPEN E");
+    map.put('\u025F', "LATIN SMALL LETTER DOTLESS J WITH STROKE");
+    map.put('\u0260', "LATIN SMALL LETTER G WITH HOOK");
+    map.put('\u0261', "LATIN SMALL LETTER SCRIPT G");
+    map.put('\u0262', "LATIN LETTER SMALL CAPITAL G");
+    map.put('\u0263', "LATIN SMALL LETTER GAMMA");
+    map.put('\u0264', "LATIN SMALL LETTER RAMS HORN");
+    map.put('\u0265', "LATIN SMALL LETTER TURNED H");
+    map.put('\u0266', "LATIN SMALL LETTER H WITH HOOK");
+    map.put('\u0267', "LATIN SMALL LETTER HENG WITH HOOK");
+    map.put('\u0268', "LATIN SMALL LETTER I WITH STROKE");
+    map.put('\u0269', "LATIN SMALL LETTER IOTA");
+    map.put('\u026A', "LATIN LETTER SMALL CAPITAL I");
+    map.put('\u026B', "LATIN SMALL LETTER L WITH MIDDLE TILDE");
+    map.put('\u026C', "LATIN SMALL LETTER L WITH BELT");
+    map.put('\u026D', "LATIN SMALL LETTER L WITH RETROFLEX HOOK");
+    map.put('\u026E', "LATIN SMALL LETTER LEZH");
+    map.put('\u026F', "LATIN SMALL LETTER TURNED M");
+    map.put('\u0270', "LATIN SMALL LETTER TURNED M WITH LONG LEG");
+    map.put('\u0271', "LATIN SMALL LETTER M WITH HOOK");
+    map.put('\u0272', "LATIN SMALL LETTER N WITH LEFT HOOK");
+    map.put('\u0273', "LATIN SMALL LETTER N WITH RETROFLEX HOOK");
+    map.put('\u0274', "LATIN LETTER SMALL CAPITAL N");
+    map.put('\u0275', "LATIN SMALL LETTER BARRED O");
+    map.put('\u0276', "LATIN LETTER SMALL CAPITAL OE");
+    map.put('\u0277', "LATIN SMALL LETTER CLOSED OMEGA");
+    map.put('\u0278', "LATIN SMALL LETTER PHI");
+    map.put('\u0279', "LATIN SMALL LETTER TURNED R");
+    map.put('\u027A', "LATIN SMALL LETTER TURNED R WITH LONG LEG");
+    map.put('\u027B', "LATIN SMALL LETTER TURNED R WITH HOOK");
+    map.put('\u027C', "LATIN SMALL LETTER R WITH LONG LEG");
+    map.put('\u027D', "LATIN SMALL LETTER R WITH TAIL");
+    map.put('\u027E', "LATIN SMALL LETTER R WITH FISHHOOK");
+    map.put('\u027F', "LATIN SMALL LETTER REVERSED R WITH FISHHOOK");
+    map.put('\u0280', "LATIN LETTER SMALL CAPITAL R");
+    map.put('\u0281', "LATIN LETTER SMALL CAPITAL INVERTED R");
+    map.put('\u0282', "LATIN SMALL LETTER S WITH HOOK");
+    map.put('\u0283', "LATIN SMALL LETTER ESH");
+    map.put('\u0284', "LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK");
+    map.put('\u0285', "LATIN SMALL LETTER SQUAT REVERSED ESH");
+    map.put('\u0286', "LATIN SMALL LETTER ESH WITH CURL");
+    map.put('\u0287', "LATIN SMALL LETTER TURNED T");
+    map.put('\u0288', "LATIN SMALL LETTER T WITH RETROFLEX HOOK");
+    map.put('\u0289', "LATIN SMALL LETTER U BAR");
+    map.put('\u028A', "LATIN SMALL LETTER UPSILON");
+    map.put('\u028B', "LATIN SMALL LETTER V WITH HOOK");
+    map.put('\u028C', "LATIN SMALL LETTER TURNED V");
+    map.put('\u028D', "LATIN SMALL LETTER TURNED W");
+    map.put('\u028E', "LATIN SMALL LETTER TURNED Y");
+    map.put('\u028F', "LATIN LETTER SMALL CAPITAL Y");
+    map.put('\u0290', "LATIN SMALL LETTER Z WITH RETROFLEX HOOK");
+    map.put('\u0291', "LATIN SMALL LETTER Z WITH CURL");
+    map.put('\u0292', "LATIN SMALL LETTER EZH");
+    map.put('\u0293', "LATIN SMALL LETTER EZH WITH CURL");
+    map.put('\u0294', "LATIN LETTER GLOTTAL STOP");
+    map.put('\u0295', "LATIN LETTER PHARYNGEAL VOICED FRICATIVE");
+    map.put('\u0296', "LATIN LETTER INVERTED GLOTTAL STOP");
+    map.put('\u0297', "LATIN LETTER STRETCHED C");
+    map.put('\u0298', "LATIN LETTER BILABIAL CLICK");
+    map.put('\u0299', "LATIN LETTER SMALL CAPITAL B");
+    map.put('\u029A', "LATIN SMALL LETTER CLOSED OPEN E");
+    map.put('\u029B', "LATIN LETTER SMALL CAPITAL G WITH HOOK");
+    map.put('\u029C', "LATIN LETTER SMALL CAPITAL H");
+    map.put('\u029D', "LATIN SMALL LETTER J WITH CROSSED-TAIL");
+    map.put('\u029E', "LATIN SMALL LETTER TURNED K");
+    map.put('\u029F', "LATIN LETTER SMALL CAPITAL L");
+    map.put('\u02A0', "LATIN SMALL LETTER Q WITH HOOK");
+    map.put('\u02A1', "LATIN LETTER GLOTTAL STOP WITH STROKE");
+    map.put('\u02A2', "LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE");
+    map.put('\u02A3', "LATIN SMALL LETTER DZ DIGRAPH");
+    map.put('\u02A4', "LATIN SMALL LETTER DEZH DIGRAPH");
+    map.put('\u02A5', "LATIN SMALL LETTER DZ DIGRAPH WITH CURL");
+    map.put('\u02A6', "LATIN SMALL LETTER TS DIGRAPH");
+    map.put('\u02A7', "LATIN SMALL LETTER TESH DIGRAPH");
+    map.put('\u02A8', "LATIN SMALL LETTER TC DIGRAPH WITH CURL");
+
+    // IPA characters for disordered speech
+    map.put('\u02A9', "LATIN SMALL LETTER FENG DIGRAPH");
+    map.put('\u02AA', "LATIN SMALL LETTER LS DIGRAPH");
+    map.put('\u02AB', "LATIN SMALL LETTER LZ DIGRAPH");
+    map.put('\u02AC', "LATIN LETTER BILABIAL PERCUSSIVE");
+    map.put('\u02AD', "LATIN LETTER BIDENTAL PERCUSSIVE");
+
+    // Additions for Sinology
+    map.put('\u02AE', "LATIN SMALL LETTER TURNED H WITH FISHHOOK");
+    map.put('\u02AF', "LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL");
+
+  }
+
+  public static final void spacingModifierLetters(Map<Character, String> map) {
+
+    // Latin superscript modifier letters
+    map.put('\u02B0', "MODIFIER LETTER SMALL H");
+    map.put('\u02B1', "MODIFIER LETTER SMALL H WITH HOOK");
+    map.put('\u02B2', "MODIFIER LETTER SMALL J");
+    map.put('\u02B3', "MODIFIER LETTER SMALL R");
+    map.put('\u02B4', "MODIFIER LETTER SMALL TURNED R");
+    map.put('\u02B5', "MODIFIER LETTER SMALL TURNED R WITH HOOK");
+    map.put('\u02B6', "MODIFIER LETTER SMALL CAPITAL INVERTED R");
+    map.put('\u02B7', "MODIFIER LETTER SMALL W");
+    map.put('\u02B8', "MODIFIER LETTER SMALL Y");
+
+    // Miscellaneous phonetic modifiers
+    map.put('\u02B9', "MODIFIER LETTER PRIME");
+    map.put('\u02BA', "MODIFIER LETTER DOUBLE PRIME");
+    map.put('\u02BB', "MODIFIER LETTER TURNED COMMA");
+    map.put('\u02BC', "MODIFIER LETTER APOSTROPHE");
+    map.put('\u02BD', "MODIFIER LETTER REVERSED COMMA");
+    map.put('\u02BE', "MODIFIER LETTER RIGHT HALF RING");
+    map.put('\u02BF', "MODIFIER LETTER LEFT HALF RING");
+    map.put('\u02C0', "MODIFIER LETTER GLOTTAL STOP");
+    map.put('\u02C1', "MODIFIER LETTER REVERSED GLOTTAL STOP");
+    map.put('\u02C2', "MODIFIER LETTER LEFT ARROWHEAD");
+    map.put('\u02C3', "MODIFIER LETTER RIGHT ARROWHEAD");
+    map.put('\u02C4', "MODIFIER LETTER UP ARROWHEAD");
+    map.put('\u02C5', "MODIFIER LETTER DOWN ARROWHEAD");
+    map.put('\u02C6', "MODIFIER LETTER CIRCUMFLEX ACCENT");
+    map.put('\u02C7', "CARON");
+    map.put('\u02C8', "MODIFIER LETTER VERTICAL LINE");
+    map.put('\u02C9', "MODIFIER LETTER MACRON");
+    map.put('\u02CA', "MODIFIER LETTER ACUTE ACCENT");
+    map.put('\u02CB', "MODIFIER LETTER GRAVE ACCENT");
+    map.put('\u02CC', "MODIFIER LETTER LOW VERTICAL LINE");
+    map.put('\u02CD', "MODIFIER LETTER LOW MACRON");
+    map.put('\u02CE', "MODIFIER LETTER LOW GRAVE ACCENT");
+    map.put('\u02CF', "MODIFIER LETTER LOW ACUTE ACCENT");
+    map.put('\u02D0', "MODIFIER LETTER TRIANGULAR COLON");
+    map.put('\u02D1', "MODIFIER LETTER HALF TRIANGULAR COLON");
+    map.put('\u02D2', "MODIFIER LETTER CENTRED RIGHT HALF RING");
+    map.put('\u02D3', "MODIFIER LETTER CENTRED LEFT HALF RING");
+    map.put('\u02D4', "MODIFIER LETTER UP TACK");
+    map.put('\u02D5', "MODIFIER LETTER DOWN TACK");
+    map.put('\u02D6', "MODIFIER LETTER PLUS SIGN");
+    map.put('\u02D7', "MODIFIER LETTER MINUS SIGN");
+
+    // Spacing clones of diacritics
+    map.put('\u02D8', "BREVE");
+    map.put('\u02D9', "DOT ABOVE");
+    map.put('\u02DA', "RING ABOVE");
+    map.put('\u02DB', "OGONEK");
+    map.put('\u02DC', "SMALL TILDE");
+    map.put('\u02DD', "DOUBLE ACUTE ACCENT");
+
+    // Additions based on 1989 IPA
+    map.put('\u02DE', "MODIFIER LETTER RHOTIC HOOK");
+    map.put('\u02DF', "MODIFIER LETTER CROSS ACCENT");
+    map.put('\u02E0', "MODIFIER LETTER SMALL GAMMA");
+    map.put('\u02E1', "MODIFIER LETTER SMALL L");
+    map.put('\u02E2', "MODIFIER LETTER SMALL S");
+    map.put('\u02E3', "MODIFIER LETTER SMALL X");
+    map.put('\u02E4', "MODIFIER LETTER SMALL REVERSED GLOTTAL STOP");
+
+    // Tone letters
+    map.put('\u02E5', "MODIFIER LETTER EXTRA-HIGH TONE BAR");
+    map.put('\u02E6', "MODIFIER LETTER HIGH TONE BAR");
+    map.put('\u02E7', "MODIFIER LETTER MID TONE BAR");
+    map.put('\u02E8', "MODIFIER LETTER LOW TONE BAR");
+    map.put('\u02E9', "MODIFIER LETTER EXTRA-LOW TONE BAR");
+
+    // Extended Bopomofo tone marks
+    map.put('\u02EA', "MODIFIER LETTER YIN DEPARTING TONE MARK");
+    map.put('\u02EB', "MODIFIER LETTER YANG DEPARTING TONE MARK");
+
+    // IPA modifiers
+    map.put('\u02EC', "MODIFIER LETTER VOICING");
+    map.put('\u02ED', "MODIFIER LETTER UNASPIRATED");
+
+    // Other modifier letter
+    map.put('\u02EE', "MODIFIER LETTER DOUBLE APOSTROPHE");
+
+    // UPA modifiers
+    map.put('\u02EF', "MODIFIER LETTER LOW DOWN ARROWHEAD");
+    map.put('\u02F0', "MODIFIER LETTER LOW UP ARROWHEAD");
+    map.put('\u02F1', "MODIFIER LETTER LOW LEFT ARROWHEAD");
+    map.put('\u02F2', "MODIFIER LETTER LOW RIGHT ARROWHEAD");
+    map.put('\u02F3', "MODIFIER LETTER LOW RING");
+    map.put('\u02F4', "MODIFIER LETTER MIDDLE GRAVE ACCENT");
+    map.put('\u02F5', "MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT");
+    map.put('\u02F6', "MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT");
+    map.put('\u02F7', "MODIFIER LETTER LOW TILDE");
+    map.put('\u02F8', "MODIFIER LETTER RAISED COLON");
+    map.put('\u02F9', "MODIFIER LETTER BEGIN HIGH TONE");
+    map.put('\u02FA', "MODIFIER LETTER END HIGH TONE");
+    map.put('\u02FB', "MODIFIER LETTER BEGIN LOW TONE");
+    map.put('\u02FC', "MODIFIER LETTER END LOW TONE");
+    map.put('\u02FD', "MODIFIER LETTER SHELF");
+    map.put('\u02FE', "MODIFIER LETTER OPEN SHELF");
+    map.put('\u02FF', "MODIFIER LETTER LOW LEFT ARROW");
+
+  }
+
+  public static final void combiningDiacriticMarks(Map<Character, String> map) {
+
+    // Ordinary diacritics
+    map.put('\u0300', "COMBINING GRAVE ACCENT");
+    map.put('\u0301', "COMBINING ACUTE ACCENT");
+    map.put('\u0302', "COMBINING CIRCUMFLEX ACCENT");
+    map.put('\u0303', "COMBINING TILDE");
+    map.put('\u0304', "COMBINING MACRON");
+    map.put('\u0305', "COMBINING OVERLINE");
+    map.put('\u0306', "COMBINING BREVE");
+    map.put('\u0307', "COMBINING DOT ABOVE");
+    map.put('\u0308', "COMBINING DIAERESIS");
+    map.put('\u0309', "COMBINING HOOK ABOVE");
+    map.put('\u030A', "COMBINING RING ABOVE");
+    map.put('\u030B', "COMBINING DOUBLE ACUTE ACCENT");
+    map.put('\u030C', "COMBINING CARON");
+    map.put('\u030D', "COMBINING VERTICAL LINE ABOVE");
+    map.put('\u030E', "COMBINING DOUBLE VERTICAL LINE ABOVE");
+    map.put('\u030F', "COMBINING DOUBLE GRAVE ACCENT");
+    map.put('\u0310', "COMBINING CANDRABINDU");
+    map.put('\u0311', "COMBINING INVERTED BREVE");
+    map.put('\u0312', "COMBINING TURNED COMMA ABOVE");
+    map.put('\u0313', "COMBINING COMMA ABOVE");
+    map.put('\u0314', "COMBINING REVERSED COMMA ABOVE");
+    map.put('\u0315', "COMBINING COMMA ABOVE RIGHT");
+    map.put('\u0316', "COMBINING GRAVE ACCENT BELOW");
+    map.put('\u0317', "COMBINING ACUTE ACCENT BELOW");
+    map.put('\u0318', "COMBINING LEFT TACK BELOW");
+    map.put('\u0319', "COMBINING RIGHT TACK BELOW");
+    map.put('\u031A', "COMBINING LEFT ANGLE ABOVE");
+    map.put('\u031B', "COMBINING HORN");
+    map.put('\u031C', "COMBINING LEFT HALF RING BELOW");
+    map.put('\u031D', "COMBINING UP TACK BELOW");
+    map.put('\u031E', "COMBINING DOWN TACK BELOW");
+    map.put('\u031F', "COMBINING PLUS SIGN BELOW");
+    map.put('\u0320', "COMBINING MINUS SIGN BELOW");
+    map.put('\u0321', "COMBINING PALATALIZED HOOK BELOW");
+    map.put('\u0322', "COMBINING RETROFLEX HOOK BELOW");
+    map.put('\u0323', "COMBINING DOT BELOW");
+    map.put('\u0324', "COMBINING DIAERESIS BELOW");
+    map.put('\u0325', "COMBINING RING BELOW");
+    map.put('\u0326', "COMBINING COMMA BELOW");
+    map.put('\u0327', "COMBINING CEDILLA");
+    map.put('\u0328', "COMBINING OGONEK");
+    map.put('\u0329', "COMBINING VERTICAL LINE BELOW");
+    map.put('\u032A', "COMBINING BRIDGE BELOW");
+    map.put('\u032B', "COMBINING INVERTED DOUBLE ARCH BELOW");
+    map.put('\u032C', "COMBINING CARON BELOW");
+    map.put('\u032D', "COMBINING CIRCUMFLEX ACCENT BELOW");
+    map.put('\u032E', "COMBINING BREVE BELOW");
+    map.put('\u032F', "COMBINING INVERTED BREVE BELOW");
+    map.put('\u0330', "COMBINING TILDE BELOW");
+    map.put('\u0331', "COMBINING MACRON BELOW");
+    map.put('\u0332', "COMBINING LOW LINE");
+    map.put('\u0333', "COMBINING DOUBLE LOW LINE");
+
+    // Overstruck diacritics
+    map.put('\u0334', "COMBINING TILDE OVERLAY");
+    map.put('\u0335', "COMBINING SHORT STROKE OVERLAY");
+    map.put('\u0336', "COMBINING LONG STROKE OVERLAY");
+    map.put('\u0337', "COMBINING SHORT SOLIDUS OVERLAY");
+    map.put('\u0338', "COMBINING LONG SOLIDUS OVERLAY");
+
+    // Additions
+    map.put('\u0339', "COMBINING RIGHT HALF RING BELOW");
+    map.put('\u033A', "COMBINING INVERTED BRIDGE BELOW");
+    map.put('\u033B', "COMBINING SQUARE BELOW");
+    map.put('\u033C', "COMBINING SEAGULL BELOW");
+    map.put('\u033D', "COMBINING X ABOVE");
+    map.put('\u033E', "COMBINING VERTICAL TILDE");
+    map.put('\u033F', "COMBINING DOUBLE OVERLINE");
+
+    // Vietnamese tone marks
+    map.put('\u0340', "COMBINING GRAVE TONE MARK");
+    map.put('\u0341', "COMBINING ACUTE TONE MARK");
+
+    // Additions for Greek
+    map.put('\u0342', "COMBINING GREEK PERISPOMENI");
+    map.put('\u0343', "COMBINING GREEK KORONIS");
+    map.put('\u0344', "COMBINING GREEK DIALYTIKA TONOS");
+    map.put('\u0345', "COMBINING GREEK YPOGEGRAMMENI");
+
+    // Additions for IPA
+    map.put('\u0346', "COMBINING BRIDGE ABOVE");
+    map.put('\u0347', "COMBINING EQUALS SIGN BELOW");
+    map.put('\u0348', "COMBINING DOUBLE VERTICAL LINE BELOW");
+    map.put('\u0349', "COMBINING LEFT ANGLE BELOW");
+    map.put('\u034A', "COMBINING NOT TILDE ABOVE");
+
+    // IPA diacritics for disordered speech
+    map.put('\u034B', "COMBINING HOMOTHETIC ABOVE");
+    map.put('\u034C', "COMBINING ALMOST EQUAL TO ABOVE");
+    map.put('\u034D', "COMBINING LEFT RIGHT ARROW BELOW");
+    map.put('\u034E', "COMBINING UPWARDS ARROW BELOW");
+
+    // Grapheme joiner
+    map.put('\u034F', "COMBINING GRAPHEME JOINER");
+
+    // Additions for the Uralic Phonetic Alphabet
+    map.put('\u0350', "COMBINING RIGHT ARROWHEAD ABOVE");
+    map.put('\u0351', "COMBINING LEFT HALF RING ABOVE");
+    map.put('\u0352', "COMBINING FERMATA");
+    map.put('\u0353', "COMBINING X BELOW");
+    map.put('\u0354', "COMBINING LEFT ARROWHEAD BELOW");
+    map.put('\u0355', "COMBINING RIGHT ARROWHEAD BELOW");
+    map.put('\u0356', "COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW");
+    map.put('\u0357', "COMBINING RIGHT HALF RING ABOVE");
+
+    // Miscellaneous additions
+    map.put('\u0358', "COMBINING DOT ABOVE RIGHT");
+    map.put('\u0359', "COMBINING ASTERISK BELOW");
+    map.put('\u035A', "COMBINING DOUBLE RING BELOW");
+    map.put('\u035B', "COMBINING ZIGZAG ABOVE");
+
+    // Double diacritics
+    map.put('\u035C', "COMBINING DOUBLE BREVE BELOW");
+    map.put('\u035D', "COMBINING DOUBLE BREVE");
+    map.put('\u035E', "COMBINING DOUBLE MACRON");
+    map.put('\u035F', "COMBINING DOUBLE MACRON BELOW");
+    map.put('\u0360', "COMBINING DOUBLE TILDE");
+    map.put('\u0361', "COMBINING DOUBLE INVERTED BREVE");
+    map.put('\u0362', "COMBINING DOUBLE RIGHTWARDS ARROW BELOW");
+
+    // Medieval superscript letter diacritics
+    map.put('\u0363', "COMBINING LATIN SMALL LETTER A");
+    map.put('\u0364', "COMBINING LATIN SMALL LETTER E");
+    map.put('\u0365', "COMBINING LATIN SMALL LETTER I");
+    map.put('\u0366', "COMBINING LATIN SMALL LETTER O");
+    map.put('\u0367', "COMBINING LATIN SMALL LETTER U");
+    map.put('\u0368', "COMBINING LATIN SMALL LETTER C");
+    map.put('\u0369', "COMBINING LATIN SMALL LETTER D");
+    map.put('\u036A', "COMBINING LATIN SMALL LETTER H");
+    map.put('\u036B', "COMBINING LATIN SMALL LETTER M");
+    map.put('\u036C', "COMBINING LATIN SMALL LETTER R");
+    map.put('\u036D', "COMBINING LATIN SMALL LETTER T");
+    map.put('\u036E', "COMBINING LATIN SMALL LETTER V");
+    map.put('\u036F', "COMBINING LATIN SMALL LETTER X");
+
+  }
+
+  public static final void greekAndCoptic(Map<Character, String> map) {
+
+    map.put('\u0370', "GREEK CAPITAL LETTER HETA");
+    map.put('\u0371', "GREEK SMALL LETTER HETA");
+    map.put('\u0372', "GREEK CAPITAL LETTER ARCHAIC SAMPI");
+    map.put('\u0373', "GREEK SMALL LETTER ARCHAIC SAMPI");
+    map.put('\u0374', "GREEK NUMERAL SIGN");
+    map.put('\u0375', "GREEK LOWER NUMERAL SIGN");
+    map.put('\u0376', "GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA");
+    map.put('\u0377', "GREEK SMALL LETTER PAMPHYLIAN DIGAMMA");
+    map.put('\u037A', "GREEK YPOGEGRAMMENI");
+    map.put('\u037B', "GREEK SMALL REVERSED LUNATE SIGMA SYMBOL");
+    map.put('\u037C', "GREEK SMALL DOTTED LUNATE SIGMA SYMBOL");
+    map.put('\u037D', "GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL");
+    map.put('\u037E', "GREEK QUESTION MARK");
+    map.put('\u0384', "GREEK TONOS");
+    map.put('\u0385', "GREEK DIALYTIKA TONOS");
+    map.put('\u0386', "GREEK CAPITAL LETTER ALPHA WITH TONOS");
+    map.put('\u0387', "GREEK ANO TELEIA");
+    map.put('\u0388', "GREEK CAPITAL LETTER EPSILON WITH TONOS");
+    map.put('\u0389', "GREEK CAPITAL LETTER ETA WITH TONOS");
+    map.put('\u038A', "GREEK CAPITAL LETTER IOTA WITH TONOS");
+    map.put('\u038C', "GREEK CAPITAL LETTER OMICRON WITH TONOS");
+    map.put('\u038E', "GREEK CAPITAL LETTER UPSILON WITH TONOS");
+    map.put('\u038F', "GREEK CAPITAL LETTER OMEGA WITH TONOS");
+    map.put('\u0390', "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS");
+    map.put('\u0391', "GREEK CAPITAL LETTER ALPHA");
+    map.put('\u0392', "GREEK CAPITAL LETTER BETA");
+    map.put('\u0393', "GREEK CAPITAL LETTER GAMMA");
+    map.put('\u0394', "GREEK CAPITAL LETTER DELTA");
+    map.put('\u0395', "GREEK CAPITAL LETTER EPSILON");
+    map.put('\u0396', "GREEK CAPITAL LETTER ZETA");
+    map.put('\u0397', "GREEK CAPITAL LETTER ETA");
+    map.put('\u0398', "GREEK CAPITAL LETTER THETA");
+    map.put('\u0399', "GREEK CAPITAL LETTER IOTA");
+    map.put('\u039A', "GREEK CAPITAL LETTER KAPPA");
+    map.put('\u039B', "GREEK CAPITAL LETTER LAMDA");
+    map.put('\u039C', "GREEK CAPITAL LETTER MU");
+    map.put('\u039D', "GREEK CAPITAL LETTER NU");
+    map.put('\u039E', "GREEK CAPITAL LETTER XI");
+    map.put('\u039F', "GREEK CAPITAL LETTER OMICRON");
+    map.put('\u03A0', "GREEK CAPITAL LETTER PI");
+    map.put('\u03A1', "GREEK CAPITAL LETTER RHO");
+    map.put('\u03A3', "GREEK CAPITAL LETTER SIGMA");
+    map.put('\u03A4', "GREEK CAPITAL LETTER TAU");
+    map.put('\u03A5', "GREEK CAPITAL LETTER UPSILON");
+    map.put('\u03A6', "GREEK CAPITAL LETTER PHI");
+    map.put('\u03A7', "GREEK CAPITAL LETTER CHI");
+    map.put('\u03A8', "GREEK CAPITAL LETTER PSI");
+    map.put('\u03A9', "GREEK CAPITAL LETTER OMEGA");
+    map.put('\u03AA', "GREEK CAPITAL LETTER IOTA WITH DIALYTIKA");
+    map.put('\u03AB', "GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA");
+    map.put('\u03AC', "GREEK SMALL LETTER ALPHA WITH TONOS");
+    map.put('\u03AD', "GREEK SMALL LETTER EPSILON WITH TONOS");
+    map.put('\u03AE', "GREEK SMALL LETTER ETA WITH TONOS");
+    map.put('\u03AF', "GREEK SMALL LETTER IOTA WITH TONOS");
+    map.put('\u03B0', "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS");
+    map.put('\u03B1', "GREEK SMALL LETTER ALPHA");
+    map.put('\u03B2', "GREEK SMALL LETTER BETA");
+    map.put('\u03B3', "GREEK SMALL LETTER GAMMA");
+    map.put('\u03B4', "GREEK SMALL LETTER DELTA");
+    map.put('\u03B5', "GREEK SMALL LETTER EPSILON");
+    map.put('\u03B6', "GREEK SMALL LETTER ZETA");
+    map.put('\u03B7', "GREEK SMALL LETTER ETA");
+    map.put('\u03B8', "GREEK SMALL LETTER THETA");
+    map.put('\u03B9', "GREEK SMALL LETTER IOTA");
+    map.put('\u03BA', "GREEK SMALL LETTER KAPPA");
+    map.put('\u03BB', "GREEK SMALL LETTER LAMDA");
+    map.put('\u03BC', "GREEK SMALL LETTER MU");
+    map.put('\u03BD', "GREEK SMALL LETTER NU");
+    map.put('\u03BE', "GREEK SMALL LETTER XI");
+    map.put('\u03BF', "GREEK SMALL LETTER OMICRON");
+    map.put('\u03C0', "GREEK SMALL LETTER PI");
+    map.put('\u03C1', "GREEK SMALL LETTER RHO");
+    map.put('\u03C2', "GREEK SMALL LETTER FINAL SIGMA");
+    map.put('\u03C3', "GREEK SMALL LETTER SIGMA");
+    map.put('\u03C4', "GREEK SMALL LETTER TAU");
+    map.put('\u03C5', "GREEK SMALL LETTER UPSILON");
+    map.put('\u03C6', "GREEK SMALL LETTER PHI");
+    map.put('\u03C7', "GREEK SMALL LETTER CHI");
+    map.put('\u03C8', "GREEK SMALL LETTER PSI");
+    map.put('\u03C9', "GREEK SMALL LETTER OMEGA");
+    map.put('\u03CA', "GREEK SMALL LETTER IOTA WITH DIALYTIKA");
+    map.put('\u03CB', "GREEK SMALL LETTER UPSILON WITH DIALYTIKA");
+    map.put('\u03CC', "GREEK SMALL LETTER OMICRON WITH TONOS");
+    map.put('\u03CD', "GREEK SMALL LETTER UPSILON WITH TONOS");
+    map.put('\u03CE', "GREEK SMALL LETTER OMEGA WITH TONOS");
+    map.put('\u03CF', "GREEK CAPITAL KAI SYMBOL");
+    map.put('\u03D0', "GREEK BETA SYMBOL");
+    map.put('\u03D1', "GREEK THETA SYMBOL");
+    map.put('\u03D2', "GREEK UPSILON WITH HOOK SYMBOL");
+    map.put('\u03D3', "GREEK UPSILON WITH ACUTE AND HOOK SYMBOL");
+    map.put('\u03D4', "GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL");
+    map.put('\u03D5', "GREEK PHI SYMBOL");
+    map.put('\u03D6', "GREEK PI SYMBOL");
+    map.put('\u03D7', "GREEK KAI SYMBOL");
+    map.put('\u03D8', "GREEK LETTER ARCHAIC KOPPA");
+    map.put('\u03D9', "GREEK SMALL LETTER ARCHAIC KOPPA");
+    map.put('\u03DA', "GREEK LETTER STIGMA");
+    map.put('\u03DB', "GREEK SMALL LETTER STIGMA");
+    map.put('\u03DC', "GREEK LETTER DIGAMMA");
+    map.put('\u03DD', "GREEK SMALL LETTER DIGAMMA");
+    map.put('\u03DE', "GREEK LETTER KOPPA");
+    map.put('\u03DF', "GREEK SMALL LETTER KOPPA");
+    map.put('\u03E0', "GREEK LETTER SAMPI");
+    map.put('\u03E1', "GREEK SMALL LETTER SAMPI");
+    map.put('\u03E2', "COPTIC CAPITAL LETTER SHEI");
+    map.put('\u03E3', "COPTIC SMALL LETTER SHEI");
+    map.put('\u03E4', "COPTIC CAPITAL LETTER FEI");
+    map.put('\u03E5', "COPTIC SMALL LETTER FEI");
+    map.put('\u03E6', "COPTIC CAPITAL LETTER KHEI");
+    map.put('\u03E7', "COPTIC SMALL LETTER KHEI");
+    map.put('\u03E8', "COPTIC CAPITAL LETTER HORI");
+    map.put('\u03E9', "COPTIC SMALL LETTER HORI");
+    map.put('\u03EA', "COPTIC CAPITAL LETTER GANGIA");
+    map.put('\u03EB', "COPTIC SMALL LETTER GANGIA");
+    map.put('\u03EC', "COPTIC CAPITAL LETTER SHIMA");
+    map.put('\u03ED', "COPTIC SMALL LETTER SHIMA");
+    map.put('\u03EE', "COPTIC CAPITAL LETTER DEI");
+    map.put('\u03EF', "COPTIC SMALL LETTER DEI");
+    map.put('\u03F0', "GREEK KAPPA SYMBOL");
+    map.put('\u03F1', "GREEK RHO SYMBOL");
+    map.put('\u03F2', "GREEK LUNATE SIGMA SYMBOL");
+    map.put('\u03F3', "GREEK LETTER YOT");
+    map.put('\u03F4', "GREEK CAPITAL THETA SYMBOL");
+    map.put('\u03F5', "GREEK LUNATE EPSILON SYMBOL");
+    map.put('\u03F6', "GREEK REVERSED LUNATE EPSILON SYMBOL");
+    map.put('\u03F7', "GREEK CAPITAL LETTER SHO");
+    map.put('\u03F8', "GREEK SMALL LETTER SHO");
+    map.put('\u03F9', "GREEK CAPITAL LUNATE SIGMA SYMBOL");
+    map.put('\u03FA', "GREEK CAPITAL LETTER SAN");
+    map.put('\u03FB', "GREEK SMALL LETTER SAN");
+    map.put('\u03FC', "GREEK RHO WITH STROKE SYMBOL");
+    map.put('\u03FD', "GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL");
+    map.put('\u03FE', "GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL");
+    map.put('\u03FF', "GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL");
+
+  }
+
+  public static final void cyrillic(Map<Character, String> map) {
+
+    map.put('\u0400', "CYRILLIC CAPITAL LETTER IE WITH GRAVE");
+    map.put('\u0401', "CYRILLIC CAPITAL LETTER IO");
+    map.put('\u0402', "CYRILLIC CAPITAL LETTER DJE");
+    map.put('\u0403', "CYRILLIC CAPITAL LETTER GJE");
+    map.put('\u0404', "CYRILLIC CAPITAL LETTER UKRAINIAN IE");
+    map.put('\u0405', "CYRILLIC CAPITAL LETTER DZE");
+    map.put('\u0406', "CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I");
+    map.put('\u0407', "CYRILLIC CAPITAL LETTER YI");
+    map.put('\u0408', "CYRILLIC CAPITAL LETTER JE");
+    map.put('\u0409', "CYRILLIC CAPITAL LETTER LJE");
+    map.put('\u040A', "CYRILLIC CAPITAL LETTER NJE");
+    map.put('\u040B', "CYRILLIC CAPITAL LETTER TSHE");
+    map.put('\u040C', "CYRILLIC CAPITAL LETTER KJE");
+    map.put('\u040D', "CYRILLIC CAPITAL LETTER I WITH GRAVE");
+    map.put('\u040E', "CYRILLIC CAPITAL LETTER SHORT U");
+    map.put('\u040F', "CYRILLIC CAPITAL LETTER DZHE");
+    map.put('\u0410', "CYRILLIC CAPITAL LETTER A");
+    map.put('\u0411', "CYRILLIC CAPITAL LETTER BE");
+    map.put('\u0412', "CYRILLIC CAPITAL LETTER VE");
+    map.put('\u0413', "CYRILLIC CAPITAL LETTER GHE");
+    map.put('\u0414', "CYRILLIC CAPITAL LETTER DE");
+    map.put('\u0415', "CYRILLIC CAPITAL LETTER IE");
+    map.put('\u0416', "CYRILLIC CAPITAL LETTER ZHE");
+    map.put('\u0417', "CYRILLIC CAPITAL LETTER ZE");
+    map.put('\u0418', "CYRILLIC CAPITAL LETTER I");
+    map.put('\u0419', "CYRILLIC CAPITAL LETTER SHORT I");
+    map.put('\u041A', "CYRILLIC CAPITAL LETTER KA");
+    map.put('\u041B', "CYRILLIC CAPITAL LETTER EL");
+    map.put('\u041C', "CYRILLIC CAPITAL LETTER EM");
+    map.put('\u041D', "CYRILLIC CAPITAL LETTER EN");
+    map.put('\u041E', "CYRILLIC CAPITAL LETTER O");
+    map.put('\u041F', "CYRILLIC CAPITAL LETTER PE");
+    map.put('\u0420', "CYRILLIC CAPITAL LETTER ER");
+    map.put('\u0421', "CYRILLIC CAPITAL LETTER ES");
+    map.put('\u0422', "CYRILLIC CAPITAL LETTER TE");
+    map.put('\u0423', "CYRILLIC CAPITAL LETTER U");
+    map.put('\u0424', "CYRILLIC CAPITAL LETTER EF");
+    map.put('\u0425', "CYRILLIC CAPITAL LETTER HA");
+    map.put('\u0426', "CYRILLIC CAPITAL LETTER TSE");
+    map.put('\u0427', "CYRILLIC CAPITAL LETTER CHE");
+    map.put('\u0428', "CYRILLIC CAPITAL LETTER SHA");
+    map.put('\u0429', "CYRILLIC CAPITAL LETTER SHCHA");
+    map.put('\u042A', "CYRILLIC CAPITAL LETTER HARD SIGN");
+    map.put('\u042B', "CYRILLIC CAPITAL LETTER YERU");
+    map.put('\u042C', "CYRILLIC CAPITAL LETTER SOFT SIGN");
+    map.put('\u042D', "CYRILLIC CAPITAL LETTER E");
+    map.put('\u042E', "CYRILLIC CAPITAL LETTER YU");
+    map.put('\u042F', "CYRILLIC CAPITAL LETTER YA");
+    map.put('\u0430', "CYRILLIC SMALL LETTER A");
+    map.put('\u0431', "CYRILLIC SMALL LETTER BE");
+    map.put('\u0432', "CYRILLIC SMALL LETTER VE");
+    map.put('\u0433', "CYRILLIC SMALL LETTER GHE");
+    map.put('\u0434', "CYRILLIC SMALL LETTER DE");
+    map.put('\u0435', "CYRILLIC SMALL LETTER IE");
+    map.put('\u0436', "CYRILLIC SMALL LETTER ZHE");
+    map.put('\u0437', "CYRILLIC SMALL LETTER ZE");
+    map.put('\u0438', "CYRILLIC SMALL LETTER I");
+    map.put('\u0439', "CYRILLIC SMALL LETTER SHORT I");
+    map.put('\u043A', "CYRILLIC SMALL LETTER KA");
+    map.put('\u043B', "CYRILLIC SMALL LETTER EL");
+    map.put('\u043C', "CYRILLIC SMALL LETTER EM");
+    map.put('\u043D', "CYRILLIC SMALL LETTER EN");
+    map.put('\u043E', "CYRILLIC SMALL LETTER O");
+    map.put('\u043F', "CYRILLIC SMALL LETTER PE");
+    map.put('\u0440', "CYRILLIC SMALL LETTER ER");
+    map.put('\u0441', "CYRILLIC SMALL LETTER ES");
+    map.put('\u0442', "CYRILLIC SMALL LETTER TE");
+    map.put('\u0443', "CYRILLIC SMALL LETTER U");
+    map.put('\u0444', "CYRILLIC SMALL LETTER EF");
+    map.put('\u0445', "CYRILLIC SMALL LETTER HA");
+    map.put('\u0446', "CYRILLIC SMALL LETTER TSE");
+    map.put('\u0447', "CYRILLIC SMALL LETTER CHE");
+    map.put('\u0448', "CYRILLIC SMALL LETTER SHA");
+    map.put('\u0449', "CYRILLIC SMALL LETTER SHCHA");
+    map.put('\u044A', "CYRILLIC SMALL LETTER HARD SIGN");
+    map.put('\u044B', "CYRILLIC SMALL LETTER YERU");
+    map.put('\u044C', "CYRILLIC SMALL LETTER SOFT SIGN");
+    map.put('\u044D', "CYRILLIC SMALL LETTER E");
+    map.put('\u044E', "CYRILLIC SMALL LETTER YU");
+    map.put('\u044F', "CYRILLIC SMALL LETTER YA");
+    map.put('\u0450', "CYRILLIC SMALL LETTER IE WITH GRAVE");
+    map.put('\u0451', "CYRILLIC SMALL LETTER IO");
+    map.put('\u0452', "CYRILLIC SMALL LETTER DJE");
+    map.put('\u0453', "CYRILLIC SMALL LETTER GJE");
+    map.put('\u0454', "CYRILLIC SMALL LETTER UKRAINIAN IE");
+    map.put('\u0455', "CYRILLIC SMALL LETTER DZE");
+    map.put('\u0456', "CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I");
+    map.put('\u0457', "CYRILLIC SMALL LETTER YI");
+    map.put('\u0458', "CYRILLIC SMALL LETTER JE");
+    map.put('\u0459', "CYRILLIC SMALL LETTER LJE");
+    map.put('\u045A', "CYRILLIC SMALL LETTER NJE");
+    map.put('\u045B', "CYRILLIC SMALL LETTER TSHE");
+    map.put('\u045C', "CYRILLIC SMALL LETTER KJE");
+    map.put('\u045D', "CYRILLIC SMALL LETTER I WITH GRAVE");
+    map.put('\u045E', "CYRILLIC SMALL LETTER SHORT U");
+    map.put('\u045F', "CYRILLIC SMALL LETTER DZHE");
+    map.put('\u0460', "CYRILLIC CAPITAL LETTER OMEGA");
+    map.put('\u0461', "CYRILLIC SMALL LETTER OMEGA");
+    map.put('\u0462', "CYRILLIC CAPITAL LETTER YAT");
+    map.put('\u0463', "CYRILLIC SMALL LETTER YAT");
+    map.put('\u0464', "CYRILLIC CAPITAL LETTER IOTIFIED E");
+    map.put('\u0465', "CYRILLIC SMALL LETTER IOTIFIED E");
+    map.put('\u0466', "CYRILLIC CAPITAL LETTER LITTLE YUS");
+    map.put('\u0467', "CYRILLIC SMALL LETTER LITTLE YUS");
+    map.put('\u0468', "CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS");
+    map.put('\u0469', "CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS");
+    map.put('\u046A', "CYRILLIC CAPITAL LETTER BIG YUS");
+    map.put('\u046B', "CYRILLIC SMALL LETTER BIG YUS");
+    map.put('\u046C', "CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS");
+    map.put('\u046D', "CYRILLIC SMALL LETTER IOTIFIED BIG YUS");
+    map.put('\u046E', "CYRILLIC CAPITAL LETTER KSI");
+    map.put('\u046F', "CYRILLIC SMALL LETTER KSI");
+    map.put('\u0470', "CYRILLIC CAPITAL LETTER PSI");
+    map.put('\u0471', "CYRILLIC SMALL LETTER PSI");
+    map.put('\u0472', "CYRILLIC CAPITAL LETTER FITA");
+    map.put('\u0473', "CYRILLIC SMALL LETTER FITA");
+    map.put('\u0474', "CYRILLIC CAPITAL LETTER IZHITSA");
+    map.put('\u0475', "CYRILLIC SMALL LETTER IZHITSA");
+    map.put('\u0476', "CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT");
+    map.put('\u0477', "CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT");
+    map.put('\u0478', "CYRILLIC CAPITAL LETTER UK");
+    map.put('\u0479', "CYRILLIC SMALL LETTER UK");
+    map.put('\u047A', "CYRILLIC CAPITAL LETTER ROUND OMEGA");
+    map.put('\u047B', "CYRILLIC SMALL LETTER ROUND OMEGA");
+    map.put('\u047C', "CYRILLIC CAPITAL LETTER OMEGA WITH TITLO");
+    map.put('\u047D', "CYRILLIC SMALL LETTER OMEGA WITH TITLO");
+    map.put('\u047E', "CYRILLIC CAPITAL LETTER OT");
+    map.put('\u047F', "CYRILLIC SMALL LETTER OT");
+    map.put('\u0480', "CYRILLIC CAPITAL LETTER KOPPA");
+    map.put('\u0481', "CYRILLIC SMALL LETTER KOPPA");
+    map.put('\u0482', "CYRILLIC THOUSANDS SIGN");
+    map.put('\u0483', "COMBINING CYRILLIC TITLO");
+    map.put('\u0484', "COMBINING CYRILLIC PALATALIZATION");
+    map.put('\u0485', "COMBINING CYRILLIC DASIA PNEUMATA");
+    map.put('\u0486', "COMBINING CYRILLIC PSILI PNEUMATA");
+    map.put('\u0487', "COMBINING CYRILLIC POKRYTIE");
+    map.put('\u0488', "COMBINING CYRILLIC HUNDRED THOUSANDS SIGN");
+    map.put('\u0489', "COMBINING CYRILLIC MILLIONS SIGN");
+    map.put('\u048A', "CYRILLIC CAPITAL LETTER SHORT I WITH TAIL");
+    map.put('\u048B', "CYRILLIC SMALL LETTER SHORT I WITH TAIL");
+    map.put('\u048C', "CYRILLIC CAPITAL LETTER SEMISOFT SIGN");
+    map.put('\u048D', "CYRILLIC SMALL LETTER SEMISOFT SIGN");
+    map.put('\u048E', "CYRILLIC CAPITAL LETTER ER WITH TICK");
+    map.put('\u048F', "CYRILLIC SMALL LETTER ER WITH TICK");
+    map.put('\u0490', "CYRILLIC CAPITAL LETTER GHE WITH UPTURN");
+    map.put('\u0491', "CYRILLIC SMALL LETTER GHE WITH UPTURN");
+    map.put('\u0492', "CYRILLIC CAPITAL LETTER GHE WITH STROKE");
+    map.put('\u0493', "CYRILLIC SMALL LETTER GHE WITH STROKE");
+    map.put('\u0494', "CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK");
+    map.put('\u0495', "CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK");
+    map.put('\u0496', "CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER");
+    map.put('\u0497', "CYRILLIC SMALL LETTER ZHE WITH DESCENDER");
+    map.put('\u0498', "CYRILLIC CAPITAL LETTER ZE WITH DESCENDER");
+    map.put('\u0499', "CYRILLIC SMALL LETTER ZE WITH DESCENDER");
+    map.put('\u049A', "CYRILLIC CAPITAL LETTER KA WITH DESCENDER");
+    map.put('\u049B', "CYRILLIC SMALL LETTER KA WITH DESCENDER");
+    map.put('\u049C', "CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE");
+    map.put('\u049D', "CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE");
+    map.put('\u049E', "CYRILLIC CAPITAL LETTER KA WITH STROKE");
+    map.put('\u049F', "CYRILLIC SMALL LETTER KA WITH STROKE");
+    map.put('\u04A0', "CYRILLIC CAPITAL LETTER BASHKIR KA");
+    map.put('\u04A1', "CYRILLIC SMALL LETTER BASHKIR KA");
+    map.put('\u04A2', "CYRILLIC CAPITAL LETTER EN WITH DESCENDER");
+    map.put('\u04A3', "CYRILLIC SMALL LETTER EN WITH DESCENDER");
+    map.put('\u04A4', "CYRILLIC CAPITAL LIGATURE EN GHE");
+    map.put('\u04A5', "CYRILLIC SMALL LIGATURE EN GHE");
+    map.put('\u04A6', "CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK");
+    map.put('\u04A7', "CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK");
+    map.put('\u04A8', "CYRILLIC CAPITAL LETTER ABKHASIAN HA");
+    map.put('\u04A9', "CYRILLIC SMALL LETTER ABKHASIAN HA");
+    map.put('\u04AA', "CYRILLIC CAPITAL LETTER ES WITH DESCENDER");
+    map.put('\u04AB', "CYRILLIC SMALL LETTER ES WITH DESCENDER");
+    map.put('\u04AC', "CYRILLIC CAPITAL LETTER TE WITH DESCENDER");
+    map.put('\u04AD', "CYRILLIC SMALL LETTER TE WITH DESCENDER");
+    map.put('\u04AE', "CYRILLIC CAPITAL LETTER STRAIGHT U");
+    map.put('\u04AF', "CYRILLIC SMALL LETTER STRAIGHT U");
+    map.put('\u04B0', "CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE");
+    map.put('\u04B1', "CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE");
+    map.put('\u04B2', "CYRILLIC CAPITAL LETTER HA WITH DESCENDER");
+    map.put('\u04B3', "CYRILLIC SMALL LETTER HA WITH DESCENDER");
+    map.put('\u04B4', "CYRILLIC CAPITAL LIGATURE TE TSE");
+    map.put('\u04B5', "CYRILLIC SMALL LIGATURE TE TSE");
+    map.put('\u04B6', "CYRILLIC CAPITAL LETTER CHE WITH DESCENDER");
+    map.put('\u04B7', "CYRILLIC SMALL LETTER CHE WITH DESCENDER");
+    map.put('\u04B8', "CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE");
+    map.put('\u04B9', "CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE");
+    map.put('\u04BA', "CYRILLIC CAPITAL LETTER SHHA");
+    map.put('\u04BB', "CYRILLIC SMALL LETTER SHHA");
+    map.put('\u04BC', "CYRILLIC CAPITAL LETTER ABKHASIAN CHE");
+    map.put('\u04BD', "CYRILLIC SMALL LETTER ABKHASIAN CHE");
+    map.put('\u04BE', "CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER");
+    map.put('\u04BF', "CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER");
+    map.put('\u04C0', "CYRILLIC LETTER PALOCHKA");
+    map.put('\u04C1', "CYRILLIC CAPITAL LETTER ZHE WITH BREVE");
+    map.put('\u04C2', "CYRILLIC SMALL LETTER ZHE WITH BREVE");
+    map.put('\u04C3', "CYRILLIC CAPITAL LETTER KA WITH HOOK");
+    map.put('\u04C4', "CYRILLIC SMALL LETTER KA WITH HOOK");
+    map.put('\u04C5', "CYRILLIC CAPITAL LETTER EL WITH TAIL");
+    map.put('\u04C6', "CYRILLIC SMALL LETTER EL WITH TAIL");
+    map.put('\u04C7', "CYRILLIC CAPITAL LETTER EN WITH HOOK");
+    map.put('\u04C8', "CYRILLIC SMALL LETTER EN WITH HOOK");
+    map.put('\u04C9', "CYRILLIC CAPITAL LETTER EN WITH TAIL");
+    map.put('\u04CA', "CYRILLIC SMALL LETTER EN WITH TAIL");
+    map.put('\u04CB', "CYRILLIC CAPITAL LETTER KHAKASSIAN CHE");
+    map.put('\u04CC', "CYRILLIC SMALL LETTER KHAKASSIAN CHE");
+    map.put('\u04CD', "CYRILLIC CAPITAL LETTER EM WITH TAIL");
+    map.put('\u04CE', "CYRILLIC SMALL LETTER EM WITH TAIL");
+    map.put('\u04CF', "CYRILLIC SMALL LETTER PALOCHKA");
+    map.put('\u04D0', "CYRILLIC CAPITAL LETTER A WITH BREVE");
+    map.put('\u04D1', "CYRILLIC SMALL LETTER A WITH BREVE");
+    map.put('\u04D2', "CYRILLIC CAPITAL LETTER A WITH DIAERESIS");
+    map.put('\u04D3', "CYRILLIC SMALL LETTER A WITH DIAERESIS");
+    map.put('\u04D4', "CYRILLIC CAPITAL LIGATURE A IE");
+    map.put('\u04D5', "CYRILLIC SMALL LIGATURE A IE");
+    map.put('\u04D6', "CYRILLIC CAPITAL LETTER IE WITH BREVE");
+    map.put('\u04D7', "CYRILLIC SMALL LETTER IE WITH BREVE");
+    map.put('\u04D8', "CYRILLIC CAPITAL LETTER SCHWA");
+    map.put('\u04D9', "CYRILLIC SMALL LETTER SCHWA");
+    map.put('\u04DA', "CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS");
+    map.put('\u04DB', "CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS");
+    map.put('\u04DC', "CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS");
+    map.put('\u04DD', "CYRILLIC SMALL LETTER ZHE WITH DIAERESIS");
+    map.put('\u04DE', "CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS");
+    map.put('\u04DF', "CYRILLIC SMALL LETTER ZE WITH DIAERESIS");
+    map.put('\u04E0', "CYRILLIC CAPITAL LETTER ABKHASIAN DZE");
+    map.put('\u04E1', "CYRILLIC SMALL LETTER ABKHASIAN DZE");
+    map.put('\u04E2', "CYRILLIC CAPITAL LETTER I WITH MACRON");
+    map.put('\u04E3', "CYRILLIC SMALL LETTER I WITH MACRON");
+    map.put('\u04E4', "CYRILLIC CAPITAL LETTER I WITH DIAERESIS");
+    map.put('\u04E5', "CYRILLIC SMALL LETTER I WITH DIAERESIS");
+    map.put('\u04E6', "CYRILLIC CAPITAL LETTER O WITH DIAERESIS");
+    map.put('\u04E7', "CYRILLIC SMALL LETTER O WITH DIAERESIS");
+    map.put('\u04E8', "CYRILLIC CAPITAL LETTER BARRED O");
+    map.put('\u04E9', "CYRILLIC SMALL LETTER BARRED O");
+    map.put('\u04EA', "CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS");
+    map.put('\u04EB', "CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS");
+    map.put('\u04EC', "CYRILLIC CAPITAL LETTER E WITH DIAERESIS");
+    map.put('\u04ED', "CYRILLIC SMALL LETTER E WITH DIAERESIS");
+    map.put('\u04EE', "CYRILLIC CAPITAL LETTER U WITH MACRON");
+    map.put('\u04EF', "CYRILLIC SMALL LETTER U WITH MACRON");
+    map.put('\u04F0', "CYRILLIC CAPITAL LETTER U WITH DIAERESIS");
+    map.put('\u04F1', "CYRILLIC SMALL LETTER U WITH DIAERESIS");
+    map.put('\u04F2', "CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE");
+    map.put('\u04F3', "CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE");
+    map.put('\u04F4', "CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS");
+    map.put('\u04F5', "CYRILLIC SMALL LETTER CHE WITH DIAERESIS");
+    map.put('\u04F6', "CYRILLIC CAPITAL LETTER GHE WITH DESCENDER");
+    map.put('\u04F7', "CYRILLIC SMALL LETTER GHE WITH DESCENDER");
+    map.put('\u04F8', "CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS");
+    map.put('\u04F9', "CYRILLIC SMALL LETTER YERU WITH DIAERESIS");
+    map.put('\u04FA', "CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK");
+    map.put('\u04FB', "CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK");
+    map.put('\u04FC', "CYRILLIC CAPITAL LETTER HA WITH HOOK");
+    map.put('\u04FD', "CYRILLIC SMALL LETTER HA WITH HOOK");
+    map.put('\u04FE', "CYRILLIC CAPITAL LETTER HA WITH STROKE");
+    map.put('\u04FF', "CYRILLIC SMALL LETTER HA WITH STROKE");
+
+  }
+
+  public static final void cyrillicSupplement(Map<Character, String> map) {
+
+    map.put('\u0500', "CYRILLIC CAPITAL LETTER KOMI DE");
+    map.put('\u0501', "CYRILLIC SMALL LETTER KOMI DE");
+    map.put('\u0502', "CYRILLIC CAPITAL LETTER KOMI DJE");
+    map.put('\u0503', "CYRILLIC SMALL LETTER KOMI DJE");
+    map.put('\u0504', "CYRILLIC CAPITAL LETTER KOMI ZJE");
+    map.put('\u0505', "CYRILLIC SMALL LETTER KOMI ZJE");
+    map.put('\u0506', "CYRILLIC CAPITAL LETTER KOMI DZJE");
+    map.put('\u0507', "CYRILLIC SMALL LETTER KOMI DZJE");
+    map.put('\u0508', "CYRILLIC CAPITAL LETTER KOMI LJE");
+    map.put('\u0509', "CYRILLIC SMALL LETTER KOMI LJE");
+    map.put('\u050A', "CYRILLIC CAPITAL LETTER KOMI NJE");
+    map.put('\u050B', "CYRILLIC SMALL LETTER KOMI NJE");
+    map.put('\u050C', "CYRILLIC CAPITAL LETTER KOMI SJE");
+    map.put('\u050D', "CYRILLIC SMALL LETTER KOMI SJE");
+    map.put('\u050E', "CYRILLIC CAPITAL LETTER KOMI TJE");
+    map.put('\u050F', "CYRILLIC SMALL LETTER KOMI TJE");
+    map.put('\u0510', "CYRILLIC CAPITAL LETTER REVERSED ZE");
+    map.put('\u0511', "CYRILLIC SMALL LETTER REVERSED ZE");
+    map.put('\u0512', "CYRILLIC CAPITAL LETTER EL WITH HOOK");
+    map.put('\u0513', "CYRILLIC SMALL LETTER EL WITH HOOK");
+    map.put('\u0514', "CYRILLIC CAPITAL LETTER LHA");
+    map.put('\u0515', "CYRILLIC SMALL LETTER LHA");
+    map.put('\u0516', "CYRILLIC CAPITAL LETTER RHA");
+    map.put('\u0517', "CYRILLIC SMALL LETTER RHA");
+    map.put('\u0518', "CYRILLIC CAPITAL LETTER YAE");
+    map.put('\u0519', "CYRILLIC SMALL LETTER YAE");
+    map.put('\u051A', "CYRILLIC CAPITAL LETTER QA");
+    map.put('\u051B', "CYRILLIC SMALL LETTER QA");
+    map.put('\u051C', "CYRILLIC CAPITAL LETTER WE");
+    map.put('\u051D', "CYRILLIC SMALL LETTER WE");
+    map.put('\u051E', "CYRILLIC CAPITAL LETTER ALEUT KA");
+    map.put('\u051F', "CYRILLIC SMALL LETTER ALEUT KA");
+    map.put('\u0520', "CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK");
+    map.put('\u0521', "CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK");
+    map.put('\u0522', "CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK");
+    map.put('\u0523', "CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK");
+    map.put('\u0524', "CYRILLIC CAPITAL LETTER PE WITH DESCENDER");
+    map.put('\u0525', "CYRILLIC SMALL LETTER PE WITH DESCENDER");
+
+  }
+
+  public static final void armenian(Map<Character, String> map) {
+
+    map.put('\u0531', "ARMENIAN CAPITAL LETTER AYB");
+    map.put('\u0532', "ARMENIAN CAPITAL LETTER BEN");
+    map.put('\u0533', "ARMENIAN CAPITAL LETTER GIM");
+    map.put('\u0534', "ARMENIAN CAPITAL LETTER DA");
+    map.put('\u0535', "ARMENIAN CAPITAL LETTER ECH");
+    map.put('\u0536', "ARMENIAN CAPITAL LETTER ZA");
+    map.put('\u0537', "ARMENIAN CAPITAL LETTER EH");
+    map.put('\u0538', "ARMENIAN CAPITAL LETTER ET");
+    map.put('\u0539', "ARMENIAN CAPITAL LETTER TO");
+    map.put('\u053A', "ARMENIAN CAPITAL LETTER ZHE");
+    map.put('\u053B', "ARMENIAN CAPITAL LETTER INI");
+    map.put('\u053C', "ARMENIAN CAPITAL LETTER LIWN");
+    map.put('\u053D', "ARMENIAN CAPITAL LETTER XEH");
+    map.put('\u053E', "ARMENIAN CAPITAL LETTER CA");
+    map.put('\u053F', "ARMENIAN CAPITAL LETTER KEN");
+    map.put('\u0540', "ARMENIAN CAPITAL LETTER HO");
+    map.put('\u0541', "ARMENIAN CAPITAL LETTER JA");
+    map.put('\u0542', "ARMENIAN CAPITAL LETTER GHAD");
+    map.put('\u0543', "ARMENIAN CAPITAL LETTER CHEH");
+    map.put('\u0544', "ARMENIAN CAPITAL LETTER MEN");
+    map.put('\u0545', "ARMENIAN CAPITAL LETTER YI");
+    map.put('\u0546', "ARMENIAN CAPITAL LETTER NOW");
+    map.put('\u0547', "ARMENIAN CAPITAL LETTER SHA");
+    map.put('\u0548', "ARMENIAN CAPITAL LETTER VO");
+    map.put('\u0549', "ARMENIAN CAPITAL LETTER CHA");
+    map.put('\u054A', "ARMENIAN CAPITAL LETTER PEH");
+    map.put('\u054B', "ARMENIAN CAPITAL LETTER JHEH");
+    map.put('\u054C', "ARMENIAN CAPITAL LETTER RA");
+    map.put('\u054D', "ARMENIAN CAPITAL LETTER SEH");
+    map.put('\u054E', "ARMENIAN CAPITAL LETTER VEW");
+    map.put('\u054F', "ARMENIAN CAPITAL LETTER TIWN");
+    map.put('\u0550', "ARMENIAN CAPITAL LETTER REH");
+    map.put('\u0551', "ARMENIAN CAPITAL LETTER CO");
+    map.put('\u0552', "ARMENIAN CAPITAL LETTER YIWN");
+    map.put('\u0553', "ARMENIAN CAPITAL LETTER PIWR");
+    map.put('\u0554', "ARMENIAN CAPITAL LETTER KEH");
+    map.put('\u0555', "ARMENIAN CAPITAL LETTER OH");
+    map.put('\u0556', "ARMENIAN CAPITAL LETTER FEH");
+    map.put('\u0559', "ARMENIAN MODIFIER LETTER LEFT HALF RING");
+    map.put('\u055A', "ARMENIAN APOSTROPHE");
+    map.put('\u055B', "ARMENIAN EMPHASIS MARK");
+    map.put('\u055C', "ARMENIAN EXCLAMATION MARK");
+    map.put('\u055D', "ARMENIAN COMMA");
+    map.put('\u055E', "ARMENIAN QUESTION MARK");
+    map.put('\u055F', "ARMENIAN ABBREVIATION MARK");
+    map.put('\u0561', "ARMENIAN SMALL LETTER AYB");
+    map.put('\u0562', "ARMENIAN SMALL LETTER BEN");
+    map.put('\u0563', "ARMENIAN SMALL LETTER GIM");
+    map.put('\u0564', "ARMENIAN SMALL LETTER DA");
+    map.put('\u0565', "ARMENIAN SMALL LETTER ECH");
+    map.put('\u0566', "ARMENIAN SMALL LETTER ZA");
+    map.put('\u0567', "ARMENIAN SMALL LETTER EH");
+    map.put('\u0568', "ARMENIAN SMALL LETTER ET");
+    map.put('\u0569', "ARMENIAN SMALL LETTER TO");
+    map.put('\u056A', "ARMENIAN SMALL LETTER ZHE");
+    map.put('\u056B', "ARMENIAN SMALL LETTER INI");
+    map.put('\u056C', "ARMENIAN SMALL LETTER LIWN");
+    map.put('\u056D', "ARMENIAN SMALL LETTER XEH");
+    map.put('\u056E', "ARMENIAN SMALL LETTER CA");
+    map.put('\u056F', "ARMENIAN SMALL LETTER KEN");
+    map.put('\u0570', "ARMENIAN SMALL LETTER HO");
+    map.put('\u0571', "ARMENIAN SMALL LETTER JA");
+    map.put('\u0572', "ARMENIAN SMALL LETTER GHAD");
+    map.put('\u0573', "ARMENIAN SMALL LETTER CHEH");
+    map.put('\u0574', "ARMENIAN SMALL LETTER MEN");
+    map.put('\u0575', "ARMENIAN SMALL LETTER YI");
+    map.put('\u0576', "ARMENIAN SMALL LETTER NOW");
+    map.put('\u0577', "ARMENIAN SMALL LETTER SHA");
+    map.put('\u0578', "ARMENIAN SMALL LETTER VO");
+    map.put('\u0579', "ARMENIAN SMALL LETTER CHA");
+    map.put('\u057A', "ARMENIAN SMALL LETTER PEH");
+    map.put('\u057B', "ARMENIAN SMALL LETTER JHEH");
+    map.put('\u057C', "ARMENIAN SMALL LETTER RA");
+    map.put('\u057D', "ARMENIAN SMALL LETTER SEH");
+    map.put('\u057E', "ARMENIAN SMALL LETTER VEW");
+    map.put('\u057F', "ARMENIAN SMALL LETTER TIWN");
+    map.put('\u0580', "ARMENIAN SMALL LETTER REH");
+    map.put('\u0581', "ARMENIAN SMALL LETTER CO");
+    map.put('\u0582', "ARMENIAN SMALL LETTER YIWN");
+    map.put('\u0583', "ARMENIAN SMALL LETTER PIWR");
+    map.put('\u0584', "ARMENIAN SMALL LETTER KEH");
+    map.put('\u0585', "ARMENIAN SMALL LETTER OH");
+    map.put('\u0586', "ARMENIAN SMALL LETTER FEH");
+    map.put('\u0587', "ARMENIAN SMALL LIGATURE ECH YIWN");
+    map.put('\u0589', "ARMENIAN FULL STOP");
+    map.put('\u058A', "ARMENIAN HYPHEN");
+
+  }
+
+  public static final void hebrew(Map<Character, String> map) {
+
+    map.put('\u0591', "HEBREW ACCENT ETNAHTA");
+    map.put('\u0592', "HEBREW ACCENT SEGOL");
+    map.put('\u0593', "HEBREW ACCENT SHALSHELET");
+    map.put('\u0594', "HEBREW ACCENT ZAQEF QATAN");
+    map.put('\u0595', "HEBREW ACCENT ZAQEF GADOL");
+    map.put('\u0596', "HEBREW ACCENT TIPEHA");
+    map.put('\u0597', "HEBREW ACCENT REVIA");
+    map.put('\u0598', "HEBREW ACCENT ZARQA");
+    map.put('\u0599', "HEBREW ACCENT PASHTA");
+    map.put('\u059A', "HEBREW ACCENT YETIV");
+    map.put('\u059B', "HEBREW ACCENT TEVIR");
+    map.put('\u059C', "HEBREW ACCENT GERESH");
+    map.put('\u059D', "HEBREW ACCENT GERESH MUQDAM");
+    map.put('\u059E', "HEBREW ACCENT GERSHAYIM");
+    map.put('\u059F', "HEBREW ACCENT QARNEY PARA");
+    map.put('\u05A0', "HEBREW ACCENT TELISHA GEDOLA");
+    map.put('\u05A1', "HEBREW ACCENT PAZER");
+    map.put('\u05A2', "HEBREW ACCENT ATNAH HAFUKH");
+    map.put('\u05A3', "HEBREW ACCENT MUNAH");
+    map.put('\u05A4', "HEBREW ACCENT MAHAPAKH");
+    map.put('\u05A5', "HEBREW ACCENT MERKHA");
+    map.put('\u05A6', "HEBREW ACCENT MERKHA KEFULA");
+    map.put('\u05A7', "HEBREW ACCENT DARGA");
+    map.put('\u05A8', "HEBREW ACCENT QADMA");
+    map.put('\u05A9', "HEBREW ACCENT TELISHA QETANA");
+    map.put('\u05AA', "HEBREW ACCENT YERAH BEN YOMO");
+    map.put('\u05AB', "HEBREW ACCENT OLE");
+    map.put('\u05AC', "HEBREW ACCENT ILUY");
+    map.put('\u05AD', "HEBREW ACCENT DEHI");
+    map.put('\u05AE', "HEBREW ACCENT ZINOR");
+    map.put('\u05AF', "HEBREW MARK MASORA CIRCLE");
+    map.put('\u05B0', "HEBREW POINT SHEVA");
+    map.put('\u05B1', "HEBREW POINT HATAF SEGOL");
+    map.put('\u05B2', "HEBREW POINT HATAF PATAH");
+    map.put('\u05B3', "HEBREW POINT HATAF QAMATS");
+    map.put('\u05B4', "HEBREW POINT HIRIQ");
+    map.put('\u05B5', "HEBREW POINT TSERE");
+    map.put('\u05B6', "HEBREW POINT SEGOL");
+    map.put('\u05B7', "HEBREW POINT PATAH");
+    map.put('\u05B8', "HEBREW POINT QAMATS");
+    map.put('\u05B9', "HEBREW POINT HOLAM");
+    map.put('\u05BA', "HEBREW POINT HOLAM HASER FOR VAV");
+    map.put('\u05BB', "HEBREW POINT QUBUTS");
+    map.put('\u05BC', "HEBREW POINT DAGESH OR MAPIQ");
+    map.put('\u05BD', "HEBREW POINT METEG");
+    map.put('\u05BE', "HEBREW PUNCTUATION MAQAF");
+    map.put('\u05BF', "HEBREW POINT RAFE");
+    map.put('\u05C0', "HEBREW PUNCTUATION PASEQ");
+    map.put('\u05C1', "HEBREW POINT SHIN DOT");
+    map.put('\u05C2', "HEBREW POINT SIN DOT");
+    map.put('\u05C3', "HEBREW PUNCTUATION SOF PASUQ");
+    map.put('\u05C4', "HEBREW MARK UPPER DOT");
+    map.put('\u05C5', "HEBREW MARK LOWER DOT");
+    map.put('\u05C6', "HEBREW PUNCTUATION NUN HAFUKHA");
+    map.put('\u05C7', "HEBREW POINT QAMATS QATAN");
+    map.put('\u05D0', "HEBREW LETTER ALEF");
+    map.put('\u05D1', "HEBREW LETTER BET");
+    map.put('\u05D2', "HEBREW LETTER GIMEL");
+    map.put('\u05D3', "HEBREW LETTER DALET");
+    map.put('\u05D4', "HEBREW LETTER HE");
+    map.put('\u05D5', "HEBREW LETTER VAV");
+    map.put('\u05D6', "HEBREW LETTER ZAYIN");
+    map.put('\u05D7', "HEBREW LETTER HET");
+    map.put('\u05D8', "HEBREW LETTER TET");
+    map.put('\u05D9', "HEBREW LETTER YOD");
+    map.put('\u05DA', "HEBREW LETTER FINAL KAF");
+    map.put('\u05DB', "HEBREW LETTER KAF");
+    map.put('\u05DC', "HEBREW LETTER LAMED");
+    map.put('\u05DD', "HEBREW LETTER FINAL MEM");
+    map.put('\u05DE', "HEBREW LETTER MEM");
+    map.put('\u05DF', "HEBREW LETTER FINAL NUN");
+    map.put('\u05E0', "HEBREW LETTER NUN");
+    map.put('\u05E1', "HEBREW LETTER SAMEKH");
+    map.put('\u05E2', "HEBREW LETTER AYIN");
+    map.put('\u05E3', "HEBREW LETTER FINAL PE");
+    map.put('\u05E4', "HEBREW LETTER PE");
+    map.put('\u05E5', "HEBREW LETTER FINAL TSADI");
+    map.put('\u05E6', "HEBREW LETTER TSADI");
+    map.put('\u05E7', "HEBREW LETTER QOF");
+    map.put('\u05E8', "HEBREW LETTER RESH");
+    map.put('\u05E9', "HEBREW LETTER SHIN");
+    map.put('\u05EA', "HEBREW LETTER TAV");
+    map.put('\u05F0', "HEBREW LIGATURE YIDDISH DOUBLE VAV");
+    map.put('\u05F1', "HEBREW LIGATURE YIDDISH VAV YOD");
+    map.put('\u05F2', "HEBREW LIGATURE YIDDISH DOUBLE YOD");
+    map.put('\u05F3', "HEBREW PUNCTUATION GERESH");
+    map.put('\u05F4', "HEBREW PUNCTUATION GERSHAYIM");
+
+  }
+
+  public static final void arabic(Map<Character, String> map) {
+
+    map.put('\u0600', "ARABIC NUMBER S

<TRUNCATED>