From ea27d271a3feb40e1d7eddae8d8eaffe91cb80df Mon Sep 17 00:00:00 2001
From: Philippe Mavridis <philippe.mavridis@yandex.com>
Date: Sun, 5 Apr 2026 13:44:45 +0300
Subject: Add Unicode category support to tdeui and KCharSelect widget

The newly introduced TDEUnicodeData namespace contains data and functions related to auxiliary unicode data (which is not part of TQUnicodeTable) such as categories.

The KCharSelect widget gains a revamped tooltip which also displays a character's category and subcategory.

See also TDE/tdeutils#123.

Signed-off-by: Philippe Mavridis <philippe.mavridis@yandex.com>
Co-authored-by: Opencode/Big Pickle
---
 tdecore/CMakeLists.txt                |    2 +
 tdecore/tdeunicodecharinfo.cpp        |   42 +
 tdecore/tdeunicodecharinfo.h          |   27 +
 tdecore/tdeunicodedata.cpp            |   57 +
 tdecore/tdeunicodedata.h              |   58 +
 tdecore/tdeunicodedata_categories.cpp | 4604 +++++++++++++++++++++++++++++++++
 tdeui/CMakeLists.txt                  |    1 -
 tdeui/kcharselect.cpp                 |   32 +-
 tdeui/unicode/update_unicode_data.pl  |  205 ++
 9 files changed, 5018 insertions(+), 10 deletions(-)
 create mode 100644 tdecore/tdeunicodecharinfo.cpp
 create mode 100644 tdecore/tdeunicodecharinfo.h
 create mode 100644 tdecore/tdeunicodedata.cpp
 create mode 100644 tdecore/tdeunicodedata.h
 create mode 100644 tdecore/tdeunicodedata_categories.cpp
 create mode 100755 tdeui/unicode/update_unicode_data.pl

diff --git a/tdecore/CMakeLists.txt b/tdecore/CMakeLists.txt
index 3ebbe8add..6bd1f0567 100644
--- a/tdecore/CMakeLists.txt
+++ b/tdecore/CMakeLists.txt
@@ -73,6 +73,7 @@ install( FILES
     kmanagerselection.h kmountpoint.h kuser.h klockfile.h
     kidna.h ktempdir.h kshell.h fixx11h.h kxerrorhandler.h
     tdelibs_export.h kde_file.h ktimezones.h
+    tdeunicodedata.h tdeunicodecharinfo.h
     ${CMAKE_CURRENT_BINARY_DIR}/tdemacros.h
   DESTINATION ${INCLUDE_INSTALL_DIR} )
 
@@ -135,6 +136,7 @@ set( ${target}_SRCS
   kprotocolinfo_tdecore.cpp kprotocolinfofactory.cpp kxerrorhandler.cpp
   kuser.cpp tdeconfigskeleton.cpp tdeconfigdialogmanager.cpp klockfile.cpp
   kqiodevicegzip_p.cpp ktimezones.cpp ksimpledirwatch.cpp
+  tdeunicodedata.cpp
 )
 
 tde_add_library( ${target} SHARED AUTOMOC
diff --git a/tdecore/tdeunicodecharinfo.cpp b/tdecore/tdeunicodecharinfo.cpp
new file mode 100644
index 000000000..8ab930273
--- /dev/null
+++ b/tdecore/tdeunicodecharinfo.cpp
@@ -0,0 +1,42 @@
+#include "tdeunicodecharinfo.h"
+
+#include "tdeunicodedata.h"
+
+TDEUnicodeCharInfo::TDEUnicodeCharInfo(char32_t ch)
+    : m_codepoint(ch),
+      m_category(nullptr),
+      m_subcategory(nullptr)
+{
+}
+
+TDEUnicodeCharInfo::TDEUnicodeCharInfo(TQChar ch)
+    : m_codepoint(ch.unicode()),
+      m_category(nullptr),
+      m_subcategory(nullptr)
+{
+}
+
+char32_t TDEUnicodeCharInfo::codepoint() const
+{
+    return m_codepoint;
+}
+
+const TDEUnicodeData::Category *TDEUnicodeCharInfo::category() const
+{
+    if (!m_category)
+        m_category = TDEUnicodeData::instance()->findCategory(m_codepoint);
+    return m_category;
+}
+
+const TDEUnicodeData::Subcategory *TDEUnicodeCharInfo::subcategory() const
+{
+    if (!m_subcategory)
+    {
+        // Reuse the cached category to avoid re-searching the category list.
+        const TDEUnicodeData::Category *cat = category();
+        m_subcategory = cat
+            ? TDEUnicodeData::instance()->findSubcategory(cat, m_codepoint)
+            : nullptr;
+    }
+    return m_subcategory;
+}
diff --git a/tdecore/tdeunicodecharinfo.h b/tdecore/tdeunicodecharinfo.h
new file mode 100644
index 000000000..02e4dfd3f
--- /dev/null
+++ b/tdecore/tdeunicodecharinfo.h
@@ -0,0 +1,27 @@
+#ifndef TDEUNICODEINFO_H
+#define TDEUNICODEINFO_H
+
+#include "tdelibs_export.h"
+#include "tdeunicodedata.h"
+
+#include <tqstring.h>
+
+class TDECORE_EXPORT TDEUnicodeCharInfo
+{
+    public:
+        explicit TDEUnicodeCharInfo(char32_t ch);
+        TDEUnicodeCharInfo(TQChar ch);
+
+        char32_t codepoint() const;
+
+        // Lazily looked up and cached on first call.
+        const TDEUnicodeData::Category *category() const;
+        const TDEUnicodeData::Subcategory *subcategory() const;
+
+    private:
+        const char32_t m_codepoint;
+        mutable const TDEUnicodeData::Category *m_category;
+        mutable const TDEUnicodeData::Subcategory *m_subcategory;
+};
+
+#endif // TDEUNICODEINFO_H
diff --git a/tdecore/tdeunicodedata.cpp b/tdecore/tdeunicodedata.cpp
new file mode 100644
index 000000000..e18276ed9
--- /dev/null
+++ b/tdecore/tdeunicodedata.cpp
@@ -0,0 +1,57 @@
+#include "tdeunicodedata.h"
+
+#include <algorithm>
+
+// Generated category/subcategory data
+#include "tdeunicodedata_categories.cpp"
+
+TDEUnicodeData *TDEUnicodeData::s_instance = nullptr;
+
+TDEUnicodeData *TDEUnicodeData::instance()
+{
+    if (!s_instance)
+        s_instance = new TDEUnicodeData;
+    return s_instance;
+}
+
+TDEUnicodeData::TDEUnicodeData()
+    : m_categories(categories),
+      m_categories_size(categories_size)
+{
+}
+
+const TDEUnicodeData::Category *TDEUnicodeData::findCategory(char32_t codepoint) const
+{
+    if (m_categories_size == 0)
+        return nullptr;
+
+    const Category *begin = std::begin(categories);
+    const Category *end = std::end(categories);
+    const Category *it = std::lower_bound(begin, end, codepoint,
+        [](const Category &c, char32_t cp) { return c.index <= cp; });
+
+    if (it == begin)
+        return nullptr;
+    return it - 1;
+}
+
+const TDEUnicodeData::Subcategory *TDEUnicodeData::findSubcategory(char32_t codepoint) const
+{
+    const Category *category = findCategory(codepoint);
+    return category ? findSubcategory(category, codepoint) : nullptr;
+}
+
+const TDEUnicodeData::Subcategory *TDEUnicodeData::findSubcategory(const Category *category, char32_t codepoint) const
+{
+    if (!category || category->subcategories_size == 0)
+        return nullptr;
+
+    const Subcategory *begin = category->subcategories;
+    const Subcategory *end = category->subcategories + category->subcategories_size;
+    const Subcategory *it = std::lower_bound(begin, end, codepoint,
+        [](const Subcategory &s, char32_t cp) { return s.index <= cp; });
+
+    if (it == begin)
+        return nullptr;
+    return it - 1;
+}
diff --git a/tdecore/tdeunicodedata.h b/tdecore/tdeunicodedata.h
new file mode 100644
index 000000000..9e80b86e2
--- /dev/null
+++ b/tdecore/tdeunicodedata.h
@@ -0,0 +1,58 @@
+#ifndef TDEUNICODEDATA_H
+#define TDEUNICODEDATA_H
+
+#include "tdelibs_export.h"
+
+#include <cstddef>
+
+class TDECORE_EXPORT TDEUnicodeData
+{
+    public:
+        //
+        // Unicode categories and subcategories
+        // (see tdeunicodedata_categories.cpp for the actual data)
+        //
+
+        struct Subcategory
+        {
+            char32_t index;
+            const char *name;
+        };
+
+        struct Category
+        {
+            char32_t index;
+            const char *name;
+            const Subcategory *subcategories;
+            size_t subcategories_size;
+        };
+
+        static TDEUnicodeData *instance();
+
+        // Returns the category (Unicode block) containing codepoint, or nullptr
+        // if none applies. The arrays are sorted, so this is a binary search.
+        const Category *findCategory(char32_t codepoint) const;
+
+        // Returns the subcategory of the category containing codepoint, or
+        // nullptr if none applies.
+        const Subcategory *findSubcategory(char32_t codepoint) const;
+
+        // Returns the subcategory of the given category containing codepoint,
+        // or nullptr if none applies. Use this when the containing category is
+        // already known to avoid re-searching the category list.
+        const Subcategory *findSubcategory(const Category *category, char32_t codepoint) const;
+
+        const Category *categoryList() const { return m_categories; }
+        size_t categoryCount() const { return m_categories_size; }
+    private:
+        TDEUnicodeData();
+        TDEUnicodeData(const TDEUnicodeData &) = delete;
+        TDEUnicodeData &operator=(const TDEUnicodeData &) = delete;
+
+        const Category *m_categories;
+        size_t m_categories_size;
+
+        static TDEUnicodeData *s_instance;
+};
+
+#endif // TDEUNICODEDATA_H
diff --git a/tdecore/tdeunicodedata_categories.cpp b/tdecore/tdeunicodedata_categories.cpp
new file mode 100644
index 000000000..e9da5891b
--- /dev/null
+++ b/tdecore/tdeunicodedata_categories.cpp
@@ -0,0 +1,4604 @@
+// This is a data structure which contains all Unicode blocks/categories as defined by The Unicode Standard
+// Downloaded and adapted from https://www.unicode.org/Public/UCD/latest/ucd/NamesList.txt
+// --
+// THIS FILE WAS AUTOMATICALLY GENERATED.
+// Update this file using the `update_unicode_data.pl` script.
+
+#include "tdeunicodedata.h"
+#include <tdelocale.h>
+
+// Category/subcategory arrays are sorted by codepoint so they can be
+// searched with std::lower_bound/std::upper_bound. Each array is a
+// plain array (no sentinel); its size is embedded in the parent
+// Category struct (subcategories_size) or in categories_size.
+//
+// Names are wrapped in I18N_NOOP() to tag them for translation
+// extraction; the actual translation is performed at the call site
+// with i18n(name).
+
+static const TDEUnicodeData::Subcategory BasicLatin[] = {
+	{ 0x0000,	I18N_NOOP("C0 controls") },
+	{ 0x0020,	I18N_NOOP("ASCII punctuation and symbols") },
+	{ 0x002B,	I18N_NOOP("ASCII math operator") },
+	{ 0x002C,	I18N_NOOP("ASCII punctuation") },
+	{ 0x0030,	I18N_NOOP("ASCII digits") },
+	{ 0x003A,	I18N_NOOP("ASCII punctuation") },
+	{ 0x003C,	I18N_NOOP("ASCII mathematical operators") },
+	{ 0x003F,	I18N_NOOP("ASCII punctuation") },
+	{ 0x0041,	I18N_NOOP("Uppercase Latin alphabet") },
+	{ 0x005B,	I18N_NOOP("ASCII punctuation and symbols") },
+	{ 0x0061,	I18N_NOOP("Lowercase Latin alphabet") },
+	{ 0x007B,	I18N_NOOP("ASCII punctuation and symbols") },
+	{ 0x007F,	I18N_NOOP("Control character") },
+};
+
+static const TDEUnicodeData::Subcategory Latin1Supplement[] = {
+	{ 0x0080,	I18N_NOOP("C1 controls") },
+	{ 0x00A0,	I18N_NOOP("Latin-1 punctuation and symbols") },
+	{ 0x00BC,	I18N_NOOP("Vulgar fractions") },
+	{ 0x00BF,	I18N_NOOP("Punctuation") },
+	{ 0x00C0,	I18N_NOOP("Uppercase letters") },
+	{ 0x00D7,	I18N_NOOP("Mathematical operator") },
+	{ 0x00D8,	I18N_NOOP("Uppercase letters") },
+	{ 0x00DF,	I18N_NOOP("Lowercase letters") },
+	{ 0x00F7,	I18N_NOOP("Mathematical operator") },
+	{ 0x00F8,	I18N_NOOP("Lowercase letters") },
+};
+
+static const TDEUnicodeData::Subcategory LatinExtendedA[] = {
+	{ 0x0100,	I18N_NOOP("European Latin") },
+	{ 0x0149,	I18N_NOOP("Deprecated letter") },
+	{ 0x014A,	I18N_NOOP("European Latin") },
+};
+
+static const TDEUnicodeData::Subcategory LatinExtendedB[] = {
+	{ 0x0180,	I18N_NOOP("Non-European and historic Latin") },
+	{ 0x01C0,	I18N_NOOP("African letters for clicks") },
+	{ 0x01C4,	I18N_NOOP("Latin digraphs matching Serbian Cyrillic letters") },
+	{ 0x01CD,	I18N_NOOP("Pinyin diacritic-vowel combinations") },
+	{ 0x01DD,	I18N_NOOP("Phonetic and historic letters") },
+	{ 0x0200,	I18N_NOOP("Additions for Slovenian") },
+	{ 0x0218,	I18N_NOOP("Additions for Romanian") },
+	{ 0x021C,	I18N_NOOP("Miscellaneous additions") },
+	{ 0x022A,	I18N_NOOP("Additions for Livonian") },
+	{ 0x0234,	I18N_NOOP("Additions for Sinology") },
+	{ 0x0237,	I18N_NOOP("Miscellaneous addition") },
+	{ 0x0238,	I18N_NOOP("Additions for Africanist linguistics") },
+	{ 0x023A,	I18N_NOOP("Additions for Sencoten") },
+	{ 0x023F,	I18N_NOOP("Additions for Africanist linguistics") },
+	{ 0x0241,	I18N_NOOP("Miscellaneous additions") },
+};
+
+static const TDEUnicodeData::Subcategory IPAExtensions[] = {
+	{ 0x0250,	I18N_NOOP("IPA extensions") },
+	{ 0x027F,	I18N_NOOP("Sinological extension") },
+	{ 0x0280,	I18N_NOOP("IPA extensions") },
+	{ 0x0285,	I18N_NOOP("Sinological extension") },
+	{ 0x0286,	I18N_NOOP("IPA extensions") },
+	{ 0x02A9,	I18N_NOOP("IPA characters for disordered speech") },
+	{ 0x02AE,	I18N_NOOP("Sinological extensions") },
+};
+
+static const TDEUnicodeData::Subcategory SpacingModifierLetters[] = {
+	{ 0x02B0,	I18N_NOOP("Latin superscript modifier letters") },
+	{ 0x02B9,	I18N_NOOP("Miscellaneous phonetic modifiers") },
+	{ 0x02D8,	I18N_NOOP("Spacing clones of diacritics") },
+	{ 0x02DE,	I18N_NOOP("Additions based on 1989 IPA") },
+	{ 0x02E5,	I18N_NOOP("Tone letters") },
+	{ 0x02EA,	I18N_NOOP("Extended Bopomofo tone marks") },
+	{ 0x02EC,	I18N_NOOP("IPA modifiers") },
+	{ 0x02EE,	I18N_NOOP("Other modifier letter") },
+	{ 0x02EF,	I18N_NOOP("UPA modifiers") },
+};
+
+static const TDEUnicodeData::Subcategory CombiningDiacriticalMarks[] = {
+	{ 0x0300,	I18N_NOOP("Ordinary diacritics") },
+	{ 0x0334,	I18N_NOOP("Overstruck diacritics") },
+	{ 0x0339,	I18N_NOOP("Miscellaneous additions") },
+	{ 0x0340,	I18N_NOOP("Vietnamese tone marks") },
+	{ 0x0342,	I18N_NOOP("Additions for Greek") },
+	{ 0x0346,	I18N_NOOP("Additions for IPA") },
+	{ 0x034B,	I18N_NOOP("IPA diacritics for disordered speech") },
+	{ 0x034F,	I18N_NOOP("Miscellaneous addition") },
+	{ 0x0350,	I18N_NOOP("Additions for the Uralic Phonetic Alphabet") },
+	{ 0x0358,	I18N_NOOP("Miscellaneous additions") },
+	{ 0x035C,	I18N_NOOP("Double diacritics") },
+	{ 0x0363,	I18N_NOOP("Medieval superscript letter diacritics") },
+};
+
+static const TDEUnicodeData::Subcategory GreekandCoptic[] = {
+	{ 0x0370,	I18N_NOOP("Archaic letters") },
+	{ 0x0374,	I18N_NOOP("Numeral signs") },
+	{ 0x0376,	I18N_NOOP("Archaic letters") },
+	{ 0x037A,	I18N_NOOP("Iota subscript") },
+	{ 0x037B,	I18N_NOOP("Lowercase of editorial symbols") },
+	{ 0x037E,	I18N_NOOP("Punctuation") },
+	{ 0x037F,	I18N_NOOP("Additional letter") },
+	{ 0x0384,	I18N_NOOP("Spacing accent marks") },
+	{ 0x0386,	I18N_NOOP("Letter") },
+	{ 0x0387,	I18N_NOOP("Punctuation") },
+	{ 0x0388,	I18N_NOOP("Letters") },
+	{ 0x03CF,	I18N_NOOP("Variant letterforms") },
+	{ 0x03D8,	I18N_NOOP("Archaic letters") },
+	{ 0x03E2,	I18N_NOOP("Coptic letters derived from Demotic") },
+	{ 0x03F0,	I18N_NOOP("Variant letterforms") },
+	{ 0x03F3,	I18N_NOOP("Additional letter") },
+	{ 0x03F4,	I18N_NOOP("Variant letterforms and symbols") },
+	{ 0x03F7,	I18N_NOOP("Additional archaic letters for Bactrian") },
+	{ 0x03F9,	I18N_NOOP("Variant letterform") },
+	{ 0x03FA,	I18N_NOOP("Archaic letters") },
+	{ 0x03FC,	I18N_NOOP("Symbol") },
+	{ 0x03FD,	I18N_NOOP("Editorial symbols") },
+};
+
+static const TDEUnicodeData::Subcategory Cyrillic[] = {
+	{ 0x0400,	I18N_NOOP("Cyrillic extensions") },
+	{ 0x0410,	I18N_NOOP("Basic Russian alphabet") },
+	{ 0x0450,	I18N_NOOP("Cyrillic extensions") },
+	{ 0x0460,	I18N_NOOP("Historic letters") },
+	{ 0x0478,	I18N_NOOP("Historic digraphs") },
+	{ 0x047A,	I18N_NOOP("Historic letters") },
+	{ 0x0482,	I18N_NOOP("Historic miscellaneous") },
+	{ 0x048A,	I18N_NOOP("Extended Cyrillic") },
+	{ 0x04FA,	I18N_NOOP("Additions for Nivkh") },
+};
+
+static const TDEUnicodeData::Subcategory CyrillicSupplement[] = {
+	{ 0x0500,	I18N_NOOP("Komi letters") },
+	{ 0x0510,	I18N_NOOP("Khanty letters") },
+	{ 0x0512,	I18N_NOOP("Chukchi letters") },
+	{ 0x0514,	I18N_NOOP("Mordvin letters") },
+	{ 0x051A,	I18N_NOOP("Kurdish letters") },
+	{ 0x051E,	I18N_NOOP("Aleut letters") },
+	{ 0x0520,	I18N_NOOP("Chuvash letters") },
+	{ 0x0524,	I18N_NOOP("Abkhaz letters") },
+	{ 0x0526,	I18N_NOOP("Azerbaijani letters") },
+	{ 0x0528,	I18N_NOOP("Orok letters") },
+	{ 0x052A,	I18N_NOOP("Komi letters") },
+	{ 0x052E,	I18N_NOOP("Khanty letters") },
+};
+
+static const TDEUnicodeData::Subcategory Armenian[] = {
+	{ 0x0531,	I18N_NOOP("Uppercase letters") },
+	{ 0x0559,	I18N_NOOP("Modifier letters") },
+	{ 0x0560,	I18N_NOOP("Lowercase letters") },
+	{ 0x0589,	I18N_NOOP("Punctuation") },
+	{ 0x058D,	I18N_NOOP("Religious symbols") },
+	{ 0x058F,	I18N_NOOP("Currency symbol") },
+};
+
+static const TDEUnicodeData::Subcategory Hebrew[] = {
+	{ 0x0591,	I18N_NOOP("Cantillation marks") },
+	{ 0x05B0,	I18N_NOOP("Points and punctuation") },
+	{ 0x05C4,	I18N_NOOP("Puncta extraordinaria") },
+	{ 0x05C6,	I18N_NOOP("Points and punctuation") },
+	{ 0x05D0,	I18N_NOOP("Based on ISO 8859-8") },
+	{ 0x05EF,	I18N_NOOP("Sign") },
+	{ 0x05F0,	I18N_NOOP("Yiddish digraphs") },
+	{ 0x05F3,	I18N_NOOP("Additional punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Arabic[] = {
+	{ 0x0600,	I18N_NOOP("Subtending marks") },
+	{ 0x0605,	I18N_NOOP("Supertending mark") },
+	{ 0x0606,	I18N_NOOP("Radix symbols") },
+	{ 0x0608,	I18N_NOOP("Letterlike symbol") },
+	{ 0x0609,	I18N_NOOP("Punctuation") },
+	{ 0x060B,	I18N_NOOP("Currency symbol") },
+	{ 0x060C,	I18N_NOOP("Punctuation") },
+	{ 0x060E,	I18N_NOOP("Poetic marks") },
+	{ 0x0610,	I18N_NOOP("Honorifics") },
+	{ 0x0615,	I18N_NOOP("Quranic annotation sign") },
+	{ 0x0616,	I18N_NOOP("Extended Arabic mark") },
+	{ 0x0617,	I18N_NOOP("Quranic annotation signs") },
+	{ 0x061B,	I18N_NOOP("Punctuation") },
+	{ 0x061C,	I18N_NOOP("Format character") },
+	{ 0x061D,	I18N_NOOP("Punctuation") },
+	{ 0x0620,	I18N_NOOP("Addition for Kashmiri") },
+	{ 0x0621,	I18N_NOOP("Based on ISO 8859-6") },
+	{ 0x063B,	I18N_NOOP("Additions for early Persian and Azerbaijani") },
+	{ 0x0640,	I18N_NOOP("Based on ISO 8859-6") },
+	{ 0x064B,	I18N_NOOP("Tashkil from ISO 8859-6") },
+	{ 0x0653,	I18N_NOOP("Combining maddah and hamza") },
+	{ 0x0656,	I18N_NOOP("Other combining marks") },
+	{ 0x0660,	I18N_NOOP("Arabic-Indic digits") },
+	{ 0x066A,	I18N_NOOP("Punctuation") },
+	{ 0x066E,	I18N_NOOP("Archaic letters") },
+	{ 0x0670,	I18N_NOOP("Tashkil") },
+	{ 0x0671,	I18N_NOOP("Extended Arabic letters") },
+	{ 0x0673,	I18N_NOOP("Deprecated letter") },
+	{ 0x0674,	I18N_NOOP("High hamza") },
+	{ 0x0675,	I18N_NOOP("Digraphic letters for Kazakh") },
+	{ 0x0679,	I18N_NOOP("Extended Arabic letters") },
+	{ 0x06D4,	I18N_NOOP("Punctuation") },
+	{ 0x06D5,	I18N_NOOP("Extended Arabic letter") },
+	{ 0x06D6,	I18N_NOOP("Quranic annotation signs") },
+	{ 0x06EE,	I18N_NOOP("Extended Arabic letters for Parkari") },
+	{ 0x06F0,	I18N_NOOP("Eastern Arabic-Indic digits") },
+	{ 0x06FA,	I18N_NOOP("Extended Arabic letters") },
+	{ 0x06FD,	I18N_NOOP("Signs for Sindhi") },
+	{ 0x06FF,	I18N_NOOP("Extended Arabic letter for Parkari") },
+};
+
+static const TDEUnicodeData::Subcategory Syriac[] = {
+	{ 0x0700,	I18N_NOOP("Syriac punctuation and signs") },
+	{ 0x070F,	I18N_NOOP("Syriac format control character") },
+	{ 0x0710,	I18N_NOOP("Syriac letters") },
+	{ 0x072D,	I18N_NOOP("Persian letters") },
+	{ 0x0730,	I18N_NOOP("Syriac points (vowels)") },
+	{ 0x0740,	I18N_NOOP("Syriac marks") },
+	{ 0x074D,	I18N_NOOP("Sogdian letters") },
+};
+
+static const TDEUnicodeData::Subcategory ArabicSupplement[] = {
+	{ 0x0750,	I18N_NOOP("Extended Arabic letters") },
+	{ 0x076E,	I18N_NOOP("Additions for Khowar") },
+	{ 0x0772,	I18N_NOOP("Addition for Torwali") },
+	{ 0x0773,	I18N_NOOP("Additions for Burushaski") },
+	{ 0x077E,	I18N_NOOP("Additions for early Persian") },
+};
+
+static const TDEUnicodeData::Subcategory Thaana[] = {
+	{ 0x0780,	I18N_NOOP("Basic consonants") },
+	{ 0x0798,	I18N_NOOP("Extensions for Arabic") },
+	{ 0x07A6,	I18N_NOOP("Vowels") },
+	{ 0x07B1,	I18N_NOOP("Consonant for Addu dialect") },
+};
+
+static const TDEUnicodeData::Subcategory NKo[] = {
+	{ 0x07C0,	I18N_NOOP("Digits") },
+	{ 0x07CA,	I18N_NOOP("Letters") },
+	{ 0x07E8,	I18N_NOOP("Archaic letters") },
+	{ 0x07EB,	I18N_NOOP("Tone marks") },
+	{ 0x07F2,	I18N_NOOP("Other diacritics") },
+	{ 0x07F4,	I18N_NOOP("Tonal apostrophes") },
+	{ 0x07F6,	I18N_NOOP("Symbol") },
+	{ 0x07F7,	I18N_NOOP("Punctuation") },
+	{ 0x07FA,	I18N_NOOP("Letter extender") },
+	{ 0x07FD,	I18N_NOOP("Abbreviation sign") },
+	{ 0x07FE,	I18N_NOOP("Currency symbols") },
+};
+
+static const TDEUnicodeData::Subcategory Samaritan[] = {
+	{ 0x0800,	I18N_NOOP("Letters") },
+	{ 0x0816,	I18N_NOOP("Consonant modifiers") },
+	{ 0x081C,	I18N_NOOP("Vowel signs") },
+	{ 0x082D,	I18N_NOOP("Variant reading sign") },
+	{ 0x0830,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Mandaic[] = {
+	{ 0x0840,	I18N_NOOP("Letters") },
+	{ 0x0859,	I18N_NOOP("Diacritics") },
+	{ 0x085E,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory SyriacSupplement[] = {
+	{ 0x0860,	I18N_NOOP("Syriac letters") },
+};
+
+static const TDEUnicodeData::Subcategory ArabicExtendedB[] = {
+	{ 0x0870,	I18N_NOOP("Additions for Quranic orthographies") },
+	{ 0x0889,	I18N_NOOP("Additions for Bosnian orthographies") },
+	{ 0x088B,	I18N_NOOP("Additions for Pegon orthographies") },
+	{ 0x088E,	I18N_NOOP("Abbreviation mark") },
+	{ 0x088F,	I18N_NOOP("Addition for Eastern Punjabi orthographies") },
+	{ 0x0890,	I18N_NOOP("Supertending currency symbols") },
+	{ 0x0897,	I18N_NOOP("Vowel sign for Pegon") },
+	{ 0x0898,	I18N_NOOP("Additions for Quranic orthographies") },
+};
+
+static const TDEUnicodeData::Subcategory ArabicExtendedA[] = {
+	{ 0x08A0,	I18N_NOOP("Arabic letters for African languages") },
+	{ 0x08AA,	I18N_NOOP("Dependent consonants for Rohingya") },
+	{ 0x08AD,	I18N_NOOP("Arabic letters for European and Central Asian languages") },
+	{ 0x08B2,	I18N_NOOP("Arabic letter for Berber") },
+	{ 0x08B3,	I18N_NOOP("Arabic letters for Arwi") },
+	{ 0x08B5,	I18N_NOOP("Early Arabic letter") },
+	{ 0x08B6,	I18N_NOOP("Arabic letters for Bravanese") },
+	{ 0x08BB,	I18N_NOOP("Arabic letters for Warsh orthography") },
+	{ 0x08BE,	I18N_NOOP("Arabic letters for Hindko") },
+	{ 0x08C3,	I18N_NOOP("Arabic letters for Hausa, Wolof and other African orthographies") },
+	{ 0x08C7,	I18N_NOOP("Arabic letter for Punjabi") },
+	{ 0x08C8,	I18N_NOOP("Arabic letter for Balti") },
+	{ 0x08C9,	I18N_NOOP("Additions for Quranic orthographies") },
+	{ 0x08D3,	I18N_NOOP("Quranic annotation signs") },
+	{ 0x08E3,	I18N_NOOP("Extended vowel sign for Arwi") },
+	{ 0x08E4,	I18N_NOOP("Extended vowel signs for Rohingya") },
+	{ 0x08EA,	I18N_NOOP("Tone marks for Rohingya") },
+	{ 0x08F0,	I18N_NOOP("Quranic annotation signs") },
+	{ 0x08F4,	I18N_NOOP("Extended vowel signs for African languages") },
+	{ 0x08FE,	I18N_NOOP("Extended vowel signs") },
+};
+
+static const TDEUnicodeData::Subcategory Devanagari[] = {
+	{ 0x0900,	I18N_NOOP("Various signs") },
+	{ 0x0904,	I18N_NOOP("Independent vowels") },
+	{ 0x0915,	I18N_NOOP("Consonants") },
+	{ 0x093A,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x093C,	I18N_NOOP("Various signs") },
+	{ 0x093E,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x094D,	I18N_NOOP("Virama") },
+	{ 0x094E,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x0950,	I18N_NOOP("Sign") },
+	{ 0x0951,	I18N_NOOP("Vedic tone marks") },
+	{ 0x0953,	I18N_NOOP("Accent marks") },
+	{ 0x0955,	I18N_NOOP("Dependent vowel sign") },
+	{ 0x0956,	I18N_NOOP("Dependent vowel signs for Kashmiri") },
+	{ 0x0958,	I18N_NOOP("Additional consonants") },
+	{ 0x0960,	I18N_NOOP("Additional vowels for Sanskrit") },
+	{ 0x0964,	I18N_NOOP("Generic punctuation for scripts of India") },
+	{ 0x0966,	I18N_NOOP("Digits") },
+	{ 0x0970,	I18N_NOOP("Additional signs") },
+	{ 0x0972,	I18N_NOOP("Independent vowel for Marathi") },
+	{ 0x0973,	I18N_NOOP("Independent vowels") },
+	{ 0x0976,	I18N_NOOP("Independent vowels for Kashmiri") },
+	{ 0x0978,	I18N_NOOP("Additional consonants") },
+	{ 0x097B,	I18N_NOOP("Sindhi implosives") },
+	{ 0x097D,	I18N_NOOP("Glottal stop") },
+	{ 0x097E,	I18N_NOOP("Sindhi implosives") },
+};
+
+static const TDEUnicodeData::Subcategory Bengali[] = {
+	{ 0x0980,	I18N_NOOP("Various signs") },
+	{ 0x0985,	I18N_NOOP("Independent vowels") },
+	{ 0x0995,	I18N_NOOP("Consonants") },
+	{ 0x09BC,	I18N_NOOP("Various signs") },
+	{ 0x09BE,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x09CB,	I18N_NOOP("Two-part dependent vowel signs") },
+	{ 0x09CD,	I18N_NOOP("Virama") },
+	{ 0x09CE,	I18N_NOOP("Additional consonant") },
+	{ 0x09D7,	I18N_NOOP("Sign") },
+	{ 0x09DC,	I18N_NOOP("Additional consonants") },
+	{ 0x09E0,	I18N_NOOP("Additional vowels for Sanskrit") },
+	{ 0x09E4,	I18N_NOOP("Reserved") },
+	{ 0x09E6,	I18N_NOOP("Digits") },
+	{ 0x09F0,	I18N_NOOP("Additions for Assamese") },
+	{ 0x09F2,	I18N_NOOP("Currency symbols") },
+	{ 0x09F4,	I18N_NOOP("Historic symbols for fractional values") },
+	{ 0x09FA,	I18N_NOOP("Sign") },
+	{ 0x09FB,	I18N_NOOP("Historic currency sign") },
+	{ 0x09FC,	I18N_NOOP("Signs") },
+};
+
+static const TDEUnicodeData::Subcategory Gurmukhi[] = {
+	{ 0x0A01,	I18N_NOOP("Various signs") },
+	{ 0x0A05,	I18N_NOOP("Independent vowels") },
+	{ 0x0A15,	I18N_NOOP("Consonants") },
+	{ 0x0A3C,	I18N_NOOP("Various signs") },
+	{ 0x0A3E,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x0A4D,	I18N_NOOP("Virama") },
+	{ 0x0A51,	I18N_NOOP("Sign") },
+	{ 0x0A59,	I18N_NOOP("Additional consonants") },
+	{ 0x0A64,	I18N_NOOP("Reserved") },
+	{ 0x0A66,	I18N_NOOP("Digits") },
+	{ 0x0A70,	I18N_NOOP("Signs") },
+	{ 0x0A72,	I18N_NOOP("Vowel bases") },
+	{ 0x0A74,	I18N_NOOP("Signs") },
+};
+
+static const TDEUnicodeData::Subcategory Gujarati[] = {
+	{ 0x0A81,	I18N_NOOP("Various signs") },
+	{ 0x0A85,	I18N_NOOP("Independent vowels") },
+	{ 0x0A95,	I18N_NOOP("Consonants") },
+	{ 0x0ABC,	I18N_NOOP("Various signs") },
+	{ 0x0ABE,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x0ACD,	I18N_NOOP("Virama") },
+	{ 0x0AD0,	I18N_NOOP("Various signs") },
+	{ 0x0AE0,	I18N_NOOP("Additional vowels for Sanskrit") },
+	{ 0x0AE4,	I18N_NOOP("Reserved") },
+	{ 0x0AE6,	I18N_NOOP("Digits") },
+	{ 0x0AF0,	I18N_NOOP("Abbreviation sign") },
+	{ 0x0AF1,	I18N_NOOP("Currency symbol") },
+	{ 0x0AF9,	I18N_NOOP("Additional consonant") },
+	{ 0x0AFA,	I18N_NOOP("Transliteration signs") },
+};
+
+static const TDEUnicodeData::Subcategory Oriya[] = {
+	{ 0x0B01,	I18N_NOOP("Various signs") },
+	{ 0x0B05,	I18N_NOOP("Independent vowels") },
+	{ 0x0B15,	I18N_NOOP("Consonants") },
+	{ 0x0B3C,	I18N_NOOP("Various signs") },
+	{ 0x0B3E,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x0B4B,	I18N_NOOP("Two-part dependent vowel signs") },
+	{ 0x0B4D,	I18N_NOOP("Virama") },
+	{ 0x0B55,	I18N_NOOP("Various signs") },
+	{ 0x0B5C,	I18N_NOOP("Additional consonants") },
+	{ 0x0B60,	I18N_NOOP("Additional vowels for Sanskrit") },
+	{ 0x0B62,	I18N_NOOP("Dependent vowels") },
+	{ 0x0B64,	I18N_NOOP("Reserved") },
+	{ 0x0B66,	I18N_NOOP("Digits") },
+	{ 0x0B70,	I18N_NOOP("Sign") },
+	{ 0x0B71,	I18N_NOOP("Additional consonant") },
+	{ 0x0B72,	I18N_NOOP("Fraction signs") },
+};
+
+static const TDEUnicodeData::Subcategory Tamil[] = {
+	{ 0x0B82,	I18N_NOOP("Various signs") },
+	{ 0x0B85,	I18N_NOOP("Independent vowels") },
+	{ 0x0B95,	I18N_NOOP("Consonants") },
+	{ 0x0BBE,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x0BCA,	I18N_NOOP("Two-part dependent vowel signs") },
+	{ 0x0BCD,	I18N_NOOP("Virama") },
+	{ 0x0BD0,	I18N_NOOP("Various signs") },
+	{ 0x0BE4,	I18N_NOOP("Reserved") },
+	{ 0x0BE6,	I18N_NOOP("Digits") },
+	{ 0x0BF0,	I18N_NOOP("Tamil numerics") },
+	{ 0x0BF3,	I18N_NOOP("Tamil calendrical symbols") },
+	{ 0x0BF6,	I18N_NOOP("Tamil clerical symbols") },
+	{ 0x0BF9,	I18N_NOOP("Currency symbol") },
+	{ 0x0BFA,	I18N_NOOP("Tamil clerical symbol") },
+};
+
+static const TDEUnicodeData::Subcategory Telugu[] = {
+	{ 0x0C00,	I18N_NOOP("Various signs") },
+	{ 0x0C05,	I18N_NOOP("Independent vowels") },
+	{ 0x0C15,	I18N_NOOP("Consonants") },
+	{ 0x0C3C,	I18N_NOOP("Sign") },
+	{ 0x0C3D,	I18N_NOOP("Addition for Sanskrit") },
+	{ 0x0C3E,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x0C4D,	I18N_NOOP("Virama") },
+	{ 0x0C55,	I18N_NOOP("Various signs") },
+	{ 0x0C58,	I18N_NOOP("Historic phonetic variants") },
+	{ 0x0C5C,	I18N_NOOP("Ligature") },
+	{ 0x0C5D,	I18N_NOOP("Consonant") },
+	{ 0x0C60,	I18N_NOOP("Additional vowels for Sanskrit") },
+	{ 0x0C62,	I18N_NOOP("Dependent vowels") },
+	{ 0x0C64,	I18N_NOOP("Reserved") },
+	{ 0x0C66,	I18N_NOOP("Digits") },
+	{ 0x0C77,	I18N_NOOP("Sign") },
+	{ 0x0C78,	I18N_NOOP("Telugu fractions and weights") },
+};
+
+static const TDEUnicodeData::Subcategory Kannada[] = {
+	{ 0x0C80,	I18N_NOOP("Various signs") },
+	{ 0x0C85,	I18N_NOOP("Independent vowels") },
+	{ 0x0C95,	I18N_NOOP("Consonants") },
+	{ 0x0CBC,	I18N_NOOP("Various signs") },
+	{ 0x0CBE,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x0CCD,	I18N_NOOP("Virama") },
+	{ 0x0CD5,	I18N_NOOP("Various signs") },
+	{ 0x0CDC,	I18N_NOOP("Ligature") },
+	{ 0x0CDD,	I18N_NOOP("Additional consonants") },
+	{ 0x0CE0,	I18N_NOOP("Additional vowels for Sanskrit") },
+	{ 0x0CE2,	I18N_NOOP("Dependent vowels") },
+	{ 0x0CE4,	I18N_NOOP("Reserved") },
+	{ 0x0CE6,	I18N_NOOP("Digits") },
+	{ 0x0CF1,	I18N_NOOP("Signs used in Sanskrit") },
+};
+
+static const TDEUnicodeData::Subcategory Malayalam[] = {
+	{ 0x0D00,	I18N_NOOP("Various signs") },
+	{ 0x0D05,	I18N_NOOP("Independent vowels") },
+	{ 0x0D15,	I18N_NOOP("Consonants") },
+	{ 0x0D3B,	I18N_NOOP("Variant shape viramas") },
+	{ 0x0D3D,	I18N_NOOP("Addition for Sanskrit") },
+	{ 0x0D3E,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x0D4A,	I18N_NOOP("Two-part dependent vowel signs") },
+	{ 0x0D4D,	I18N_NOOP("Virama") },
+	{ 0x0D4E,	I18N_NOOP("Dot reph") },
+	{ 0x0D4F,	I18N_NOOP("Measurement symbol") },
+	{ 0x0D54,	I18N_NOOP("Additional historic chillu letters") },
+	{ 0x0D57,	I18N_NOOP("Dependent vowel sign") },
+	{ 0x0D58,	I18N_NOOP("Minor fractions") },
+	{ 0x0D5F,	I18N_NOOP("Additional historic vowel") },
+	{ 0x0D60,	I18N_NOOP("Additional vowels for Sanskrit") },
+	{ 0x0D62,	I18N_NOOP("Dependent vowels") },
+	{ 0x0D64,	I18N_NOOP("Reserved") },
+	{ 0x0D66,	I18N_NOOP("Digits") },
+	{ 0x0D70,	I18N_NOOP("Malayalam numerics") },
+	{ 0x0D73,	I18N_NOOP("Fractions") },
+	{ 0x0D79,	I18N_NOOP("Date mark") },
+	{ 0x0D7A,	I18N_NOOP("Chillu letters") },
+};
+
+static const TDEUnicodeData::Subcategory Sinhala[] = {
+	{ 0x0D81,	I18N_NOOP("Various signs") },
+	{ 0x0D85,	I18N_NOOP("Independent vowels") },
+	{ 0x0D9A,	I18N_NOOP("Consonants") },
+	{ 0x0DCA,	I18N_NOOP("Sign") },
+	{ 0x0DCF,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x0DDC,	I18N_NOOP("Two-part dependent vowel signs") },
+	{ 0x0DDF,	I18N_NOOP("Dependent vowel sign") },
+	{ 0x0DE6,	I18N_NOOP("Astrological digits") },
+	{ 0x0DF2,	I18N_NOOP("Additional dependent vowel signs") },
+	{ 0x0DF4,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Thai[] = {
+	{ 0x0E01,	I18N_NOOP("Consonants") },
+	{ 0x0E2F,	I18N_NOOP("Sign") },
+	{ 0x0E30,	I18N_NOOP("Vowels") },
+	{ 0x0E3F,	I18N_NOOP("Currency symbol") },
+	{ 0x0E40,	I18N_NOOP("Vowels") },
+	{ 0x0E45,	I18N_NOOP("Vowel length sign") },
+	{ 0x0E46,	I18N_NOOP("Repetition mark") },
+	{ 0x0E47,	I18N_NOOP("Vowel") },
+	{ 0x0E48,	I18N_NOOP("Tone marks") },
+	{ 0x0E4C,	I18N_NOOP("Signs") },
+	{ 0x0E50,	I18N_NOOP("Digits") },
+	{ 0x0E5A,	I18N_NOOP("Signs") },
+};
+
+static const TDEUnicodeData::Subcategory Lao[] = {
+	{ 0x0E81,	I18N_NOOP("Consonants") },
+	{ 0x0EAF,	I18N_NOOP("Sign") },
+	{ 0x0EB0,	I18N_NOOP("Vowels") },
+	{ 0x0EBA,	I18N_NOOP("Virama") },
+	{ 0x0EBB,	I18N_NOOP("Vowel") },
+	{ 0x0EBC,	I18N_NOOP("Signs") },
+	{ 0x0EC0,	I18N_NOOP("Vowels") },
+	{ 0x0EC6,	I18N_NOOP("Repetition mark") },
+	{ 0x0EC8,	I18N_NOOP("Tone marks") },
+	{ 0x0ECC,	I18N_NOOP("Signs") },
+	{ 0x0ED0,	I18N_NOOP("Digits") },
+	{ 0x0EDC,	I18N_NOOP("Digraphs") },
+	{ 0x0EDE,	I18N_NOOP("Consonants for Khmu") },
+};
+
+static const TDEUnicodeData::Subcategory Tibetan[] = {
+	{ 0x0F00,	I18N_NOOP("Syllable") },
+	{ 0x0F01,	I18N_NOOP("Head marks") },
+	{ 0x0F08,	I18N_NOOP("Marks and signs") },
+	{ 0x0F15,	I18N_NOOP("Astrological signs") },
+	{ 0x0F20,	I18N_NOOP("Digits") },
+	{ 0x0F2A,	I18N_NOOP("Digits minus half") },
+	{ 0x0F34,	I18N_NOOP("Marks and signs") },
+	{ 0x0F3A,	I18N_NOOP("Paired punctuation") },
+	{ 0x0F3E,	I18N_NOOP("Astrological signs") },
+	{ 0x0F40,	I18N_NOOP("Consonants") },
+	{ 0x0F6B,	I18N_NOOP("Extensions for Balti") },
+	{ 0x0F71,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x0F7E,	I18N_NOOP("Vocalic modification") },
+	{ 0x0F80,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x0F82,	I18N_NOOP("Marks and signs") },
+	{ 0x0F88,	I18N_NOOP("Transliteration head letters") },
+	{ 0x0F8D,	I18N_NOOP("Transliteration subjoined signs") },
+	{ 0x0F90,	I18N_NOOP("Subjoined consonants") },
+	{ 0x0FBA,	I18N_NOOP("Fixed-form subjoined consonants") },
+	{ 0x0FBE,	I18N_NOOP("Signs") },
+	{ 0x0FC0,	I18N_NOOP("Cantillation signs") },
+	{ 0x0FC4,	I18N_NOOP("Symbols") },
+	{ 0x0FCE,	I18N_NOOP("Astrological signs") },
+	{ 0x0FD0,	I18N_NOOP("Marks") },
+	{ 0x0FD3,	I18N_NOOP("Head marks") },
+	{ 0x0FD5,	I18N_NOOP("Religious symbols") },
+	{ 0x0FD9,	I18N_NOOP("Annotation marks") },
+};
+
+static const TDEUnicodeData::Subcategory Myanmar[] = {
+	{ 0x1000,	I18N_NOOP("Consonants") },
+	{ 0x1021,	I18N_NOOP("Independent vowels") },
+	{ 0x102B,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x1036,	I18N_NOOP("Various signs") },
+	{ 0x1039,	I18N_NOOP("Virama and killer") },
+	{ 0x103B,	I18N_NOOP("Dependent consonant signs") },
+	{ 0x103F,	I18N_NOOP("Consonant") },
+	{ 0x1040,	I18N_NOOP("Digits") },
+	{ 0x104A,	I18N_NOOP("Punctuation") },
+	{ 0x104C,	I18N_NOOP("Various signs") },
+	{ 0x1050,	I18N_NOOP("Pali and Sanskrit extensions") },
+	{ 0x105A,	I18N_NOOP("Extensions for Mon") },
+	{ 0x1061,	I18N_NOOP("Extensions for S'gaw Karen") },
+	{ 0x1065,	I18N_NOOP("Extensions for Western Pwo Karen") },
+	{ 0x106E,	I18N_NOOP("Extensions for Eastern Pwo Karen") },
+	{ 0x1071,	I18N_NOOP("Extension for Geba Karen") },
+	{ 0x1072,	I18N_NOOP("Extensions for Kayah") },
+	{ 0x1075,	I18N_NOOP("Extensions for Shan") },
+	{ 0x108E,	I18N_NOOP("Extensions for Rumai Palaung") },
+	{ 0x1090,	I18N_NOOP("Shan digits") },
+	{ 0x109A,	I18N_NOOP("Extensions for Khamti Shan") },
+	{ 0x109C,	I18N_NOOP("Extensions for Aiton and Phake") },
+	{ 0x109E,	I18N_NOOP("Shan symbols") },
+};
+
+static const TDEUnicodeData::Subcategory Georgian[] = {
+	{ 0x10A0,	I18N_NOOP("Capital letters (Khutsuri)") },
+	{ 0x10C7,	I18N_NOOP("Additional letter") },
+	{ 0x10CD,	I18N_NOOP("Additional letter for Ossetian") },
+	{ 0x10D0,	I18N_NOOP("Mkhedruli") },
+	{ 0x10F1,	I18N_NOOP("Archaic letters") },
+	{ 0x10F7,	I18N_NOOP("Additional letters for Mingrelian and Svan") },
+	{ 0x10F9,	I18N_NOOP("Additional letters") },
+	{ 0x10FB,	I18N_NOOP("Punctuation") },
+	{ 0x10FC,	I18N_NOOP("Modifier letter") },
+	{ 0x10FD,	I18N_NOOP("Additional letters for Ossetian and Abkhaz") },
+};
+
+static const TDEUnicodeData::Subcategory HangulJamo[] = {
+	{ 0x1100,	I18N_NOOP("Initial consonants") },
+	{ 0x1113,	I18N_NOOP("Old initial consonants") },
+	{ 0x1160,	I18N_NOOP("Medial vowels") },
+	{ 0x1176,	I18N_NOOP("Old medial vowels") },
+	{ 0x11A8,	I18N_NOOP("Final consonants") },
+	{ 0x11C3,	I18N_NOOP("Old final consonants") },
+};
+
+static const TDEUnicodeData::Subcategory Ethiopic[] = {
+	{ 0x1200,	I18N_NOOP("Syllables") },
+	{ 0x135D,	I18N_NOOP("Combining marks") },
+	{ 0x1360,	I18N_NOOP("Punctuation") },
+	{ 0x1369,	I18N_NOOP("Digits") },
+	{ 0x1372,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory EthiopicSupplement[] = {
+	{ 0x1380,	I18N_NOOP("Syllables for Gurage") },
+	{ 0x1390,	I18N_NOOP("Tonal marks") },
+};
+
+static const TDEUnicodeData::Subcategory Cherokee[] = {
+	{ 0x13A0,	I18N_NOOP("Uppercase syllables") },
+	{ 0x13F5,	I18N_NOOP("Archaic uppercase syllable") },
+	{ 0x13F8,	I18N_NOOP("Lowercase syllables") },
+	{ 0x13FD,	I18N_NOOP("Archaic lowercase syllable") },
+};
+
+static const TDEUnicodeData::Subcategory UnifiedCanadianAboriginalSyllabics[] = {
+	{ 0x1400,	I18N_NOOP("Punctuation") },
+	{ 0x1401,	I18N_NOOP("Syllables") },
+	{ 0x15C4,	I18N_NOOP("Syllables for Carrier") },
+	{ 0x166D,	I18N_NOOP("Symbol") },
+	{ 0x166E,	I18N_NOOP("Punctuation") },
+	{ 0x166F,	I18N_NOOP("Syllables") },
+};
+
+static const TDEUnicodeData::Subcategory Ogham[] = {
+	{ 0x1680,	I18N_NOOP("Space") },
+	{ 0x1681,	I18N_NOOP("Traditional letters") },
+	{ 0x1695,	I18N_NOOP("Forfeda (supplementary letters)") },
+	{ 0x169B,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Runic[] = {
+	{ 0x16A0,	I18N_NOOP("Letters") },
+	{ 0x16EB,	I18N_NOOP("Punctuation") },
+	{ 0x16EE,	I18N_NOOP("Golden number runes") },
+	{ 0x16F1,	I18N_NOOP("Tolkienian extensions") },
+	{ 0x16F4,	I18N_NOOP("Cryptogrammic letters") },
+};
+
+static const TDEUnicodeData::Subcategory Tagalog[] = {
+	{ 0x1700,	I18N_NOOP("Independent vowels") },
+	{ 0x1703,	I18N_NOOP("Consonants") },
+	{ 0x1712,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x1714,	I18N_NOOP("Viramas") },
+	{ 0x171F,	I18N_NOOP("Archaic letter") },
+};
+
+static const TDEUnicodeData::Subcategory Hanunoo[] = {
+	{ 0x1720,	I18N_NOOP("Independent vowels") },
+	{ 0x1723,	I18N_NOOP("Consonants") },
+	{ 0x1732,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x1734,	I18N_NOOP("Virama") },
+	{ 0x1735,	I18N_NOOP("Generic punctuation for Philippine scripts") },
+};
+
+static const TDEUnicodeData::Subcategory Buhid[] = {
+	{ 0x1740,	I18N_NOOP("Independent vowels") },
+	{ 0x1743,	I18N_NOOP("Consonants") },
+	{ 0x1752,	I18N_NOOP("Dependent vowel signs") },
+};
+
+static const TDEUnicodeData::Subcategory Tagbanwa[] = {
+	{ 0x1760,	I18N_NOOP("Independent vowels") },
+	{ 0x1763,	I18N_NOOP("Consonants") },
+	{ 0x1772,	I18N_NOOP("Dependent vowel signs") },
+};
+
+static const TDEUnicodeData::Subcategory Khmer[] = {
+	{ 0x1780,	I18N_NOOP("Consonants") },
+	{ 0x17A3,	I18N_NOOP("Deprecated independent vowels for transliteration") },
+	{ 0x17A5,	I18N_NOOP("Independent vowels") },
+	{ 0x17B4,	I18N_NOOP("Inherent vowels") },
+	{ 0x17B6,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x17BE,	I18N_NOOP("Two-part dependent vowel signs") },
+	{ 0x17C1,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x17C4,	I18N_NOOP("Two-part dependent vowel signs") },
+	{ 0x17C6,	I18N_NOOP("Various signs") },
+	{ 0x17C9,	I18N_NOOP("Consonant shifters") },
+	{ 0x17CB,	I18N_NOOP("Various signs") },
+	{ 0x17D3,	I18N_NOOP("Lunar date sign") },
+	{ 0x17D4,	I18N_NOOP("Various signs") },
+	{ 0x17DB,	I18N_NOOP("Currency symbol") },
+	{ 0x17DC,	I18N_NOOP("Various signs") },
+	{ 0x17E0,	I18N_NOOP("Digits") },
+	{ 0x17F0,	I18N_NOOP("Numeric symbols for divination lore") },
+};
+
+static const TDEUnicodeData::Subcategory Mongolian[] = {
+	{ 0x1800,	I18N_NOOP("Punctuation") },
+	{ 0x180B,	I18N_NOOP("Format controls") },
+	{ 0x1810,	I18N_NOOP("Digits") },
+	{ 0x1820,	I18N_NOOP("Basic letters") },
+	{ 0x1843,	I18N_NOOP("Todo letters") },
+	{ 0x185D,	I18N_NOOP("Sibe letters") },
+	{ 0x1873,	I18N_NOOP("Manchu letters") },
+	{ 0x1878,	I18N_NOOP("Buryat letter") },
+	{ 0x1880,	I18N_NOOP("Extensions for Sanskrit and Tibetan") },
+};
+
+static const TDEUnicodeData::Subcategory UnifiedCanadianAboriginalSyllabicsExtended[] = {
+	{ 0x18B0,	I18N_NOOP("Syllables for Moose Cree") },
+	{ 0x18C6,	I18N_NOOP("Syllables for Cree and Ojibway") },
+	{ 0x18D4,	I18N_NOOP("Finals for Cree and Ojibway") },
+	{ 0x18E0,	I18N_NOOP("Syllables for Beaver Dene, Hare Dene, and Chipewyan Dene") },
+	{ 0x18F3,	I18N_NOOP("Finals for Dene and Carrier") },
+};
+
+static const TDEUnicodeData::Subcategory Limbu[] = {
+	{ 0x1900,	I18N_NOOP("Consonants") },
+	{ 0x1920,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x1929,	I18N_NOOP("Subjoined consonants") },
+	{ 0x1930,	I18N_NOOP("Final consonants") },
+	{ 0x1939,	I18N_NOOP("Various signs") },
+	{ 0x1946,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory TaiLe[] = {
+	{ 0x1950,	I18N_NOOP("Consonants") },
+	{ 0x1963,	I18N_NOOP("Vowels") },
+	{ 0x1970,	I18N_NOOP("Tone letters") },
+};
+
+static const TDEUnicodeData::Subcategory NewTaiLue[] = {
+	{ 0x1980,	I18N_NOOP("Consonants") },
+	{ 0x19B0,	I18N_NOOP("Vowels") },
+	{ 0x19C1,	I18N_NOOP("Final consonants") },
+	{ 0x19C8,	I18N_NOOP("Tone marks") },
+	{ 0x19D0,	I18N_NOOP("Digits") },
+	{ 0x19DE,	I18N_NOOP("Various signs") },
+};
+
+static const TDEUnicodeData::Subcategory KhmerSymbols[] = {
+	{ 0x19E0,	I18N_NOOP("Lunar date symbols") },
+};
+
+static const TDEUnicodeData::Subcategory Buginese[] = {
+	{ 0x1A00,	I18N_NOOP("Consonants") },
+	{ 0x1A17,	I18N_NOOP("Vowels") },
+	{ 0x1A1E,	I18N_NOOP("Various signs") },
+};
+
+static const TDEUnicodeData::Subcategory TaiTham[] = {
+	{ 0x1A20,	I18N_NOOP("Consonants") },
+	{ 0x1A4D,	I18N_NOOP("Independent vowels") },
+	{ 0x1A53,	I18N_NOOP("Consonants") },
+	{ 0x1A55,	I18N_NOOP("Consonant signs") },
+	{ 0x1A60,	I18N_NOOP("Sign") },
+	{ 0x1A61,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x1A75,	I18N_NOOP("Tone marks") },
+	{ 0x1A7A,	I18N_NOOP("Other marks") },
+	{ 0x1A7F,	I18N_NOOP("Cryptogrammic mark") },
+	{ 0x1A80,	I18N_NOOP("Hora digits") },
+	{ 0x1A90,	I18N_NOOP("Tham digits") },
+	{ 0x1AA0,	I18N_NOOP("Logographs") },
+	{ 0x1AA3,	I18N_NOOP("Punctuation") },
+	{ 0x1AA7,	I18N_NOOP("Sign") },
+	{ 0x1AA8,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory CombiningDiacriticalMarksExtended[] = {
+	{ 0x1AB0,	I18N_NOOP("Used in German dialectology") },
+	{ 0x1ABB,	I18N_NOOP("Marks surrounding other diacritics or letters") },
+	{ 0x1ABF,	I18N_NOOP("Used in Scots dialectology") },
+	{ 0x1AC1,	I18N_NOOP("Marks next to or surrounding other diacritics") },
+	{ 0x1AC6,	I18N_NOOP("Phonetic sign") },
+	{ 0x1AC7,	I18N_NOOP("Used in extended IPA") },
+	{ 0x1ACB,	I18N_NOOP("Used in Middle English Ormulum") },
+	{ 0x1ACF,	I18N_NOOP("Compound tone diacritics") },
+	{ 0x1AD9,	I18N_NOOP("J.P. Harrington diacritics") },
+	{ 0x1AE0,	I18N_NOOP("IPA positional variants") },
+	{ 0x1AE6,	I18N_NOOP("Historical IPA") },
+	{ 0x1AE8,	I18N_NOOP("Extended IPA positional variants") },
+};
+
+static const TDEUnicodeData::Subcategory Balinese[] = {
+	{ 0x1B00,	I18N_NOOP("Various signs") },
+	{ 0x1B05,	I18N_NOOP("Independent vowels") },
+	{ 0x1B13,	I18N_NOOP("Consonants") },
+	{ 0x1B34,	I18N_NOOP("Sign") },
+	{ 0x1B35,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x1B44,	I18N_NOOP("Sign") },
+	{ 0x1B45,	I18N_NOOP("Additional consonants") },
+	{ 0x1B4E,	I18N_NOOP("Punctuation") },
+	{ 0x1B50,	I18N_NOOP("Digits") },
+	{ 0x1B5A,	I18N_NOOP("Punctuation") },
+	{ 0x1B61,	I18N_NOOP("Musical symbols for notes") },
+	{ 0x1B6B,	I18N_NOOP("Diacritical marks for musical symbols") },
+	{ 0x1B74,	I18N_NOOP("Musical symbols") },
+	{ 0x1B7D,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Sundanese[] = {
+	{ 0x1B80,	I18N_NOOP("Various signs") },
+	{ 0x1B83,	I18N_NOOP("Vowels") },
+	{ 0x1B8A,	I18N_NOOP("Consonants") },
+	{ 0x1BA1,	I18N_NOOP("Consonant signs") },
+	{ 0x1BA4,	I18N_NOOP("Vowel signs") },
+	{ 0x1BAA,	I18N_NOOP("Viramas") },
+	{ 0x1BAC,	I18N_NOOP("Consonant signs") },
+	{ 0x1BAE,	I18N_NOOP("Additional consonants") },
+	{ 0x1BB0,	I18N_NOOP("Digits") },
+	{ 0x1BBA,	I18N_NOOP("Sign") },
+	{ 0x1BBB,	I18N_NOOP("Historic letters") },
+};
+
+static const TDEUnicodeData::Subcategory Batak[] = {
+	{ 0x1BC0,	I18N_NOOP("Letters") },
+	{ 0x1BE6,	I18N_NOOP("Sign") },
+	{ 0x1BE7,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x1BF0,	I18N_NOOP("Dependent consonant signs") },
+	{ 0x1BF2,	I18N_NOOP("Signs") },
+	{ 0x1BFC,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Lepcha[] = {
+	{ 0x1C00,	I18N_NOOP("Consonants") },
+	{ 0x1C24,	I18N_NOOP("Subjoined consonants") },
+	{ 0x1C26,	I18N_NOOP("Dependent vowels") },
+	{ 0x1C2D,	I18N_NOOP("Consonant signs") },
+	{ 0x1C36,	I18N_NOOP("Various signs") },
+	{ 0x1C3B,	I18N_NOOP("Punctuation") },
+	{ 0x1C40,	I18N_NOOP("Digits") },
+	{ 0x1C4D,	I18N_NOOP("Additional letters") },
+};
+
+static const TDEUnicodeData::Subcategory OlChiki[] = {
+	{ 0x1C50,	I18N_NOOP("Digits") },
+	{ 0x1C5A,	I18N_NOOP("Letters") },
+	{ 0x1C78,	I18N_NOOP("Modifier letters") },
+	{ 0x1C7E,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory CyrillicExtendedC[] = {
+	{ 0x1C80,	I18N_NOOP("Historic letter variants") },
+	{ 0x1C89,	I18N_NOOP("Khanty letters") },
+};
+
+static const TDEUnicodeData::Subcategory GeorgianExtended[] = {
+	{ 0x1C90,	I18N_NOOP("Capital letters (Mtavruli)") },
+	{ 0x1CB1,	I18N_NOOP("Archaic letters") },
+	{ 0x1CB7,	I18N_NOOP("Additional letters for Mingrelian and Svan") },
+	{ 0x1CB9,	I18N_NOOP("Additional letters") },
+	{ 0x1CBD,	I18N_NOOP("Additional letters for Ossetian and Abkhaz") },
+};
+
+static const TDEUnicodeData::Subcategory SundaneseSupplement[] = {
+	{ 0x1CC0,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory VedicExtensions[] = {
+	{ 0x1CD0,	I18N_NOOP("Tone marks for the Samaveda") },
+	{ 0x1CD3,	I18N_NOOP("Breathing mark for the Samaveda") },
+	{ 0x1CD4,	I18N_NOOP("Signs for Yajurvedic") },
+	{ 0x1CDE,	I18N_NOOP("Tone marks for the Satapathabrahmana") },
+	{ 0x1CE0,	I18N_NOOP("Tone mark for the Rigveda") },
+	{ 0x1CE1,	I18N_NOOP("Tone mark for the Atharvaveda") },
+	{ 0x1CE2,	I18N_NOOP("Diacritics for visarga") },
+	{ 0x1CE9,	I18N_NOOP("Nasalization signs") },
+	{ 0x1CF2,	I18N_NOOP("Ardhavisarga") },
+	{ 0x1CF4,	I18N_NOOP("Sign for Yajurvedic") },
+	{ 0x1CF5,	I18N_NOOP("Signs") },
+	{ 0x1CF8,	I18N_NOOP("Signs for Jaiminiya Sama Veda") },
+	{ 0x1CFA,	I18N_NOOP("Nasalization sign") },
+};
+
+static const TDEUnicodeData::Subcategory PhoneticExtensions[] = {
+	{ 0x1D00,	I18N_NOOP("Latin letters") },
+	{ 0x1D26,	I18N_NOOP("Greek letters") },
+	{ 0x1D2B,	I18N_NOOP("Cyrillic letter") },
+	{ 0x1D2C,	I18N_NOOP("Latin superscript modifier letters") },
+	{ 0x1D5D,	I18N_NOOP("Greek superscript modifier letters") },
+	{ 0x1D62,	I18N_NOOP("Latin subscript modifier letters") },
+	{ 0x1D66,	I18N_NOOP("Greek subscript modifier letters") },
+	{ 0x1D6B,	I18N_NOOP("Latin letter for American lexicography") },
+	{ 0x1D6C,	I18N_NOOP("Latin letters with middle tilde") },
+	{ 0x1D77,	I18N_NOOP("Letters for Caucasian linguistics") },
+	{ 0x1D79,	I18N_NOOP("Other phonetic symbols") },
+};
+
+static const TDEUnicodeData::Subcategory PhoneticExtensionsSupplement[] = {
+	{ 0x1D80,	I18N_NOOP("Latin letters with palatal hook") },
+	{ 0x1D8F,	I18N_NOOP("Latin letters with retroflex hook") },
+	{ 0x1D9B,	I18N_NOOP("Modifier letters") },
+};
+
+static const TDEUnicodeData::Subcategory CombiningDiacriticalMarksSupplement[] = {
+	{ 0x1DC0,	I18N_NOOP("Used for Ancient Greek") },
+	{ 0x1DC2,	I18N_NOOP("Miscellaneous marks") },
+	{ 0x1DC4,	I18N_NOOP("Contour tone marks") },
+	{ 0x1DCA,	I18N_NOOP("Miscellaneous mark") },
+	{ 0x1DCB,	I18N_NOOP("Contour tone marks") },
+	{ 0x1DCD,	I18N_NOOP("Double diacritic") },
+	{ 0x1DCE,	I18N_NOOP("Medievalist additions") },
+	{ 0x1DD3,	I18N_NOOP("Medieval superscript letter diacritics") },
+	{ 0x1DE7,	I18N_NOOP("Superscript letter diacritics for German dialectology") },
+	{ 0x1DF5,	I18N_NOOP("Diacritic for American lexicography") },
+	{ 0x1DF6,	I18N_NOOP("Typicon marks") },
+	{ 0x1DF8,	I18N_NOOP("Miscellaneous marks") },
+	{ 0x1DFC,	I18N_NOOP("Double diacritic mark for UPA") },
+	{ 0x1DFD,	I18N_NOOP("Miscellaneous mark") },
+	{ 0x1DFE,	I18N_NOOP("Additional marks for UPA") },
+};
+
+static const TDEUnicodeData::Subcategory LatinExtendedAdditional[] = {
+	{ 0x1E00,	I18N_NOOP("Latin general use extensions") },
+	{ 0x1E9C,	I18N_NOOP("Medievalist additions") },
+	{ 0x1E9E,	I18N_NOOP("Addition for German typography") },
+	{ 0x1E9F,	I18N_NOOP("Medievalist addition") },
+	{ 0x1EA0,	I18N_NOOP("Latin extensions for Vietnamese") },
+	{ 0x1EF2,	I18N_NOOP("Latin general extensions") },
+	{ 0x1EFA,	I18N_NOOP("Medievalist additions") },
+};
+
+static const TDEUnicodeData::Subcategory GreekExtended[] = {
+	{ 0x1F00,	I18N_NOOP("Precomposed polytonic Greek") },
+};
+
+static const TDEUnicodeData::Subcategory GeneralPunctuation[] = {
+	{ 0x2000,	I18N_NOOP("Spaces") },
+	{ 0x200B,	I18N_NOOP("Format characters") },
+	{ 0x2010,	I18N_NOOP("Dashes") },
+	{ 0x2016,	I18N_NOOP("General punctuation") },
+	{ 0x2018,	I18N_NOOP("Quotation marks and apostrophe") },
+	{ 0x2020,	I18N_NOOP("General punctuation") },
+	{ 0x2028,	I18N_NOOP("Separators") },
+	{ 0x202A,	I18N_NOOP("Format characters") },
+	{ 0x202F,	I18N_NOOP("Space") },
+	{ 0x2030,	I18N_NOOP("General punctuation") },
+	{ 0x2039,	I18N_NOOP("Quotation marks") },
+	{ 0x203B,	I18N_NOOP("General punctuation") },
+	{ 0x203C,	I18N_NOOP("Double punctuation for vertical text") },
+	{ 0x203D,	I18N_NOOP("General punctuation") },
+	{ 0x2045,	I18N_NOOP("Brackets") },
+	{ 0x2047,	I18N_NOOP("Double punctuation for vertical text") },
+	{ 0x204A,	I18N_NOOP("General punctuation") },
+	{ 0x2056,	I18N_NOOP("Archaic punctuation") },
+	{ 0x2057,	I18N_NOOP("General punctuation") },
+	{ 0x2058,	I18N_NOOP("Archaic punctuation") },
+	{ 0x205F,	I18N_NOOP("Space") },
+	{ 0x2060,	I18N_NOOP("Format character") },
+	{ 0x2061,	I18N_NOOP("Invisible operators") },
+	{ 0x2066,	I18N_NOOP("Format characters") },
+	{ 0x206A,	I18N_NOOP("Deprecated") },
+};
+
+static const TDEUnicodeData::Subcategory SuperscriptsandSubscripts[] = {
+	{ 0x2070,	I18N_NOOP("Superscripts") },
+	{ 0x2080,	I18N_NOOP("Subscripts") },
+	{ 0x2095,	I18N_NOOP("Subscripts for UPA") },
+};
+
+static const TDEUnicodeData::Subcategory CurrencySymbols[] = {
+	{ 0x20A0,	I18N_NOOP("Currency symbols") },
+};
+
+static const TDEUnicodeData::Subcategory CombiningDiacriticalMarksforSymbols[] = {
+	{ 0x20D0,	I18N_NOOP("Combining diacritical marks for symbols") },
+	{ 0x20DD,	I18N_NOOP("Enclosing diacritics") },
+	{ 0x20E1,	I18N_NOOP("Additional diacritical mark for symbols") },
+	{ 0x20E2,	I18N_NOOP("Additional enclosing diacritics") },
+	{ 0x20E5,	I18N_NOOP("Additional diacritical marks for symbols") },
+};
+
+static const TDEUnicodeData::Subcategory LetterlikeSymbols[] = {
+	{ 0x2100,	I18N_NOOP("Letterlike symbols") },
+	{ 0x2135,	I18N_NOOP("Hebrew letterlike math symbols") },
+	{ 0x2139,	I18N_NOOP("Additional letterlike symbols") },
+	{ 0x2140,	I18N_NOOP("Double-struck large operator") },
+	{ 0x2141,	I18N_NOOP("Additional letterlike symbols") },
+	{ 0x2145,	I18N_NOOP("Double-struck italic math symbols") },
+	{ 0x214A,	I18N_NOOP("Additional letterlike symbols") },
+	{ 0x214E,	I18N_NOOP("Lowercase Claudian letter") },
+	{ 0x214F,	I18N_NOOP("Biblical editorial symbol") },
+};
+
+static const TDEUnicodeData::Subcategory NumberForms[] = {
+	{ 0x2150,	I18N_NOOP("Fractions") },
+	{ 0x2160,	I18N_NOOP("Roman numerals") },
+	{ 0x2180,	I18N_NOOP("Archaic Roman numerals") },
+	{ 0x2184,	I18N_NOOP("Lowercase Claudian letter") },
+	{ 0x2185,	I18N_NOOP("Archaic Roman numerals") },
+	{ 0x2189,	I18N_NOOP("Fraction") },
+	{ 0x218A,	I18N_NOOP("Turned digits") },
+};
+
+static const TDEUnicodeData::Subcategory Arrows[] = {
+	{ 0x2190,	I18N_NOOP("Simple arrows") },
+	{ 0x219A,	I18N_NOOP("Arrows with modifications") },
+	{ 0x21B0,	I18N_NOOP("Arrows with bent tips") },
+	{ 0x21B4,	I18N_NOOP("Keyboard symbols and circle arrows") },
+	{ 0x21BC,	I18N_NOOP("Harpoons") },
+	{ 0x21C4,	I18N_NOOP("Paired arrows and harpoons") },
+	{ 0x21CD,	I18N_NOOP("Double arrows") },
+	{ 0x21DA,	I18N_NOOP("Miscellaneous arrows and keyboard symbols") },
+	{ 0x21E6,	I18N_NOOP("White arrows and keyboard symbols") },
+	{ 0x21F4,	I18N_NOOP("Miscellaneous arrows") },
+};
+
+static const TDEUnicodeData::Subcategory MathematicalOperators[] = {
+	{ 0x2200,	I18N_NOOP("Miscellaneous mathematical symbols") },
+	{ 0x2208,	I18N_NOOP("Set membership") },
+	{ 0x220E,	I18N_NOOP("Miscellaneous mathematical symbol") },
+	{ 0x220F,	I18N_NOOP("N-ary operators") },
+	{ 0x2212,	I18N_NOOP("Operators") },
+	{ 0x221E,	I18N_NOOP("Miscellaneous mathematical symbol") },
+	{ 0x221F,	I18N_NOOP("Angles") },
+	{ 0x2223,	I18N_NOOP("Relations") },
+	{ 0x2227,	I18N_NOOP("Logical and set operators") },
+	{ 0x222B,	I18N_NOOP("Integrals") },
+	{ 0x2234,	I18N_NOOP("Miscellaneous mathematical symbols") },
+	{ 0x2236,	I18N_NOOP("Relations") },
+	{ 0x2238,	I18N_NOOP("Operator") },
+	{ 0x2239,	I18N_NOOP("Relation") },
+	{ 0x223A,	I18N_NOOP("Operator") },
+	{ 0x223B,	I18N_NOOP("Relations") },
+	{ 0x223F,	I18N_NOOP("Miscellaneous mathematical symbol") },
+	{ 0x2240,	I18N_NOOP("Operator") },
+	{ 0x2241,	I18N_NOOP("Relations") },
+	{ 0x228C,	I18N_NOOP("Operators") },
+	{ 0x228F,	I18N_NOOP("Relations") },
+	{ 0x2293,	I18N_NOOP("Operators") },
+	{ 0x22A4,	I18N_NOOP("Miscellaneous mathematical symbols") },
+	{ 0x22A6,	I18N_NOOP("Relations") },
+	{ 0x22BA,	I18N_NOOP("Operators") },
+	{ 0x22BE,	I18N_NOOP("Miscellaneous mathematical symbols") },
+	{ 0x22C0,	I18N_NOOP("N-ary operators") },
+	{ 0x22C4,	I18N_NOOP("Operators") },
+	{ 0x22C8,	I18N_NOOP("Relation") },
+	{ 0x22C9,	I18N_NOOP("Operators") },
+	{ 0x22CD,	I18N_NOOP("Relation") },
+	{ 0x22CE,	I18N_NOOP("Logical operators") },
+	{ 0x22D0,	I18N_NOOP("Relations") },
+	{ 0x22D2,	I18N_NOOP("Operators") },
+	{ 0x22D4,	I18N_NOOP("Relations") },
+	{ 0x22EE,	I18N_NOOP("Matrix ellipses") },
+	{ 0x22F2,	I18N_NOOP("Relations") },
+};
+
+static const TDEUnicodeData::Subcategory MiscellaneousTechnical[] = {
+	{ 0x2300,	I18N_NOOP("Miscellaneous technical") },
+	{ 0x2308,	I18N_NOOP("Ceilings and floors") },
+	{ 0x230C,	I18N_NOOP("Crops") },
+	{ 0x2310,	I18N_NOOP("Miscellaneous technical") },
+	{ 0x231A,	I18N_NOOP("User interface symbols") },
+	{ 0x231C,	I18N_NOOP("Quine corners") },
+	{ 0x2320,	I18N_NOOP("Integral pieces") },
+	{ 0x2322,	I18N_NOOP("Frown and smile") },
+	{ 0x2324,	I18N_NOOP("Keyboard symbols") },
+	{ 0x2329,	I18N_NOOP("Deprecated angle brackets") },
+	{ 0x232B,	I18N_NOOP("Keyboard symbol") },
+	{ 0x232C,	I18N_NOOP("Chemistry symbol") },
+	{ 0x232D,	I18N_NOOP("Drafting symbols") },
+	{ 0x2336,	I18N_NOOP("APL") },
+	{ 0x237B,	I18N_NOOP("Graphics for control codes") },
+	{ 0x237C,	I18N_NOOP("Miscellaneous technical") },
+	{ 0x237D,	I18N_NOOP("Graphics for control codes") },
+	{ 0x2380,	I18N_NOOP("Keyboard symbols from ISO 9995-7") },
+	{ 0x238D,	I18N_NOOP("Electrotechnical symbols from IR 181") },
+	{ 0x2395,	I18N_NOOP("APL") },
+	{ 0x2396,	I18N_NOOP("Keyboard symbols from ISO 9995-7") },
+	{ 0x239B,	I18N_NOOP("Bracket pieces") },
+	{ 0x23AE,	I18N_NOOP("Special character extensions") },
+	{ 0x23B0,	I18N_NOOP("Bracket pieces") },
+	{ 0x23B2,	I18N_NOOP("Summation sign parts") },
+	{ 0x23B4,	I18N_NOOP("Horizontal brackets") },
+	{ 0x23B7,	I18N_NOOP("Terminal graphic characters") },
+	{ 0x23BA,	I18N_NOOP("Scan lines for terminal graphics") },
+	{ 0x23BE,	I18N_NOOP("Dentistry notation symbols") },
+	{ 0x23CD,	I18N_NOOP("Miscellaneous technical") },
+	{ 0x23CE,	I18N_NOOP("Keyboard and UI symbols") },
+	{ 0x23D0,	I18N_NOOP("Special character extension") },
+	{ 0x23D1,	I18N_NOOP("Metrical symbols") },
+	{ 0x23DA,	I18N_NOOP("Electrotechnical symbols") },
+	{ 0x23DC,	I18N_NOOP("Horizontal brackets") },
+	{ 0x23E2,	I18N_NOOP("Miscellaneous technical") },
+	{ 0x23E3,	I18N_NOOP("Chemistry symbol") },
+	{ 0x23E4,	I18N_NOOP("Miscellaneous technical") },
+	{ 0x23E9,	I18N_NOOP("User interface symbols") },
+	{ 0x23FB,	I18N_NOOP("Power symbols from ISO 7000:2012") },
+	{ 0x23FE,	I18N_NOOP("Power symbol from IEEE 1621-2004") },
+	{ 0x23FF,	I18N_NOOP("Miscellaneous symbol") },
+};
+
+static const TDEUnicodeData::Subcategory ControlPictures[] = {
+	{ 0x2400,	I18N_NOOP("Graphic pictures for control codes") },
+	{ 0x2422,	I18N_NOOP("Specific symbols for space") },
+	{ 0x2424,	I18N_NOOP("Graphic picture for control code") },
+	{ 0x2425,	I18N_NOOP("Keyboard symbol") },
+	{ 0x2426,	I18N_NOOP("Specific symbol for control code") },
+	{ 0x2427,	I18N_NOOP("Legacy computer symbols for delete") },
+};
+
+static const TDEUnicodeData::Subcategory OpticalCharacterRecognition[] = {
+	{ 0x2440,	I18N_NOOP("OCR-A") },
+	{ 0x2446,	I18N_NOOP("MICR") },
+	{ 0x244A,	I18N_NOOP("OCR") },
+};
+
+static const TDEUnicodeData::Subcategory EnclosedAlphanumerics[] = {
+	{ 0x2460,	I18N_NOOP("Circled numbers") },
+	{ 0x2474,	I18N_NOOP("Parenthesized numbers") },
+	{ 0x2488,	I18N_NOOP("Numbers period") },
+	{ 0x249C,	I18N_NOOP("Parenthesized Latin letters") },
+	{ 0x24B6,	I18N_NOOP("Circled Latin letters") },
+	{ 0x24EA,	I18N_NOOP("Additional circled number") },
+	{ 0x24EB,	I18N_NOOP("White on black circled numbers") },
+	{ 0x24F5,	I18N_NOOP("Double circled numbers") },
+	{ 0x24FF,	I18N_NOOP("Additional white on black circled number") },
+};
+
+static const TDEUnicodeData::Subcategory BoxDrawing[] = {
+	{ 0x2500,	I18N_NOOP("Light and heavy solid lines") },
+	{ 0x2504,	I18N_NOOP("Light and heavy dashed lines") },
+	{ 0x250C,	I18N_NOOP("Light and heavy line box components") },
+	{ 0x254C,	I18N_NOOP("Light and heavy dashed lines") },
+	{ 0x2550,	I18N_NOOP("Double lines") },
+	{ 0x2552,	I18N_NOOP("Light and double line box components") },
+	{ 0x256D,	I18N_NOOP("Character cell arcs") },
+	{ 0x2571,	I18N_NOOP("Character cell diagonals") },
+	{ 0x2574,	I18N_NOOP("Light and heavy half lines") },
+	{ 0x257C,	I18N_NOOP("Mixed light and heavy lines") },
+};
+
+static const TDEUnicodeData::Subcategory BlockElements[] = {
+	{ 0x2580,	I18N_NOOP("Block elements") },
+	{ 0x2591,	I18N_NOOP("Shade characters") },
+	{ 0x2594,	I18N_NOOP("Block elements") },
+	{ 0x2596,	I18N_NOOP("Terminal graphic characters") },
+};
+
+static const TDEUnicodeData::Subcategory GeometricShapes[] = {
+	{ 0x25A0,	I18N_NOOP("Geometric shapes") },
+	{ 0x25F0,	I18N_NOOP("Control code graphics") },
+	{ 0x25F8,	I18N_NOOP("Geometric shapes") },
+};
+
+static const TDEUnicodeData::Subcategory MiscellaneousSymbols[] = {
+	{ 0x2600,	I18N_NOOP("Weather and astrological symbols") },
+	{ 0x260E,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x2614,	I18N_NOOP("Weather symbol") },
+	{ 0x2615,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x2616,	I18N_NOOP("Japanese chess symbols") },
+	{ 0x2618,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x261A,	I18N_NOOP("Pointing hand symbols") },
+	{ 0x2620,	I18N_NOOP("Warning signs") },
+	{ 0x2624,	I18N_NOOP("Medical and healing symbols") },
+	{ 0x2626,	I18N_NOOP("Religious and political symbols") },
+	{ 0x2630,	I18N_NOOP("Yijing trigram symbols") },
+	{ 0x2638,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x2639,	I18N_NOOP("Emoticons") },
+	{ 0x263C,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x263D,	I18N_NOOP("Astrological symbols") },
+	{ 0x2648,	I18N_NOOP("Zodiacal symbols") },
+	{ 0x2654,	I18N_NOOP("Chess symbols") },
+	{ 0x2660,	I18N_NOOP("Playing card symbols") },
+	{ 0x2668,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x2669,	I18N_NOOP("Musical symbols") },
+	{ 0x2670,	I18N_NOOP("Syriac cross symbols") },
+	{ 0x2672,	I18N_NOOP("Recycling symbols") },
+	{ 0x267E,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x2680,	I18N_NOOP("Dice") },
+	{ 0x2686,	I18N_NOOP("Go markers") },
+	{ 0x268A,	I18N_NOOP("Yijing monogram and digram symbols") },
+	{ 0x2690,	I18N_NOOP("Dictionary and map symbols") },
+	{ 0x269C,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x269E,	I18N_NOOP("Symbols for closed captioning from ARIB STD B24") },
+	{ 0x26A0,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x26A2,	I18N_NOOP("Gender symbols") },
+	{ 0x26AA,	I18N_NOOP("Circles") },
+	{ 0x26AD,	I18N_NOOP("Genealogical symbols") },
+	{ 0x26B2,	I18N_NOOP("Gender symbol") },
+	{ 0x26B3,	I18N_NOOP("Astrological signs") },
+	{ 0x26B9,	I18N_NOOP("Astrological aspects") },
+	{ 0x26BD,	I18N_NOOP("Sport symbols") },
+	{ 0x26BF,	I18N_NOOP("Miscellaneous symbol from ARIB STD B24") },
+	{ 0x26C0,	I18N_NOOP("Symbols for draughts and checkers") },
+	{ 0x26C4,	I18N_NOOP("Weather symbols from ARIB STD B24") },
+	{ 0x26C9,	I18N_NOOP("Game symbols from ARIB STD B24") },
+	{ 0x26CC,	I18N_NOOP("Traffic signs from ARIB STD B24") },
+	{ 0x26CE,	I18N_NOOP("Zodiacal symbol") },
+	{ 0x26CF,	I18N_NOOP("Traffic signs from ARIB STD B24") },
+	{ 0x26E2,	I18N_NOOP("Astronomical symbol") },
+	{ 0x26E3,	I18N_NOOP("Map symbol from ARIB STD B24") },
+	{ 0x26E4,	I18N_NOOP("Pentagram symbols") },
+	{ 0x26E8,	I18N_NOOP("Map symbols from ARIB STD B24") },
+};
+
+static const TDEUnicodeData::Subcategory Dingbats[] = {
+	{ 0x2700,	I18N_NOOP("Miscellaneous") },
+	{ 0x2719,	I18N_NOOP("Crosses") },
+	{ 0x2721,	I18N_NOOP("Stars and asterisks") },
+	{ 0x273E,	I18N_NOOP("Fleurons") },
+	{ 0x2742,	I18N_NOOP("Stars, asterisks and snowflakes") },
+	{ 0x274C,	I18N_NOOP("Miscellaneous") },
+	{ 0x275B,	I18N_NOOP("Punctuation mark ornaments") },
+	{ 0x2766,	I18N_NOOP("Fleurons") },
+	{ 0x2768,	I18N_NOOP("Ornamental brackets") },
+	{ 0x2776,	I18N_NOOP("Dingbat circled digits") },
+	{ 0x2794,	I18N_NOOP("Dingbat arrow") },
+	{ 0x2795,	I18N_NOOP("Heavy variants of arithmetic symbols") },
+	{ 0x2798,	I18N_NOOP("Dingbat arrows") },
+	{ 0x27B0,	I18N_NOOP("Miscellaneous") },
+	{ 0x27B1,	I18N_NOOP("Dingbat arrows") },
+	{ 0x27BF,	I18N_NOOP("Miscellaneous") },
+};
+
+static const TDEUnicodeData::Subcategory MiscellaneousMathematicalSymbolsA[] = {
+	{ 0x27C0,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x27C5,	I18N_NOOP("Paired punctuation") },
+	{ 0x27C7,	I18N_NOOP("Operator") },
+	{ 0x27C8,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x27CA,	I18N_NOOP("Vertical line operator") },
+	{ 0x27CB,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x27CC,	I18N_NOOP("Division operator") },
+	{ 0x27CD,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x27CE,	I18N_NOOP("Operators") },
+	{ 0x27D0,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x27D1,	I18N_NOOP("Operators") },
+	{ 0x27D5,	I18N_NOOP("Database theory operators") },
+	{ 0x27D8,	I18N_NOOP("Tacks and turnstiles") },
+	{ 0x27E0,	I18N_NOOP("Modal logic operators") },
+	{ 0x27E6,	I18N_NOOP("Mathematical brackets") },
+};
+
+static const TDEUnicodeData::Subcategory SupplementalArrowsA[] = {
+	{ 0x27F0,	I18N_NOOP("Arrows") },
+	{ 0x27F5,	I18N_NOOP("Long arrows") },
+};
+
+static const TDEUnicodeData::Subcategory BraillePatterns[] = {
+	{ 0x2800,	I18N_NOOP("Braille patterns") },
+};
+
+static const TDEUnicodeData::Subcategory SupplementalArrowsB[] = {
+	{ 0x2900,	I18N_NOOP("Miscellaneous arrows") },
+	{ 0x2919,	I18N_NOOP("Arrow tails") },
+	{ 0x291D,	I18N_NOOP("Miscellaneous arrows") },
+	{ 0x2927,	I18N_NOOP("Crossing arrows for knot theory") },
+	{ 0x2933,	I18N_NOOP("Miscellaneous curved arrows") },
+	{ 0x2942,	I18N_NOOP("Arrows combined with operators") },
+	{ 0x294A,	I18N_NOOP("Double-barbed harpoons") },
+	{ 0x2952,	I18N_NOOP("Modified harpoons") },
+	{ 0x2962,	I18N_NOOP("Paired harpoons") },
+	{ 0x2970,	I18N_NOOP("Miscellaneous arrow") },
+	{ 0x2971,	I18N_NOOP("Arrows combined with relations") },
+	{ 0x297C,	I18N_NOOP("Fish tails") },
+};
+
+static const TDEUnicodeData::Subcategory MiscellaneousMathematicalSymbolsB[] = {
+	{ 0x2980,	I18N_NOOP("Miscellaneous mathematical symbols") },
+	{ 0x2983,	I18N_NOOP("Brackets") },
+	{ 0x298D,	I18N_NOOP("Brackets with ticks") },
+	{ 0x2991,	I18N_NOOP("Brackets") },
+	{ 0x2999,	I18N_NOOP("Fences") },
+	{ 0x299B,	I18N_NOOP("Angles") },
+	{ 0x29B0,	I18N_NOOP("Empty sets") },
+	{ 0x29B5,	I18N_NOOP("Circle symbols") },
+	{ 0x29C4,	I18N_NOOP("Square symbols") },
+	{ 0x29CA,	I18N_NOOP("Triangle symbols") },
+	{ 0x29D1,	I18N_NOOP("Bowtie symbols") },
+	{ 0x29D8,	I18N_NOOP("Fences") },
+	{ 0x29DC,	I18N_NOOP("Miscellaneous mathematical symbols") },
+	{ 0x29E3,	I18N_NOOP("Relations") },
+	{ 0x29E7,	I18N_NOOP("Miscellaneous mathematical symbols") },
+	{ 0x29EE,	I18N_NOOP("Error bar symbols") },
+	{ 0x29F4,	I18N_NOOP("Miscellaneous mathematical symbols") },
+	{ 0x29F8,	I18N_NOOP("Large operators") },
+	{ 0x29FA,	I18N_NOOP("Specialized plus sign operators") },
+	{ 0x29FC,	I18N_NOOP("Brackets") },
+	{ 0x29FE,	I18N_NOOP("Symbols used in game theory") },
+};
+
+static const TDEUnicodeData::Subcategory SupplementalMathematicalOperators[] = {
+	{ 0x2A00,	I18N_NOOP("N-ary operators") },
+	{ 0x2A0A,	I18N_NOOP("Summations and integrals") },
+	{ 0x2A1D,	I18N_NOOP("Miscellaneous large operators") },
+	{ 0x2A22,	I18N_NOOP("Plus and minus sign operators") },
+	{ 0x2A2F,	I18N_NOOP("Multiplication and division sign operators") },
+	{ 0x2A39,	I18N_NOOP("Miscellaneous mathematical operators") },
+	{ 0x2A40,	I18N_NOOP("Intersections and unions") },
+	{ 0x2A51,	I18N_NOOP("Logical ands and ors") },
+	{ 0x2A64,	I18N_NOOP("Miscellaneous mathematical operators") },
+	{ 0x2A66,	I18N_NOOP("Relational operators") },
+	{ 0x2ABD,	I18N_NOOP("Subset and superset relations") },
+	{ 0x2AD9,	I18N_NOOP("Forks") },
+	{ 0x2ADE,	I18N_NOOP("Tacks and turnstiles") },
+	{ 0x2AEE,	I18N_NOOP("Vertical line operators") },
+	{ 0x2AF6,	I18N_NOOP("Miscellaneous mathematical operator") },
+	{ 0x2AF7,	I18N_NOOP("Relations") },
+	{ 0x2AFC,	I18N_NOOP("Operators") },
+};
+
+static const TDEUnicodeData::Subcategory MiscellaneousSymbolsandArrows[] = {
+	{ 0x2B00,	I18N_NOOP("White and black arrows") },
+	{ 0x2B0E,	I18N_NOOP("Arrows with bent tips") },
+	{ 0x2B12,	I18N_NOOP("Squares") },
+	{ 0x2B16,	I18N_NOOP("Diamonds") },
+	{ 0x2B1A,	I18N_NOOP("Squares") },
+	{ 0x2B1F,	I18N_NOOP("Pentagons") },
+	{ 0x2B21,	I18N_NOOP("Hexagons") },
+	{ 0x2B24,	I18N_NOOP("Circle") },
+	{ 0x2B25,	I18N_NOOP("Diamonds and lozenges") },
+	{ 0x2B2C,	I18N_NOOP("Ellipses") },
+	{ 0x2B30,	I18N_NOOP("Mathematical arrows") },
+	{ 0x2B4D,	I18N_NOOP("Miscellaneous arrow") },
+	{ 0x2B4E,	I18N_NOOP("Intonation marks for Lithuanian dialectology") },
+	{ 0x2B50,	I18N_NOOP("Stars") },
+	{ 0x2B53,	I18N_NOOP("Pentagons") },
+	{ 0x2B55,	I18N_NOOP("Traffic sign from ARIB STD B24") },
+	{ 0x2B56,	I18N_NOOP("Dictionary and map symbols from ARIB STD B24") },
+	{ 0x2B5A,	I18N_NOOP("Intonation marks for Lithuanian dialectology") },
+	{ 0x2B60,	I18N_NOOP("Triangle-headed arrows") },
+	{ 0x2B7E,	I18N_NOOP("Keyboard symbols") },
+	{ 0x2B80,	I18N_NOOP("Paired triangle-headed arrows") },
+	{ 0x2B88,	I18N_NOOP("Circled arrows") },
+	{ 0x2B8C,	I18N_NOOP("Triangle-headed u-shaped arrows") },
+	{ 0x2B90,	I18N_NOOP("Keyboard symbols") },
+	{ 0x2B94,	I18N_NOOP("Miscellaneous arrow symbol") },
+	{ 0x2B95,	I18N_NOOP("Black arrow") },
+	{ 0x2B96,	I18N_NOOP("Symbol used in chess notation") },
+	{ 0x2B97,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x2B98,	I18N_NOOP("Arrowheads") },
+	{ 0x2BA0,	I18N_NOOP("Triangle-headed arrows with bent tips") },
+	{ 0x2BA8,	I18N_NOOP("Black curved arrows") },
+	{ 0x2BB0,	I18N_NOOP("Ribbon arrows") },
+	{ 0x2BB8,	I18N_NOOP("Keyboard symbols") },
+	{ 0x2BBA,	I18N_NOOP("Symbols used in chess notation") },
+	{ 0x2BBD,	I18N_NOOP("Geometric symbols") },
+	{ 0x2BC0,	I18N_NOOP("Centred geometric shapes") },
+	{ 0x2BC9,	I18N_NOOP("Astronomical symbol") },
+	{ 0x2BCA,	I18N_NOOP("Half circles") },
+	{ 0x2BCC,	I18N_NOOP("Cusp shapes") },
+	{ 0x2BD0,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x2BD3,	I18N_NOOP("Astrological symbols for Pluto") },
+	{ 0x2BD7,	I18N_NOOP("Miscellaneous astrological symbols") },
+	{ 0x2BE0,	I18N_NOOP("Uranian astrological symbols") },
+	{ 0x2BE8,	I18N_NOOP("Half star characters") },
+	{ 0x2BEC,	I18N_NOOP("Two-headed arrow symbols") },
+	{ 0x2BF0,	I18N_NOOP("Astrological symbols for Eris and Sedna") },
+	{ 0x2BF3,	I18N_NOOP("Russian astrological aspects") },
+	{ 0x2BF9,	I18N_NOOP("Symbols used in chess notation") },
+	{ 0x2BFF,	I18N_NOOP("Miscellaneous symbol") },
+};
+
+static const TDEUnicodeData::Subcategory Glagolitic[] = {
+	{ 0x2C00,	I18N_NOOP("Capital letters") },
+	{ 0x2C30,	I18N_NOOP("Small letters") },
+};
+
+static const TDEUnicodeData::Subcategory LatinExtendedC[] = {
+	{ 0x2C60,	I18N_NOOP("Orthographic Latin additions") },
+	{ 0x2C67,	I18N_NOOP("Additions for Uyghur") },
+	{ 0x2C6D,	I18N_NOOP("Miscellaneous additions") },
+	{ 0x2C75,	I18N_NOOP("Claudian letters") },
+	{ 0x2C77,	I18N_NOOP("Additions for UPA") },
+	{ 0x2C7E,	I18N_NOOP("Additions for Shona") },
+};
+
+static const TDEUnicodeData::Subcategory Coptic[] = {
+	{ 0x2C80,	I18N_NOOP("Bohairic Coptic letters") },
+	{ 0x2CB2,	I18N_NOOP("Old Coptic and dialect letters") },
+	{ 0x2CDC,	I18N_NOOP("Old Nubian letters") },
+	{ 0x2CE4,	I18N_NOOP("Symbols") },
+	{ 0x2CEB,	I18N_NOOP("Cryptogrammic letters") },
+	{ 0x2CEF,	I18N_NOOP("Combining marks") },
+	{ 0x2CF2,	I18N_NOOP("Bohairic Coptic letters") },
+	{ 0x2CF9,	I18N_NOOP("Old Nubian punctuation") },
+	{ 0x2CFD,	I18N_NOOP("Numeric character") },
+	{ 0x2CFE,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory GeorgianSupplement[] = {
+	{ 0x2D00,	I18N_NOOP("Small letters (Khutsuri)") },
+	{ 0x2D27,	I18N_NOOP("Additional letter") },
+	{ 0x2D2D,	I18N_NOOP("Additional letter for Ossetian") },
+};
+
+static const TDEUnicodeData::Subcategory Tifinagh[] = {
+	{ 0x2D30,	I18N_NOOP("Letters") },
+	{ 0x2D6F,	I18N_NOOP("Modifier letter") },
+	{ 0x2D70,	I18N_NOOP("Punctuation") },
+	{ 0x2D7F,	I18N_NOOP("Sign") },
+};
+
+static const TDEUnicodeData::Subcategory EthiopicExtended[] = {
+	{ 0x2D80,	I18N_NOOP("Syllables for Me'en") },
+	{ 0x2D93,	I18N_NOOP("Syllables for Blin") },
+	{ 0x2DA0,	I18N_NOOP("Syllables for Bench") },
+	{ 0x2DC0,	I18N_NOOP("Syllables for Gurage") },
+};
+
+static const TDEUnicodeData::Subcategory CyrillicExtendedA[] = {
+	{ 0x2DE0,	I18N_NOOP("Old Church Slavonic combining letters") },
+};
+
+static const TDEUnicodeData::Subcategory SupplementalPunctuation[] = {
+	{ 0x2E00,	I18N_NOOP("New Testament editorial symbols") },
+	{ 0x2E0E,	I18N_NOOP("Ancient Greek textual symbols") },
+	{ 0x2E17,	I18N_NOOP("Ancient Near-Eastern linguistic symbol") },
+	{ 0x2E18,	I18N_NOOP("General punctuation") },
+	{ 0x2E1A,	I18N_NOOP("Dictionary punctuation") },
+	{ 0x2E1C,	I18N_NOOP("Brackets") },
+	{ 0x2E1E,	I18N_NOOP("Dictionary punctuation") },
+	{ 0x2E20,	I18N_NOOP("Brackets") },
+	{ 0x2E22,	I18N_NOOP("Half brackets") },
+	{ 0x2E26,	I18N_NOOP("Brackets") },
+	{ 0x2E2A,	I18N_NOOP("Historic punctuation") },
+	{ 0x2E32,	I18N_NOOP("Palaeotype transliteration symbol") },
+	{ 0x2E33,	I18N_NOOP("Historic punctuation") },
+	{ 0x2E35,	I18N_NOOP("Palaeotype transliteration symbols") },
+	{ 0x2E3A,	I18N_NOOP("Dashes") },
+	{ 0x2E3C,	I18N_NOOP("Alternate forms of punctuation") },
+	{ 0x2E3F,	I18N_NOOP("Historic punctuation") },
+	{ 0x2E40,	I18N_NOOP("Double hyphen") },
+	{ 0x2E41,	I18N_NOOP("Reversed punctuation") },
+	{ 0x2E43,	I18N_NOOP("Miscellaneous punctuation") },
+	{ 0x2E45,	I18N_NOOP("Typicon punctuation") },
+	{ 0x2E4A,	I18N_NOOP("Historic punctuation") },
+	{ 0x2E55,	I18N_NOOP("Brackets") },
+	{ 0x2E59,	I18N_NOOP("Parentheses top and bottom halves") },
+	{ 0x2E5D,	I18N_NOOP("Oblique hyphen") },
+};
+
+static const TDEUnicodeData::Subcategory CJKRadicalsSupplement[] = {
+	{ 0x2E80,	I18N_NOOP("CJK radicals supplement") },
+};
+
+static const TDEUnicodeData::Subcategory KangxiRadicals[] = {
+	{ 0x2F00,	I18N_NOOP("Kangxi radicals") },
+};
+
+static const TDEUnicodeData::Subcategory IdeographicDescriptionCharacters[] = {
+	{ 0x2FF0,	I18N_NOOP("Ideographic description characters") },
+};
+
+static const TDEUnicodeData::Subcategory CJKSymbolsandPunctuation[] = {
+	{ 0x3000,	I18N_NOOP("CJK symbols and punctuation") },
+	{ 0x3008,	I18N_NOOP("CJK angle brackets") },
+	{ 0x300C,	I18N_NOOP("CJK corner brackets") },
+	{ 0x3010,	I18N_NOOP("CJK brackets") },
+	{ 0x3012,	I18N_NOOP("CJK symbols") },
+	{ 0x3014,	I18N_NOOP("CJK brackets") },
+	{ 0x301C,	I18N_NOOP("CJK punctuation") },
+	{ 0x3020,	I18N_NOOP("CJK symbol") },
+	{ 0x3021,	I18N_NOOP("Suzhou numerals") },
+	{ 0x302A,	I18N_NOOP("Combining tone marks") },
+	{ 0x3030,	I18N_NOOP("Other CJK punctuation") },
+	{ 0x3031,	I18N_NOOP("Kana repeat marks") },
+	{ 0x3036,	I18N_NOOP("Other CJK symbols") },
+	{ 0x3038,	I18N_NOOP("Additional Suzhou numerals") },
+	{ 0x303B,	I18N_NOOP("Other CJK punctuation") },
+	{ 0x303E,	I18N_NOOP("Special CJK indicators") },
+};
+
+static const TDEUnicodeData::Subcategory Hiragana[] = {
+	{ 0x3041,	I18N_NOOP("Hiragana letters") },
+	{ 0x3095,	I18N_NOOP("Small letters") },
+	{ 0x3099,	I18N_NOOP("Voicing marks") },
+	{ 0x309D,	I18N_NOOP("Iteration marks") },
+	{ 0x309F,	I18N_NOOP("Hiragana digraph") },
+};
+
+static const TDEUnicodeData::Subcategory Katakana[] = {
+	{ 0x30A0,	I18N_NOOP("Katakana punctuation") },
+	{ 0x30A1,	I18N_NOOP("Katakana letters") },
+	{ 0x30FB,	I18N_NOOP("Conjunction and length marks") },
+	{ 0x30FD,	I18N_NOOP("Iteration marks") },
+	{ 0x30FF,	I18N_NOOP("Katakana digraph") },
+};
+
+static const TDEUnicodeData::Subcategory Bopomofo[] = {
+	{ 0x3105,	I18N_NOOP("Based on GB 2312") },
+	{ 0x312A,	I18N_NOOP("Dialect (non-Mandarin) letters") },
+	{ 0x312D,	I18N_NOOP("Miscellaneous additions") },
+};
+
+static const TDEUnicodeData::Subcategory HangulCompatibilityJamo[] = {
+	{ 0x3131,	I18N_NOOP("Consonant letters") },
+	{ 0x314F,	I18N_NOOP("Vowel letters") },
+	{ 0x3164,	I18N_NOOP("Special character") },
+	{ 0x3165,	I18N_NOOP("Old consonant letters") },
+	{ 0x3187,	I18N_NOOP("Old vowel letters") },
+};
+
+static const TDEUnicodeData::Subcategory Kanbun[] = {
+	{ 0x3190,	I18N_NOOP("Tateten") },
+	{ 0x3191,	I18N_NOOP("Kaeriten") },
+};
+
+static const TDEUnicodeData::Subcategory BopomofoExtended[] = {
+	{ 0x31A0,	I18N_NOOP("Extended Bopomofo for Minnan and Hakka") },
+	{ 0x31B8,	I18N_NOOP("Extended Bopomofo for Hmu and Ge") },
+	{ 0x31BB,	I18N_NOOP("Extended Bopomofo for Minnan and Hakka") },
+	{ 0x31BC,	I18N_NOOP("Extended Bopomofo for Cantonese") },
+};
+
+static const TDEUnicodeData::Subcategory CJKStrokes[] = {
+	{ 0x31C0,	I18N_NOOP("CJK strokes") },
+	{ 0x31EF,	I18N_NOOP("Ideographic description character") },
+};
+
+static const TDEUnicodeData::Subcategory KatakanaPhoneticExtensions[] = {
+	{ 0x31F0,	I18N_NOOP("Phonetic extensions for Ainu") },
+};
+
+static const TDEUnicodeData::Subcategory EnclosedCJKLettersandMonths[] = {
+	{ 0x3200,	I18N_NOOP("Parenthesized Hangul letters") },
+	{ 0x320E,	I18N_NOOP("Parenthesized Hangul syllables") },
+	{ 0x321D,	I18N_NOOP("Parenthesized Korean words") },
+	{ 0x3220,	I18N_NOOP("Parenthesized ideographs") },
+	{ 0x3244,	I18N_NOOP("Circled ideographs from ARIB STD B24") },
+	{ 0x3248,	I18N_NOOP("Circled numbers on black squares from ARIB STD B24") },
+	{ 0x3250,	I18N_NOOP("Squared Latin abbreviation") },
+	{ 0x3251,	I18N_NOOP("Circled numbers") },
+	{ 0x3260,	I18N_NOOP("Circled Hangul letters") },
+	{ 0x326E,	I18N_NOOP("Circled Hangul syllables") },
+	{ 0x327C,	I18N_NOOP("Circled Korean words") },
+	{ 0x327E,	I18N_NOOP("Circled Hangul syllable") },
+	{ 0x327F,	I18N_NOOP("Symbol") },
+	{ 0x3280,	I18N_NOOP("Circled ideographs") },
+	{ 0x32B1,	I18N_NOOP("Circled numbers") },
+	{ 0x32C0,	I18N_NOOP("Telegraph symbols for months") },
+	{ 0x32CC,	I18N_NOOP("Squared Latin abbreviations") },
+	{ 0x32D0,	I18N_NOOP("Circled Katakana") },
+	{ 0x32FF,	I18N_NOOP("Japanese era name") },
+};
+
+static const TDEUnicodeData::Subcategory CJKCompatibility[] = {
+	{ 0x3300,	I18N_NOOP("Squared Katakana words") },
+	{ 0x3358,	I18N_NOOP("Telegraph symbols for hours") },
+	{ 0x3371,	I18N_NOOP("Squared Latin abbreviations") },
+	{ 0x337B,	I18N_NOOP("Japanese era names") },
+	{ 0x337F,	I18N_NOOP("Japanese corporation") },
+	{ 0x3380,	I18N_NOOP("Squared Latin abbreviations") },
+	{ 0x3395,	I18N_NOOP("Abbreviations involving liter symbols") },
+	{ 0x3399,	I18N_NOOP("Squared Latin abbreviations") },
+	{ 0x33E0,	I18N_NOOP("Telegraph symbols for days") },
+	{ 0x33FF,	I18N_NOOP("Squared Latin abbreviation") },
+};
+
+static const TDEUnicodeData::Subcategory CJKUnifiedIdeographsExtensionA[] = {
+};
+
+static const TDEUnicodeData::Subcategory YijingHexagramSymbols[] = {
+	{ 0x4DC0,	I18N_NOOP("Yijing hexagram symbols") },
+};
+
+static const TDEUnicodeData::Subcategory CJKUnifiedIdeographs[] = {
+};
+
+static const TDEUnicodeData::Subcategory YiSyllables[] = {
+	{ 0xA000,	I18N_NOOP("Syllables") },
+	{ 0xA015,	I18N_NOOP("Syllable iteration mark") },
+	{ 0xA016,	I18N_NOOP("Syllables") },
+};
+
+static const TDEUnicodeData::Subcategory YiRadicals[] = {
+	{ 0xA490,	I18N_NOOP("Yi radicals") },
+};
+
+static const TDEUnicodeData::Subcategory Lisu[] = {
+	{ 0xA4D0,	I18N_NOOP("Consonants") },
+	{ 0xA4EE,	I18N_NOOP("Vowels") },
+	{ 0xA4F8,	I18N_NOOP("Tones") },
+	{ 0xA4FE,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Vai[] = {
+	{ 0xA500,	I18N_NOOP("Syllables in -ee") },
+	{ 0xA524,	I18N_NOOP("Syllables in -i") },
+	{ 0xA549,	I18N_NOOP("Syllables in -a") },
+	{ 0xA571,	I18N_NOOP("Syllables in -oo") },
+	{ 0xA595,	I18N_NOOP("Syllables in -u") },
+	{ 0xA5BA,	I18N_NOOP("Syllables in -o") },
+	{ 0xA5E1,	I18N_NOOP("Syllables in -e") },
+	{ 0xA60B,	I18N_NOOP("Syllable finals") },
+	{ 0xA60D,	I18N_NOOP("Punctuation") },
+	{ 0xA610,	I18N_NOOP("Historic syllables") },
+	{ 0xA613,	I18N_NOOP("Logograms") },
+	{ 0xA620,	I18N_NOOP("Digits") },
+	{ 0xA62A,	I18N_NOOP("Historic syllables") },
+};
+
+static const TDEUnicodeData::Subcategory CyrillicExtendedB[] = {
+	{ 0xA640,	I18N_NOOP("Letters for Old Cyrillic") },
+	{ 0xA66F,	I18N_NOOP("Abbreviation mark") },
+	{ 0xA670,	I18N_NOOP("Combining numeric signs") },
+	{ 0xA673,	I18N_NOOP("Punctuation mark") },
+	{ 0xA674,	I18N_NOOP("Combining marks for Old Cyrillic") },
+	{ 0xA67E,	I18N_NOOP("Punctuation mark") },
+	{ 0xA67F,	I18N_NOOP("Modifier letter") },
+	{ 0xA680,	I18N_NOOP("Letters for Old Abkhasian orthography") },
+	{ 0xA698,	I18N_NOOP("Letters for Old Cyrillic") },
+	{ 0xA69C,	I18N_NOOP("Intonation marks for Lithuanian dialectology") },
+	{ 0xA69E,	I18N_NOOP("Combining marks for Old Cyrillic") },
+};
+
+static const TDEUnicodeData::Subcategory Bamum[] = {
+	{ 0xA6A0,	I18N_NOOP("Syllables") },
+	{ 0xA6F0,	I18N_NOOP("Combining marks") },
+	{ 0xA6F2,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory ModifierToneLetters[] = {
+	{ 0xA700,	I18N_NOOP("Corner tone marks for Chinese") },
+	{ 0xA708,	I18N_NOOP("Dotted tone letters") },
+	{ 0xA712,	I18N_NOOP("Left-stem tone letters") },
+	{ 0xA717,	I18N_NOOP("Chinantec tone marks") },
+	{ 0xA71B,	I18N_NOOP("Africanist tone letters") },
+};
+
+static const TDEUnicodeData::Subcategory LatinExtendedD[] = {
+	{ 0xA720,	I18N_NOOP("Additions for UPA") },
+	{ 0xA722,	I18N_NOOP("Egyptological additions") },
+	{ 0xA726,	I18N_NOOP("Mayanist additions") },
+	{ 0xA730,	I18N_NOOP("Medievalist additions") },
+	{ 0xA779,	I18N_NOOP("Insular and Celticist letters") },
+	{ 0xA788,	I18N_NOOP("Modifier letters") },
+	{ 0xA78B,	I18N_NOOP("Orthographic letters for glottals") },
+	{ 0xA78D,	I18N_NOOP("Additional letter") },
+	{ 0xA78E,	I18N_NOOP("Phonetic symbol") },
+	{ 0xA78F,	I18N_NOOP("Transliteration letter for sinology") },
+	{ 0xA790,	I18N_NOOP("Additional letters") },
+	{ 0xA794,	I18N_NOOP("Additions for Lithuanian dialectology") },
+	{ 0xA796,	I18N_NOOP("Letters for Middle Vietnamese") },
+	{ 0xA798,	I18N_NOOP("Archaic letters for Ewe") },
+	{ 0xA79A,	I18N_NOOP("Archaic letters for Volapük") },
+	{ 0xA7A0,	I18N_NOOP("Letters for pre-1921 Latvian orthography") },
+	{ 0xA7AA,	I18N_NOOP("Additional letters") },
+	{ 0xA7AE,	I18N_NOOP("Letter for West African languages") },
+	{ 0xA7AF,	I18N_NOOP("Letter for Japanese phonemic transcription") },
+	{ 0xA7B0,	I18N_NOOP("Letters for Americanist orthographies") },
+	{ 0xA7B2,	I18N_NOOP("Letter for African languages") },
+	{ 0xA7B3,	I18N_NOOP("Letter for German dialectology") },
+	{ 0xA7B4,	I18N_NOOP("Letters for African languages") },
+	{ 0xA7B8,	I18N_NOOP("Letters for Mazahua (México)") },
+	{ 0xA7BA,	I18N_NOOP("Letters for Ugaritic and Egyptological transliteration") },
+	{ 0xA7C0,	I18N_NOOP("Additional medieval letters") },
+	{ 0xA7C4,	I18N_NOOP("Letters used in early Pinyin romanization") },
+	{ 0xA7C7,	I18N_NOOP("Additional letters for Gaulish") },
+	{ 0xA7CB,	I18N_NOOP("Letter for Eastern Dan") },
+	{ 0xA7CC,	I18N_NOOP("Letters for Luiseño") },
+	{ 0xA7CE,	I18N_NOOP("Cased voiced pharyngeal letters") },
+	{ 0xA7D0,	I18N_NOOP("Letters used in the Middle English Ormulum") },
+	{ 0xA7D6,	I18N_NOOP("Letters used in medieval palaeography") },
+	{ 0xA7DA,	I18N_NOOP("Letters used in Wakashan and Salishan languages") },
+	{ 0xA7F1,	I18N_NOOP("Modifier letters for Chatino (México)") },
+	{ 0xA7F4,	I18N_NOOP("Modifier letter for Japanese phonemic transcription") },
+	{ 0xA7F5,	I18N_NOOP("Ancient Gaulish and Celtic epigraphic letters") },
+	{ 0xA7F8,	I18N_NOOP("Additions for Extended IPA") },
+	{ 0xA7FA,	I18N_NOOP("Addition for UPA") },
+	{ 0xA7FB,	I18N_NOOP("Ancient Roman epigraphic letters") },
+};
+
+static const TDEUnicodeData::Subcategory SylotiNagri[] = {
+	{ 0xA800,	I18N_NOOP("Independent vowels and dvisvara") },
+	{ 0xA806,	I18N_NOOP("Sign") },
+	{ 0xA807,	I18N_NOOP("Consonants and consonant signs") },
+	{ 0xA823,	I18N_NOOP("Dependent vowel signs") },
+	{ 0xA828,	I18N_NOOP("Poetry marks") },
+	{ 0xA82C,	I18N_NOOP("Sign") },
+};
+
+static const TDEUnicodeData::Subcategory CommonIndicNumberForms[] = {
+	{ 0xA830,	I18N_NOOP("Number forms") },
+	{ 0xA837,	I18N_NOOP("Miscellaneous sign") },
+	{ 0xA838,	I18N_NOOP("Currency symbol") },
+	{ 0xA839,	I18N_NOOP("Miscellaneous sign") },
+};
+
+static const TDEUnicodeData::Subcategory Phagspa[] = {
+	{ 0xA840,	I18N_NOOP("Consonants") },
+	{ 0xA85D,	I18N_NOOP("Letter A") },
+	{ 0xA85E,	I18N_NOOP("Vowels") },
+	{ 0xA862,	I18N_NOOP("Consonants") },
+	{ 0xA866,	I18N_NOOP("Vowel") },
+	{ 0xA867,	I18N_NOOP("Subjoined consonants") },
+	{ 0xA869,	I18N_NOOP("Consonant additions for Sanskrit") },
+	{ 0xA86D,	I18N_NOOP("Alternate consonant forms for Chinese") },
+	{ 0xA871,	I18N_NOOP("Subjoined consonant") },
+	{ 0xA872,	I18N_NOOP("Consonant addition for Tibetan") },
+	{ 0xA873,	I18N_NOOP("Candrabindu") },
+	{ 0xA874,	I18N_NOOP("Head marks for Tibetan") },
+	{ 0xA876,	I18N_NOOP("Punctuation for Tibetan") },
+};
+
+static const TDEUnicodeData::Subcategory Saurashtra[] = {
+	{ 0xA880,	I18N_NOOP("Various signs") },
+	{ 0xA882,	I18N_NOOP("Independent vowels") },
+	{ 0xA892,	I18N_NOOP("Consonants") },
+	{ 0xA8B5,	I18N_NOOP("Dependent vowel signs") },
+	{ 0xA8C4,	I18N_NOOP("Virama") },
+	{ 0xA8C5,	I18N_NOOP("Sign") },
+	{ 0xA8CE,	I18N_NOOP("Punctuation") },
+	{ 0xA8D0,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory DevanagariExtended[] = {
+	{ 0xA8E0,	I18N_NOOP("Cantillation marks (svara) for the Samaveda") },
+	{ 0xA8F2,	I18N_NOOP("Marks of nasalization") },
+	{ 0xA8F8,	I18N_NOOP("Editorial marks") },
+	{ 0xA8FC,	I18N_NOOP("Signs") },
+	{ 0xA8FE,	I18N_NOOP("Additional vowel and vowel sign") },
+};
+
+static const TDEUnicodeData::Subcategory KayahLi[] = {
+	{ 0xA900,	I18N_NOOP("Digits") },
+	{ 0xA90A,	I18N_NOOP("Consonants") },
+	{ 0xA922,	I18N_NOOP("Vowels") },
+	{ 0xA92B,	I18N_NOOP("Tone marks") },
+	{ 0xA92E,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Rejang[] = {
+	{ 0xA930,	I18N_NOOP("Consonants") },
+	{ 0xA947,	I18N_NOOP("Vowel signs") },
+	{ 0xA94F,	I18N_NOOP("Consonant signs") },
+	{ 0xA953,	I18N_NOOP("Virama") },
+	{ 0xA95F,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory HangulJamoExtendedA[] = {
+	{ 0xA960,	I18N_NOOP("Old initial consonants") },
+};
+
+static const TDEUnicodeData::Subcategory Javanese[] = {
+	{ 0xA980,	I18N_NOOP("Various signs") },
+	{ 0xA984,	I18N_NOOP("Letters") },
+	{ 0xA9B3,	I18N_NOOP("Sign") },
+	{ 0xA9B4,	I18N_NOOP("Dependent vowel signs") },
+	{ 0xA9BD,	I18N_NOOP("Dependent consonant signs") },
+	{ 0xA9C0,	I18N_NOOP("Sign") },
+	{ 0xA9C1,	I18N_NOOP("Punctuation") },
+	{ 0xA9CF,	I18N_NOOP("Syllable reduplicator") },
+	{ 0xA9D0,	I18N_NOOP("Digits") },
+	{ 0xA9DE,	I18N_NOOP("Ellipsis marks") },
+};
+
+static const TDEUnicodeData::Subcategory MyanmarExtendedB[] = {
+	{ 0xA9E0,	I18N_NOOP("Additions for Shan Pali") },
+	{ 0xA9E6,	I18N_NOOP("Reduplication mark") },
+	{ 0xA9E7,	I18N_NOOP("Tai Laing consonants") },
+	{ 0xA9F0,	I18N_NOOP("Tai Laing digits") },
+	{ 0xA9FA,	I18N_NOOP("Tai Laing consonants") },
+};
+
+static const TDEUnicodeData::Subcategory Cham[] = {
+	{ 0xAA00,	I18N_NOOP("Independent vowels") },
+	{ 0xAA06,	I18N_NOOP("Consonants") },
+	{ 0xAA29,	I18N_NOOP("Dependent vowel signs") },
+	{ 0xAA33,	I18N_NOOP("Consonant signs") },
+	{ 0xAA40,	I18N_NOOP("Final consonants") },
+	{ 0xAA50,	I18N_NOOP("Digits") },
+	{ 0xAA5C,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory MyanmarExtendedA[] = {
+	{ 0xAA60,	I18N_NOOP("Khamti Shan consonants") },
+	{ 0xAA74,	I18N_NOOP("Khamti Shan logograms") },
+	{ 0xAA77,	I18N_NOOP("Aiton symbols and letters") },
+	{ 0xAA7B,	I18N_NOOP("Pa'o Karen tone mark") },
+	{ 0xAA7C,	I18N_NOOP("Tai Laing tone marks") },
+	{ 0xAA7E,	I18N_NOOP("Shwe Palaung letters") },
+};
+
+static const TDEUnicodeData::Subcategory TaiViet[] = {
+	{ 0xAA80,	I18N_NOOP("Consonants") },
+	{ 0xAAB0,	I18N_NOOP("Vowels and finals") },
+	{ 0xAABF,	I18N_NOOP("Tones") },
+	{ 0xAADB,	I18N_NOOP("Word ligature symbols") },
+	{ 0xAADD,	I18N_NOOP("Repetition mark") },
+	{ 0xAADE,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory MeeteiMayekExtensions[] = {
+	{ 0xAAE0,	I18N_NOOP("Independent vowel signs") },
+	{ 0xAAE2,	I18N_NOOP("Consonants") },
+	{ 0xAAEB,	I18N_NOOP("Dependent vowel signs") },
+	{ 0xAAF0,	I18N_NOOP("Punctuation") },
+	{ 0xAAF2,	I18N_NOOP("Sign") },
+	{ 0xAAF3,	I18N_NOOP("Repetition marks") },
+	{ 0xAAF5,	I18N_NOOP("Sign") },
+	{ 0xAAF6,	I18N_NOOP("Virama") },
+};
+
+static const TDEUnicodeData::Subcategory EthiopicExtendedA[] = {
+	{ 0xAB01,	I18N_NOOP("Gamo-Gofa-Dawro and Basketo") },
+	{ 0xAB11,	I18N_NOOP("Gamo-Gofa-Dawro") },
+	{ 0xAB20,	I18N_NOOP("Gumuz") },
+};
+
+static const TDEUnicodeData::Subcategory LatinExtendedE[] = {
+	{ 0xAB30,	I18N_NOOP("Letters for German dialectology") },
+	{ 0xAB5B,	I18N_NOOP("Modifier letters for German dialectology") },
+	{ 0xAB60,	I18N_NOOP("Historic letters for Sakha (Yakut)") },
+	{ 0xAB64,	I18N_NOOP("Letters for Americanist orthographies") },
+	{ 0xAB66,	I18N_NOOP("Letters for sinological and Tibetanist phonetic transcription") },
+	{ 0xAB68,	I18N_NOOP("Letters for Scots dialectology") },
+};
+
+static const TDEUnicodeData::Subcategory CherokeeSupplement[] = {
+	{ 0xAB70,	I18N_NOOP("Lowercase syllables") },
+};
+
+static const TDEUnicodeData::Subcategory MeeteiMayek[] = {
+	{ 0xABC0,	I18N_NOOP("Letters") },
+	{ 0xABDB,	I18N_NOOP("Final consonants") },
+	{ 0xABE3,	I18N_NOOP("Dependent vowel signs") },
+	{ 0xABEB,	I18N_NOOP("Punctuation") },
+	{ 0xABF0,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory HangulSyllables[] = {
+};
+
+static const TDEUnicodeData::Subcategory HangulJamoExtendedB[] = {
+	{ 0xD7B0,	I18N_NOOP("Old medial vowels") },
+	{ 0xD7CB,	I18N_NOOP("Old final consonants") },
+};
+
+static const TDEUnicodeData::Subcategory HighSurrogates[] = {
+};
+
+static const TDEUnicodeData::Subcategory HighPrivateUseSurrogates[] = {
+};
+
+static const TDEUnicodeData::Subcategory LowSurrogates[] = {
+};
+
+static const TDEUnicodeData::Subcategory PrivateUseArea[] = {
+};
+
+static const TDEUnicodeData::Subcategory CJKCompatibilityIdeographs[] = {
+	{ 0xF900,	I18N_NOOP("Pronunciation variants from KS X 1001:1998") },
+	{ 0xFA0C,	I18N_NOOP("Duplicate characters from Big 5") },
+	{ 0xFA0E,	I18N_NOOP("The IBM 32 compatibility ideographs") },
+	{ 0xFA2E,	I18N_NOOP("Korean compatibility ideographs") },
+	{ 0xFA30,	I18N_NOOP("JIS X 0213 compatibility ideographs") },
+	{ 0xFA6B,	I18N_NOOP("ARIB compatibility ideographs") },
+	{ 0xFA70,	I18N_NOOP("DPRK compatibility ideographs") },
+};
+
+static const TDEUnicodeData::Subcategory AlphabeticPresentationForms[] = {
+	{ 0xFB00,	I18N_NOOP("Latin ligatures") },
+	{ 0xFB13,	I18N_NOOP("Armenian ligatures") },
+	{ 0xFB1D,	I18N_NOOP("Hebrew presentation forms") },
+};
+
+static const TDEUnicodeData::Subcategory ArabicPresentationFormsA[] = {
+	{ 0xFB50,	I18N_NOOP("Glyphs for contextual forms of letters for Persian, Urdu, Sindhi, etc.") },
+	{ 0xFBB2,	I18N_NOOP("Arabic pedagogical symbols") },
+	{ 0xFBC3,	I18N_NOOP("Honorific word ligatures") },
+	{ 0xFBD3,	I18N_NOOP("Glyphs for contextual forms of letters for Central Asian languages") },
+	{ 0xFBEA,	I18N_NOOP("Ligatures (two elements)") },
+	{ 0xFD3E,	I18N_NOOP("Punctuation") },
+	{ 0xFD40,	I18N_NOOP("Honorific word ligatures") },
+	{ 0xFD50,	I18N_NOOP("Ligatures (three elements)") },
+	{ 0xFD90,	I18N_NOOP("Honorific word ligatures") },
+	{ 0xFD92,	I18N_NOOP("Ligatures (three elements)") },
+	{ 0xFDC8,	I18N_NOOP("Honorific word ligatures") },
+	{ 0xFDD0,	I18N_NOOP("Noncharacters") },
+	{ 0xFDF0,	I18N_NOOP("Word ligatures") },
+	{ 0xFDFC,	I18N_NOOP("Currency symbol") },
+	{ 0xFDFD,	I18N_NOOP("Honorific word ligatures") },
+};
+
+static const TDEUnicodeData::Subcategory VariationSelectors[] = {
+	{ 0xFE00,	I18N_NOOP("Variation selectors") },
+	{ 0xFE0E,	I18N_NOOP("Emoji-specific variation selectors") },
+};
+
+static const TDEUnicodeData::Subcategory VerticalForms[] = {
+	{ 0xFE10,	I18N_NOOP("Glyphs for vertical variants") },
+};
+
+static const TDEUnicodeData::Subcategory CombiningHalfMarks[] = {
+	{ 0xFE20,	I18N_NOOP("Combining half marks") },
+	{ 0xFE24,	I18N_NOOP("Continuous macrons for Coptic") },
+	{ 0xFE27,	I18N_NOOP("Combining half marks below") },
+	{ 0xFE2E,	I18N_NOOP("Combining half marks") },
+};
+
+static const TDEUnicodeData::Subcategory CJKCompatibilityForms[] = {
+	{ 0xFE30,	I18N_NOOP("Glyphs for vertical variants") },
+	{ 0xFE45,	I18N_NOOP("Sidelining emphasis marks") },
+	{ 0xFE47,	I18N_NOOP("Glyphs for vertical variants") },
+	{ 0xFE49,	I18N_NOOP("Overscores and underscores") },
+};
+
+static const TDEUnicodeData::Subcategory SmallFormVariants[] = {
+	{ 0xFE50,	I18N_NOOP("Small form variants") },
+};
+
+static const TDEUnicodeData::Subcategory ArabicPresentationFormsB[] = {
+	{ 0xFE70,	I18N_NOOP("Glyphs for spacing forms of Arabic points") },
+	{ 0xFE73,	I18N_NOOP("Glyph part") },
+	{ 0xFE74,	I18N_NOOP("Glyphs for spacing forms of Arabic points") },
+	{ 0xFE80,	I18N_NOOP("Basic glyphs for Arabic language contextual forms") },
+	{ 0xFEFF,	I18N_NOOP("Special") },
+};
+
+static const TDEUnicodeData::Subcategory HalfwidthandFullwidthForms[] = {
+	{ 0xFF01,	I18N_NOOP("Fullwidth ASCII variants") },
+	{ 0xFF5F,	I18N_NOOP("Fullwidth brackets") },
+	{ 0xFF61,	I18N_NOOP("Halfwidth CJK punctuation") },
+	{ 0xFF65,	I18N_NOOP("Halfwidth Katakana variants") },
+	{ 0xFFA0,	I18N_NOOP("Halfwidth Hangul variants") },
+	{ 0xFFE0,	I18N_NOOP("Fullwidth symbol variants") },
+	{ 0xFFE8,	I18N_NOOP("Halfwidth symbol variants") },
+};
+
+static const TDEUnicodeData::Subcategory Specials[] = {
+	{ 0xFFF9,	I18N_NOOP("Interlinear annotation") },
+	{ 0xFFFC,	I18N_NOOP("Replacement characters") },
+	{ 0xFFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory LinearBSyllabary[] = {
+	{ 0x10000,	I18N_NOOP("Basic syllables") },
+	{ 0x10040,	I18N_NOOP("Supplementary signs") },
+	{ 0x10050,	I18N_NOOP("Symbols") },
+};
+
+static const TDEUnicodeData::Subcategory LinearBIdeograms[] = {
+	{ 0x10080,	I18N_NOOP("People and animals") },
+	{ 0x1008E,	I18N_NOOP("Cereals and plants") },
+	{ 0x10095,	I18N_NOOP("Extracts") },
+	{ 0x1009A,	I18N_NOOP("Metals") },
+	{ 0x1009D,	I18N_NOOP("Other materials") },
+	{ 0x100DE,	I18N_NOOP("Vessels") },
+};
+
+static const TDEUnicodeData::Subcategory AegeanNumbers[] = {
+	{ 0x10100,	I18N_NOOP("Punctuation") },
+	{ 0x10107,	I18N_NOOP("Numbers") },
+	{ 0x10137,	I18N_NOOP("Measures") },
+};
+
+static const TDEUnicodeData::Subcategory AncientGreekNumbers[] = {
+	{ 0x10140,	I18N_NOOP("Ancient Greek acrophonic numerals") },
+	{ 0x10175,	I18N_NOOP("Ancient Greek papyrological numbers") },
+	{ 0x1018C,	I18N_NOOP("Ancient Greek symbols") },
+};
+
+static const TDEUnicodeData::Subcategory AncientSymbols[] = {
+	{ 0x10190,	I18N_NOOP("Roman weights and measures") },
+	{ 0x10196,	I18N_NOOP("Roman coin symbols") },
+	{ 0x1019B,	I18N_NOOP("Other Roman epigraphic symbols") },
+	{ 0x101A0,	I18N_NOOP("Greek symbol") },
+};
+
+static const TDEUnicodeData::Subcategory PhaistosDisc[] = {
+	{ 0x101D0,	I18N_NOOP("Signs") },
+	{ 0x101FD,	I18N_NOOP("Combining stroke") },
+};
+
+static const TDEUnicodeData::Subcategory Lycian[] = {
+	{ 0x10280,	I18N_NOOP("Letters") },
+};
+
+static const TDEUnicodeData::Subcategory Carian[] = {
+	{ 0x102A0,	I18N_NOOP("Letters") },
+};
+
+static const TDEUnicodeData::Subcategory CopticEpactNumbers[] = {
+	{ 0x102E0,	I18N_NOOP("Sign") },
+	{ 0x102E1,	I18N_NOOP("Digits") },
+	{ 0x102EA,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory OldItalic[] = {
+	{ 0x10300,	I18N_NOOP("Letters") },
+	{ 0x1031B,	I18N_NOOP("Umbrian letters") },
+	{ 0x1031D,	I18N_NOOP("Oscan letters") },
+	{ 0x1031F,	I18N_NOOP("South Picene letter") },
+	{ 0x10320,	I18N_NOOP("Numerals") },
+	{ 0x1032D,	I18N_NOOP("North Italic letters") },
+};
+
+static const TDEUnicodeData::Subcategory Gothic[] = {
+	{ 0x10330,	I18N_NOOP("Letters") },
+};
+
+static const TDEUnicodeData::Subcategory OldPermic[] = {
+	{ 0x10350,	I18N_NOOP("Letters") },
+	{ 0x10376,	I18N_NOOP("Combining letters") },
+};
+
+static const TDEUnicodeData::Subcategory Ugaritic[] = {
+	{ 0x10380,	I18N_NOOP("Letters") },
+	{ 0x1039F,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory OldPersian[] = {
+	{ 0x103A0,	I18N_NOOP("Independent vowels") },
+	{ 0x103A3,	I18N_NOOP("Consonants") },
+	{ 0x103C8,	I18N_NOOP("Various signs") },
+	{ 0x103D0,	I18N_NOOP("Punctuation") },
+	{ 0x103D1,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory Deseret[] = {
+	{ 0x10400,	I18N_NOOP("Uppercase letters") },
+	{ 0x10428,	I18N_NOOP("Lowercase letters") },
+};
+
+static const TDEUnicodeData::Subcategory Shavian[] = {
+	{ 0x10450,	I18N_NOOP("Tall and deep letters (consonants)") },
+	{ 0x10464,	I18N_NOOP("Short letters") },
+	{ 0x10478,	I18N_NOOP("Ligatures") },
+};
+
+static const TDEUnicodeData::Subcategory Osmanya[] = {
+	{ 0x10480,	I18N_NOOP("Letters") },
+	{ 0x104A0,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory Osage[] = {
+	{ 0x104B0,	I18N_NOOP("Uppercase letters") },
+	{ 0x104D8,	I18N_NOOP("Lowercase letters") },
+};
+
+static const TDEUnicodeData::Subcategory Elbasan[] = {
+	{ 0x10500,	I18N_NOOP("Letters") },
+};
+
+static const TDEUnicodeData::Subcategory CaucasianAlbanian[] = {
+	{ 0x10530,	I18N_NOOP("Letters") },
+	{ 0x1056F,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Vithkuqi[] = {
+	{ 0x10570,	I18N_NOOP("Capital letters") },
+	{ 0x10597,	I18N_NOOP("Small letters") },
+};
+
+static const TDEUnicodeData::Subcategory Todhri[] = {
+};
+
+static const TDEUnicodeData::Subcategory LinearA[] = {
+	{ 0x10600,	I18N_NOOP("Simple signs") },
+	{ 0x106A0,	I18N_NOOP("Vase shapes") },
+	{ 0x106B3,	I18N_NOOP("Complex signs") },
+	{ 0x10727,	I18N_NOOP("Complex signs with vase shapes") },
+	{ 0x10740,	I18N_NOOP("Fractions and compound fractions") },
+	{ 0x10760,	I18N_NOOP("Additional signs") },
+};
+
+static const TDEUnicodeData::Subcategory LatinExtendedF[] = {
+	{ 0x10780,	I18N_NOOP("Modifier letter for VoQS") },
+	{ 0x10781,	I18N_NOOP("Modifier letters for IPA") },
+};
+
+static const TDEUnicodeData::Subcategory CypriotSyllabary[] = {
+	{ 0x10800,	I18N_NOOP("Syllables") },
+};
+
+static const TDEUnicodeData::Subcategory ImperialAramaic[] = {
+	{ 0x10840,	I18N_NOOP("Letters") },
+	{ 0x10857,	I18N_NOOP("Punctuation") },
+	{ 0x10858,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory Palmyrene[] = {
+	{ 0x10860,	I18N_NOOP("Letters") },
+	{ 0x10877,	I18N_NOOP("Symbols") },
+	{ 0x10879,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory Nabataean[] = {
+	{ 0x10880,	I18N_NOOP("Letters") },
+	{ 0x108A7,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory Hatran[] = {
+	{ 0x108E0,	I18N_NOOP("Letters") },
+	{ 0x108FB,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory Phoenician[] = {
+	{ 0x10900,	I18N_NOOP("Letters") },
+	{ 0x10916,	I18N_NOOP("Numbers") },
+	{ 0x1091F,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Lydian[] = {
+	{ 0x10920,	I18N_NOOP("Letters") },
+	{ 0x1093F,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Sidetic[] = {
+	{ 0x10940,	I18N_NOOP("Vowel and semivowel letters") },
+	{ 0x10947,	I18N_NOOP("Consonant letters") },
+};
+
+static const TDEUnicodeData::Subcategory MeroiticHieroglyphs[] = {
+	{ 0x10980,	I18N_NOOP("Vowel letters") },
+	{ 0x10984,	I18N_NOOP("Consonant letters") },
+	{ 0x1099E,	I18N_NOOP("Symbols") },
+};
+
+static const TDEUnicodeData::Subcategory MeroiticCursive[] = {
+	{ 0x109A0,	I18N_NOOP("Vowel letters") },
+	{ 0x109A4,	I18N_NOOP("Consonant letters") },
+	{ 0x109BC,	I18N_NOOP("Fractions") },
+	{ 0x109BE,	I18N_NOOP("Logograms") },
+	{ 0x109C0,	I18N_NOOP("Digits") },
+	{ 0x109C9,	I18N_NOOP("Tens") },
+	{ 0x109D2,	I18N_NOOP("Hundreds") },
+	{ 0x109DB,	I18N_NOOP("Thousands") },
+	{ 0x109E4,	I18N_NOOP("Ten thousands") },
+	{ 0x109ED,	I18N_NOOP("Hundred thousands") },
+	{ 0x109F6,	I18N_NOOP("Fractions") },
+};
+
+static const TDEUnicodeData::Subcategory Kharoshthi[] = {
+	{ 0x10A00,	I18N_NOOP("Vowels") },
+	{ 0x10A0C,	I18N_NOOP("Length mark") },
+	{ 0x10A0D,	I18N_NOOP("Various signs") },
+	{ 0x10A10,	I18N_NOOP("Consonants") },
+	{ 0x10A38,	I18N_NOOP("Various signs") },
+	{ 0x10A3F,	I18N_NOOP("Virama") },
+	{ 0x10A40,	I18N_NOOP("Digits") },
+	{ 0x10A44,	I18N_NOOP("Numbers and fractions") },
+	{ 0x10A50,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory OldSouthArabian[] = {
+	{ 0x10A60,	I18N_NOOP("Letters") },
+	{ 0x10A7D,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory OldNorthArabian[] = {
+	{ 0x10A80,	I18N_NOOP("Letters") },
+	{ 0x10A9D,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory Manichaean[] = {
+	{ 0x10AC0,	I18N_NOOP("Letters") },
+	{ 0x10AC8,	I18N_NOOP("Logogram") },
+	{ 0x10AC9,	I18N_NOOP("Letters") },
+	{ 0x10AE5,	I18N_NOOP("Combining marks") },
+	{ 0x10AEB,	I18N_NOOP("Numbers") },
+	{ 0x10AF0,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Avestan[] = {
+	{ 0x10B00,	I18N_NOOP("Vowels") },
+	{ 0x10B10,	I18N_NOOP("Consonants") },
+	{ 0x10B39,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory InscriptionalParthian[] = {
+	{ 0x10B40,	I18N_NOOP("Letters") },
+	{ 0x10B58,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory InscriptionalPahlavi[] = {
+	{ 0x10B60,	I18N_NOOP("Letters") },
+	{ 0x10B78,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory PsalterPahlavi[] = {
+	{ 0x10B80,	I18N_NOOP("Letters") },
+	{ 0x10B99,	I18N_NOOP("Punctuation") },
+	{ 0x10BA9,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory OldTurkic[] = {
+	{ 0x10C00,	I18N_NOOP("Vowels") },
+	{ 0x10C09,	I18N_NOOP("Consonants") },
+};
+
+static const TDEUnicodeData::Subcategory OldHungarian[] = {
+	{ 0x10C80,	I18N_NOOP("Uppercase letters") },
+	{ 0x10CC0,	I18N_NOOP("Lowercase letters") },
+	{ 0x10CFA,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory HanifiRohingya[] = {
+	{ 0x10D00,	I18N_NOOP("Letters") },
+	{ 0x10D1C,	I18N_NOOP("Additional letter") },
+	{ 0x10D1D,	I18N_NOOP("Vowels") },
+	{ 0x10D22,	I18N_NOOP("Vowel silencer") },
+	{ 0x10D23,	I18N_NOOP("Nasalization mark") },
+	{ 0x10D24,	I18N_NOOP("Tone signs") },
+	{ 0x10D27,	I18N_NOOP("Gemination sign") },
+	{ 0x10D30,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory Garay[] = {
+	{ 0x10D40,	I18N_NOOP("Digits") },
+	{ 0x10D4A,	I18N_NOOP("Vowel signs") },
+	{ 0x10D4E,	I18N_NOOP("Vowel modifiers") },
+	{ 0x10D50,	I18N_NOOP("Uppercase consonant letters") },
+	{ 0x10D69,	I18N_NOOP("Vowel sign") },
+	{ 0x10D6A,	I18N_NOOP("Marks") },
+	{ 0x10D6E,	I18N_NOOP("Punctuation and reduplication mark") },
+	{ 0x10D70,	I18N_NOOP("Lowercase consonant letters") },
+	{ 0x10D8E,	I18N_NOOP("Mathematical symbols") },
+};
+
+static const TDEUnicodeData::Subcategory RumiNumeralSymbols[] = {
+	{ 0x10E60,	I18N_NOOP("Digits") },
+	{ 0x10E69,	I18N_NOOP("Numbers") },
+	{ 0x10E7B,	I18N_NOOP("Fractions") },
+};
+
+static const TDEUnicodeData::Subcategory Yezidi[] = {
+	{ 0x10E80,	I18N_NOOP("Letters") },
+	{ 0x10EAB,	I18N_NOOP("Combining marks") },
+	{ 0x10EAD,	I18N_NOOP("Punctuation") },
+	{ 0x10EB0,	I18N_NOOP("Historical letters with diacritics") },
+};
+
+static const TDEUnicodeData::Subcategory ArabicExtendedC[] = {
+	{ 0x10EC2,	I18N_NOOP("Letters for Pegon") },
+	{ 0x10EC5,	I18N_NOOP("Quranic letter used in Indonesia") },
+	{ 0x10EC6,	I18N_NOOP("Quranic letter used in Warsh orthography") },
+	{ 0x10EC7,	I18N_NOOP("Letter used for Swahili") },
+	{ 0x10ED0,	I18N_NOOP("Biblical punctuation mark") },
+	{ 0x10ED1,	I18N_NOOP("Honorific word ligatures") },
+	{ 0x10EFA,	I18N_NOOP("Tanween mark used in Old Sindhi") },
+	{ 0x10EFB,	I18N_NOOP("Quranic mark used in Indonesia") },
+	{ 0x10EFC,	I18N_NOOP("Quranic mark used in Libya") },
+	{ 0x10EFD,	I18N_NOOP("Quranic marks used in Turkey") },
+};
+
+static const TDEUnicodeData::Subcategory OldSogdian[] = {
+	{ 0x10F00,	I18N_NOOP("Letters") },
+	{ 0x10F1D,	I18N_NOOP("Numbers") },
+	{ 0x10F27,	I18N_NOOP("Ligature") },
+};
+
+static const TDEUnicodeData::Subcategory Sogdian[] = {
+	{ 0x10F30,	I18N_NOOP("Letters") },
+	{ 0x10F45,	I18N_NOOP("Phonogram") },
+	{ 0x10F46,	I18N_NOOP("Combining marks") },
+	{ 0x10F51,	I18N_NOOP("Numbers") },
+	{ 0x10F55,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory OldUyghur[] = {
+	{ 0x10F70,	I18N_NOOP("Letters") },
+	{ 0x10F82,	I18N_NOOP("Combining signs") },
+	{ 0x10F86,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Chorasmian[] = {
+	{ 0x10FB0,	I18N_NOOP("Letters") },
+	{ 0x10FC5,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory Elymaic[] = {
+	{ 0x10FE0,	I18N_NOOP("Letters") },
+	{ 0x10FF6,	I18N_NOOP("Ligature") },
+};
+
+static const TDEUnicodeData::Subcategory Brahmi[] = {
+	{ 0x11000,	I18N_NOOP("Various signs") },
+	{ 0x11005,	I18N_NOOP("Independent vowels") },
+	{ 0x11013,	I18N_NOOP("Consonants") },
+	{ 0x11038,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11046,	I18N_NOOP("Virama") },
+	{ 0x11047,	I18N_NOOP("Punctuation") },
+	{ 0x11052,	I18N_NOOP("Numbers") },
+	{ 0x11066,	I18N_NOOP("Digits") },
+	{ 0x11070,	I18N_NOOP("Virama") },
+	{ 0x11071,	I18N_NOOP("Independent vowels") },
+	{ 0x11073,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11075,	I18N_NOOP("Consonant") },
+	{ 0x1107F,	I18N_NOOP("Number joiner") },
+};
+
+static const TDEUnicodeData::Subcategory Kaithi[] = {
+	{ 0x11080,	I18N_NOOP("Various signs") },
+	{ 0x11083,	I18N_NOOP("Independent vowels") },
+	{ 0x1108D,	I18N_NOOP("Consonants") },
+	{ 0x110B0,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x110B9,	I18N_NOOP("Virama") },
+	{ 0x110BA,	I18N_NOOP("Various signs") },
+	{ 0x110BE,	I18N_NOOP("Punctuation") },
+	{ 0x110C2,	I18N_NOOP("Vowel sign") },
+	{ 0x110CD,	I18N_NOOP("Sign") },
+};
+
+static const TDEUnicodeData::Subcategory SoraSompeng[] = {
+	{ 0x110D0,	I18N_NOOP("Consonants") },
+	{ 0x110E2,	I18N_NOOP("Vowels") },
+	{ 0x110E8,	I18N_NOOP("Other letter") },
+	{ 0x110F0,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory Chakma[] = {
+	{ 0x11100,	I18N_NOOP("Various signs") },
+	{ 0x11103,	I18N_NOOP("Independent vowels") },
+	{ 0x11107,	I18N_NOOP("Consonants") },
+	{ 0x11127,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11133,	I18N_NOOP("Various signs") },
+	{ 0x11136,	I18N_NOOP("Digits") },
+	{ 0x11140,	I18N_NOOP("Punctuation") },
+	{ 0x11144,	I18N_NOOP("Consonant") },
+	{ 0x11145,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11147,	I18N_NOOP("Consonant") },
+};
+
+static const TDEUnicodeData::Subcategory Mahajani[] = {
+	{ 0x11150,	I18N_NOOP("Vowels") },
+	{ 0x11155,	I18N_NOOP("Consonants") },
+	{ 0x11173,	I18N_NOOP("Sign") },
+	{ 0x11174,	I18N_NOOP("Punctuation") },
+	{ 0x11176,	I18N_NOOP("Word ligature") },
+};
+
+static const TDEUnicodeData::Subcategory Sharada[] = {
+	{ 0x11180,	I18N_NOOP("Various signs") },
+	{ 0x11183,	I18N_NOOP("Independent vowels") },
+	{ 0x11191,	I18N_NOOP("Consonants") },
+	{ 0x111B3,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x111C0,	I18N_NOOP("Virama") },
+	{ 0x111C1,	I18N_NOOP("Various signs") },
+	{ 0x111C5,	I18N_NOOP("Punctuation") },
+	{ 0x111C9,	I18N_NOOP("Sign") },
+	{ 0x111CA,	I18N_NOOP("Signs for Kashmiri") },
+	{ 0x111CD,	I18N_NOOP("Punctuation") },
+	{ 0x111CE,	I18N_NOOP("Historic vowel sign") },
+	{ 0x111CF,	I18N_NOOP("Sign") },
+	{ 0x111D0,	I18N_NOOP("Digits") },
+	{ 0x111DA,	I18N_NOOP("Punctuation") },
+	{ 0x111DE,	I18N_NOOP("Section marks") },
+};
+
+static const TDEUnicodeData::Subcategory SinhalaArchaicNumbers[] = {
+	{ 0x111E1,	I18N_NOOP("Historical digits") },
+	{ 0x111EA,	I18N_NOOP("Historical numbers") },
+};
+
+static const TDEUnicodeData::Subcategory Khojki[] = {
+	{ 0x11200,	I18N_NOOP("Independent vowels") },
+	{ 0x11208,	I18N_NOOP("Consonants") },
+	{ 0x1122C,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11234,	I18N_NOOP("Various signs") },
+	{ 0x11238,	I18N_NOOP("Punctuation") },
+	{ 0x1123E,	I18N_NOOP("Sign") },
+	{ 0x1123F,	I18N_NOOP("Consonant") },
+	{ 0x11240,	I18N_NOOP("Independent vowel") },
+	{ 0x11241,	I18N_NOOP("Dependent vowel sign") },
+};
+
+static const TDEUnicodeData::Subcategory Multani[] = {
+	{ 0x11280,	I18N_NOOP("Vowels") },
+	{ 0x11284,	I18N_NOOP("Consonants") },
+	{ 0x112A9,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Khudawadi[] = {
+	{ 0x112B0,	I18N_NOOP("Independent vowels") },
+	{ 0x112BA,	I18N_NOOP("Consonants") },
+	{ 0x112DF,	I18N_NOOP("Sign") },
+	{ 0x112E0,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x112E9,	I18N_NOOP("Various signs") },
+	{ 0x112F0,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory Grantha[] = {
+	{ 0x11300,	I18N_NOOP("Various signs") },
+	{ 0x11305,	I18N_NOOP("Independent vowels") },
+	{ 0x11315,	I18N_NOOP("Consonants") },
+	{ 0x1133B,	I18N_NOOP("Various signs") },
+	{ 0x1133E,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x1134B,	I18N_NOOP("Two-part dependent vowel signs") },
+	{ 0x1134D,	I18N_NOOP("Virama") },
+	{ 0x11350,	I18N_NOOP("Sign") },
+	{ 0x11357,	I18N_NOOP("Dependent vowel sign") },
+	{ 0x1135D,	I18N_NOOP("Sign") },
+	{ 0x1135E,	I18N_NOOP("Anusvaras") },
+	{ 0x11360,	I18N_NOOP("Independent vowels") },
+	{ 0x11362,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11366,	I18N_NOOP("Cantillation marks (svara) for the Samaveda") },
+};
+
+static const TDEUnicodeData::Subcategory TuluTigalari[] = {
+	{ 0x11380,	I18N_NOOP("Independent vowels") },
+	{ 0x11392,	I18N_NOOP("Consonants") },
+	{ 0x113B7,	I18N_NOOP("Avagraha") },
+	{ 0x113B8,	I18N_NOOP("Vowel signs") },
+	{ 0x113C9,	I18N_NOOP("Various signs") },
+	{ 0x113D3,	I18N_NOOP("Vowel length mark") },
+	{ 0x113D4,	I18N_NOOP("Punctuation") },
+	{ 0x113E1,	I18N_NOOP("Vedic tone marks") },
+};
+
+static const TDEUnicodeData::Subcategory Newa[] = {
+	{ 0x11400,	I18N_NOOP("Independent vowels") },
+	{ 0x1140E,	I18N_NOOP("Consonants") },
+	{ 0x11435,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11442,	I18N_NOOP("Various signs") },
+	{ 0x11449,	I18N_NOOP("Invocation signs") },
+	{ 0x1144B,	I18N_NOOP("Punctuation") },
+	{ 0x11450,	I18N_NOOP("Digits") },
+	{ 0x1145A,	I18N_NOOP("Punctuation") },
+	{ 0x1145B,	I18N_NOOP("Various signs") },
+};
+
+static const TDEUnicodeData::Subcategory Tirhuta[] = {
+	{ 0x11480,	I18N_NOOP("Sign") },
+	{ 0x11481,	I18N_NOOP("Independent vowels") },
+	{ 0x1148F,	I18N_NOOP("Consonants") },
+	{ 0x114B0,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x114BF,	I18N_NOOP("Various signs") },
+	{ 0x114D0,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory Siddham[] = {
+	{ 0x11580,	I18N_NOOP("Independent vowels") },
+	{ 0x1158E,	I18N_NOOP("Consonants") },
+	{ 0x115AF,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x115BC,	I18N_NOOP("Various signs") },
+	{ 0x115C1,	I18N_NOOP("Head mark") },
+	{ 0x115C2,	I18N_NOOP("Punctuation") },
+	{ 0x115C6,	I18N_NOOP("Repetition marks") },
+	{ 0x115C9,	I18N_NOOP("Terminal mark") },
+	{ 0x115CA,	I18N_NOOP("Section marks") },
+	{ 0x115D8,	I18N_NOOP("Alternate letters") },
+	{ 0x115DC,	I18N_NOOP("Alternate vowel signs") },
+};
+
+static const TDEUnicodeData::Subcategory Modi[] = {
+	{ 0x11600,	I18N_NOOP("Independent vowels") },
+	{ 0x1160E,	I18N_NOOP("Consonants") },
+	{ 0x11630,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x1163D,	I18N_NOOP("Various signs") },
+	{ 0x11641,	I18N_NOOP("Punctuation") },
+	{ 0x11644,	I18N_NOOP("Sign") },
+	{ 0x11650,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory MongolianSupplement[] = {
+	{ 0x11660,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Takri[] = {
+	{ 0x11680,	I18N_NOOP("Independent vowels") },
+	{ 0x1168A,	I18N_NOOP("Consonants") },
+	{ 0x116AB,	I18N_NOOP("Various signs") },
+	{ 0x116AD,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x116B6,	I18N_NOOP("Virama") },
+	{ 0x116B7,	I18N_NOOP("Nukta") },
+	{ 0x116B8,	I18N_NOOP("Consonant") },
+	{ 0x116B9,	I18N_NOOP("Punctuation") },
+	{ 0x116C0,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory MyanmarExtendedC[] = {
+	{ 0x116D0,	I18N_NOOP("Pao digits") },
+	{ 0x116DA,	I18N_NOOP("Eastern Pwo Karen digits") },
+};
+
+static const TDEUnicodeData::Subcategory Ahom[] = {
+	{ 0x11700,	I18N_NOOP("Consonants") },
+	{ 0x1171D,	I18N_NOOP("Medials") },
+	{ 0x11720,	I18N_NOOP("Vowel signs") },
+	{ 0x11730,	I18N_NOOP("Digits") },
+	{ 0x1173A,	I18N_NOOP("Numbers") },
+	{ 0x1173C,	I18N_NOOP("Punctuation") },
+	{ 0x11740,	I18N_NOOP("Additional consonants") },
+};
+
+static const TDEUnicodeData::Subcategory Dogra[] = {
+	{ 0x11800,	I18N_NOOP("Independent vowels") },
+	{ 0x1180A,	I18N_NOOP("Consonants") },
+	{ 0x1182C,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11837,	I18N_NOOP("Various signs") },
+	{ 0x1183B,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory WarangCiti[] = {
+	{ 0x118A0,	I18N_NOOP("Uppercase vowels") },
+	{ 0x118AA,	I18N_NOOP("Uppercase consonants") },
+	{ 0x118C0,	I18N_NOOP("Lowercase vowels") },
+	{ 0x118CA,	I18N_NOOP("Lowercase consonants") },
+	{ 0x118E0,	I18N_NOOP("Digits") },
+	{ 0x118EA,	I18N_NOOP("Numbers") },
+	{ 0x118FF,	I18N_NOOP("Sign") },
+};
+
+static const TDEUnicodeData::Subcategory DivesAkuru[] = {
+	{ 0x11900,	I18N_NOOP("Independent vowels") },
+	{ 0x1190C,	I18N_NOOP("Consonants") },
+	{ 0x11930,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x1193B,	I18N_NOOP("Nasalization signs") },
+	{ 0x1193D,	I18N_NOOP("Signs") },
+	{ 0x11940,	I18N_NOOP("Conjunct-specific letters") },
+	{ 0x11943,	I18N_NOOP("Nukta") },
+	{ 0x11944,	I18N_NOOP("Punctuation") },
+	{ 0x11950,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory Nandinagari[] = {
+	{ 0x119A0,	I18N_NOOP("Independent vowels") },
+	{ 0x119AE,	I18N_NOOP("Consonants") },
+	{ 0x119D1,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x119DE,	I18N_NOOP("Various signs") },
+	{ 0x119E3,	I18N_NOOP("Punctuation") },
+	{ 0x119E4,	I18N_NOOP("Dependent vowel sign") },
+};
+
+static const TDEUnicodeData::Subcategory ZanabazarSquare[] = {
+	{ 0x11A00,	I18N_NOOP("Vowel letter") },
+	{ 0x11A01,	I18N_NOOP("Vowel signs") },
+	{ 0x11A0A,	I18N_NOOP("Vowel length mark") },
+	{ 0x11A0B,	I18N_NOOP("Consonants") },
+	{ 0x11A33,	I18N_NOOP("Final consonant mark") },
+	{ 0x11A34,	I18N_NOOP("Virama") },
+	{ 0x11A35,	I18N_NOOP("Candrabindu and candra ornaments") },
+	{ 0x11A38,	I18N_NOOP("Signs for Sanskrit") },
+	{ 0x11A3A,	I18N_NOOP("Cluster-initial consonant") },
+	{ 0x11A3B,	I18N_NOOP("Cluster-final consonants") },
+	{ 0x11A3F,	I18N_NOOP("Head marks") },
+	{ 0x11A41,	I18N_NOOP("Punctuation") },
+	{ 0x11A45,	I18N_NOOP("Head marks") },
+	{ 0x11A47,	I18N_NOOP("Subjoiner") },
+};
+
+static const TDEUnicodeData::Subcategory Soyombo[] = {
+	{ 0x11A50,	I18N_NOOP("Vowel letter") },
+	{ 0x11A51,	I18N_NOOP("Vowel signs") },
+	{ 0x11A5B,	I18N_NOOP("Vowel length mark") },
+	{ 0x11A5C,	I18N_NOOP("Consonants") },
+	{ 0x11A84,	I18N_NOOP("Alternate visarga signs") },
+	{ 0x11A86,	I18N_NOOP("Cluster-initial letters") },
+	{ 0x11A8A,	I18N_NOOP("Final consonant signs") },
+	{ 0x11A96,	I18N_NOOP("Various signs") },
+	{ 0x11A98,	I18N_NOOP("Gemination mark") },
+	{ 0x11A99,	I18N_NOOP("Subjoiner") },
+	{ 0x11A9A,	I18N_NOOP("Punctuation") },
+	{ 0x11A9D,	I18N_NOOP("Elongation mark") },
+	{ 0x11A9E,	I18N_NOOP("Head marks") },
+	{ 0x11AA1,	I18N_NOOP("Terminal marks") },
+};
+
+static const TDEUnicodeData::Subcategory UnifiedCanadianAboriginalSyllabicsExtendedA[] = {
+	{ 0x11AB0,	I18N_NOOP("Syllables for Nattilik") },
+	{ 0x11ABC,	I18N_NOOP("Historic syllables for Cree and Ojibway") },
+};
+
+static const TDEUnicodeData::Subcategory PauCinHau[] = {
+	{ 0x11AC0,	I18N_NOOP("Consonants") },
+	{ 0x11AD5,	I18N_NOOP("Vowels") },
+	{ 0x11ADC,	I18N_NOOP("Final consonants") },
+	{ 0x11AE5,	I18N_NOOP("Tone marks") },
+};
+
+static const TDEUnicodeData::Subcategory DevanagariExtendedA[] = {
+	{ 0x11B00,	I18N_NOOP("Head marks") },
+	{ 0x11B02,	I18N_NOOP("Auspicious signs") },
+};
+
+static const TDEUnicodeData::Subcategory SharadaSupplement[] = {
+	{ 0x11B60,	I18N_NOOP("Kashmiri vowel signs") },
+};
+
+static const TDEUnicodeData::Subcategory Sunuwar[] = {
+	{ 0x11BC0,	I18N_NOOP("Letters") },
+	{ 0x11BE1,	I18N_NOOP("Punctuation") },
+	{ 0x11BF0,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory Bhaiksuki[] = {
+	{ 0x11C00,	I18N_NOOP("Independent vowels") },
+	{ 0x11C0E,	I18N_NOOP("Consonants") },
+	{ 0x11C2F,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11C3C,	I18N_NOOP("Various signs") },
+	{ 0x11C41,	I18N_NOOP("Punctuation") },
+	{ 0x11C44,	I18N_NOOP("Gap fillers") },
+	{ 0x11C50,	I18N_NOOP("Digits") },
+	{ 0x11C5A,	I18N_NOOP("Numbers") },
+};
+
+static const TDEUnicodeData::Subcategory Marchen[] = {
+	{ 0x11C70,	I18N_NOOP("Punctuation") },
+	{ 0x11C72,	I18N_NOOP("Letters") },
+	{ 0x11C92,	I18N_NOOP("Subjoined letters") },
+	{ 0x11CB0,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11CB5,	I18N_NOOP("Various signs") },
+};
+
+static const TDEUnicodeData::Subcategory MasaramGondi[] = {
+	{ 0x11D00,	I18N_NOOP("Vowels") },
+	{ 0x11D0C,	I18N_NOOP("Consonants") },
+	{ 0x11D2E,	I18N_NOOP("Conjunct letters") },
+	{ 0x11D31,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11D40,	I18N_NOOP("Various signs") },
+	{ 0x11D45,	I18N_NOOP("Virama") },
+	{ 0x11D46,	I18N_NOOP("Cluster-specific consonant forms") },
+	{ 0x11D50,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory GunjalaGondi[] = {
+	{ 0x11D60,	I18N_NOOP("Independent vowels") },
+	{ 0x11D6C,	I18N_NOOP("Consonants") },
+	{ 0x11D8A,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11D95,	I18N_NOOP("Various signs") },
+	{ 0x11D97,	I18N_NOOP("Virama") },
+	{ 0x11D98,	I18N_NOOP("Symbol") },
+	{ 0x11DA0,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory TolongSiki[] = {
+	{ 0x11DB0,	I18N_NOOP("Vowel letters") },
+	{ 0x11DB6,	I18N_NOOP("Consonant letters") },
+	{ 0x11DD9,	I18N_NOOP("Signs") },
+	{ 0x11DDB,	I18N_NOOP("Auspicious sign") },
+	{ 0x11DE0,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory Makasar[] = {
+	{ 0x11EE0,	I18N_NOOP("Consonants") },
+	{ 0x11EF2,	I18N_NOOP("Consonant reduplicator") },
+	{ 0x11EF3,	I18N_NOOP("Vowel signs") },
+	{ 0x11EF7,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Kawi[] = {
+	{ 0x11F00,	I18N_NOOP("Signs") },
+	{ 0x11F04,	I18N_NOOP("Independent vowels") },
+	{ 0x11F12,	I18N_NOOP("Consonants") },
+	{ 0x11F34,	I18N_NOOP("Dependent vowel signs") },
+	{ 0x11F41,	I18N_NOOP("Viramas") },
+	{ 0x11F43,	I18N_NOOP("Punctuation") },
+	{ 0x11F50,	I18N_NOOP("Digits") },
+	{ 0x11F5A,	I18N_NOOP("Nukta") },
+};
+
+static const TDEUnicodeData::Subcategory LisuSupplement[] = {
+	{ 0x11FB0,	I18N_NOOP("Letter") },
+};
+
+static const TDEUnicodeData::Subcategory TamilSupplement[] = {
+	{ 0x11FC0,	I18N_NOOP("Fractions") },
+	{ 0x11FD5,	I18N_NOOP("Measures of grain") },
+	{ 0x11FDD,	I18N_NOOP("Old currency symbols") },
+	{ 0x11FE1,	I18N_NOOP("Symbols of weight, length, and area") },
+	{ 0x11FE4,	I18N_NOOP("Agricultural symbols") },
+	{ 0x11FE8,	I18N_NOOP("Clerical symbols") },
+	{ 0x11FEE,	I18N_NOOP("Other symbols and abbreviations") },
+	{ 0x11FFF,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Cuneiform[] = {
+	{ 0x12000,	I18N_NOOP("Signs") },
+	{ 0x1236F,	I18N_NOOP("Elamite sign") },
+	{ 0x12370,	I18N_NOOP("Signs") },
+};
+
+static const TDEUnicodeData::Subcategory CuneiformNumbersandPunctuation[] = {
+	{ 0x12400,	I18N_NOOP("Common numeric signs") },
+	{ 0x12434,	I18N_NOOP("Area measures") },
+	{ 0x1243A,	I18N_NOOP("Variant stacking patterns") },
+	{ 0x1244A,	I18N_NOOP("Slanted numerals") },
+	{ 0x1244F,	I18N_NOOP("Capacity measures") },
+	{ 0x12458,	I18N_NOOP("Area measures") },
+	{ 0x1245A,	I18N_NOOP("Fractions") },
+	{ 0x12463,	I18N_NOOP("Capacity measures") },
+	{ 0x12465,	I18N_NOOP("Elamite fractions") },
+	{ 0x12467,	I18N_NOOP("Elamite numeric signs") },
+	{ 0x12469,	I18N_NOOP("Variant stacking patterns") },
+	{ 0x12470,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory EarlyDynasticCuneiform[] = {
+	{ 0x12480,	I18N_NOOP("Signs") },
+};
+
+static const TDEUnicodeData::Subcategory CyproMinoan[] = {
+	{ 0x12F90,	I18N_NOOP("Signs") },
+	{ 0x12FF1,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory EgyptianHieroglyphs[] = {
+	{ 0x13000,	I18N_NOOP("A. Man and his occupations") },
+	{ 0x13050,	I18N_NOOP("B. Woman and her occupations") },
+	{ 0x1305A,	I18N_NOOP("C. Anthropomorphic deities") },
+	{ 0x13076,	I18N_NOOP("D. Parts of the human body") },
+	{ 0x130D2,	I18N_NOOP("E. Mammals") },
+	{ 0x130FE,	I18N_NOOP("F. Parts of mammals") },
+	{ 0x1313F,	I18N_NOOP("G. Birds") },
+	{ 0x1317F,	I18N_NOOP("H. Parts of birds") },
+	{ 0x13188,	I18N_NOOP("I. Amphibious animals, reptiles, etc.") },
+	{ 0x1319B,	I18N_NOOP("K. Fishes and parts of fishes") },
+	{ 0x131A3,	I18N_NOOP("L. Invertebrata and lesser animals") },
+	{ 0x131AD,	I18N_NOOP("M. Trees and plants") },
+	{ 0x131EF,	I18N_NOOP("N. Sky, earth, water") },
+	{ 0x13220,	I18N_NOOP("NL. Nomes of Lower Egypt") },
+	{ 0x13236,	I18N_NOOP("NU. Nomes of Upper Egypt") },
+	{ 0x13250,	I18N_NOOP("O. Buildings, parts of buildings, etc.") },
+	{ 0x1329B,	I18N_NOOP("P. Ships and parts of ships") },
+	{ 0x132A8,	I18N_NOOP("Q. Domestic and funerary furniture") },
+	{ 0x132AF,	I18N_NOOP("R. Temple furniture and sacred emblems") },
+	{ 0x132D1,	I18N_NOOP("S. Crowns, dress, staves, etc.") },
+	{ 0x13307,	I18N_NOOP("T. Warfare, hunting, butchery") },
+	{ 0x13333,	I18N_NOOP("U. Agriculture, crafts, and professions") },
+	{ 0x13362,	I18N_NOOP("V. Rope, fiber, baskets, bags, etc.") },
+	{ 0x133AF,	I18N_NOOP("W. Vessels of stone and earthenware") },
+	{ 0x133CF,	I18N_NOOP("X. Loaves and cakes") },
+	{ 0x133DB,	I18N_NOOP("Y. Writings, games, music") },
+	{ 0x133E4,	I18N_NOOP("Z. Strokes, signs derived from Hieratic, geometrical figures") },
+	{ 0x1340D,	I18N_NOOP("Aa. Unclassified") },
+	{ 0x1342F,	I18N_NOOP("Addition to group V") },
+};
+
+static const TDEUnicodeData::Subcategory EgyptianHieroglyphFormatControls[] = {
+	{ 0x13430,	I18N_NOOP("Joiners") },
+	{ 0x13432,	I18N_NOOP("Sign insertion controls") },
+	{ 0x13436,	I18N_NOOP("Sign stacking control") },
+	{ 0x13437,	I18N_NOOP("Segment scoping delimiters") },
+	{ 0x13439,	I18N_NOOP("Sign insertion controls") },
+	{ 0x1343C,	I18N_NOOP("Enclosure controls") },
+	{ 0x13440,	I18N_NOOP("Mirror control") },
+	{ 0x13441,	I18N_NOOP("Blank and lost signs") },
+	{ 0x13447,	I18N_NOOP("Damage modifiers") },
+};
+
+static const TDEUnicodeData::Subcategory EgyptianHieroglyphsExtendedA[] = {
+	{ 0x13460,	I18N_NOOP("A01. Man seated or kneeling empty handed") },
+	{ 0x13488,	I18N_NOOP("A02. Man standing empty handed") },
+	{ 0x134A5,	I18N_NOOP("A04. Man adoring or bent") },
+	{ 0x134B0,	I18N_NOOP("A05. Man on the ground or in water") },
+	{ 0x134C6,	I18N_NOOP("A06. Man or god standing, holding a staff") },
+	{ 0x134DB,	I18N_NOOP("A07. Man seated or kneeling, holding something") },
+	{ 0x134FD,	I18N_NOOP("A08. Man standing, holding something") },
+	{ 0x13510,	I18N_NOOP("A09. Man seated, pouring water") },
+	{ 0x1351F,	I18N_NOOP("A10. Man standing, pouring water, spreading powder") },
+	{ 0x13527,	I18N_NOOP("A11. Man hiding") },
+	{ 0x1352B,	I18N_NOOP("A12. Man working") },
+	{ 0x1354E,	I18N_NOOP("A13. Shepherd and porter") },
+	{ 0x13563,	I18N_NOOP("A14. Man carrying a bundle") },
+	{ 0x1356B,	I18N_NOOP("A15. Man or god standing, composed with a hieroglyphic sign") },
+	{ 0x1358E,	I18N_NOOP("A16. Man or god holding a weapon") },
+	{ 0x135A5,	I18N_NOOP("A17. Soldier, seated") },
+	{ 0x135AF,	I18N_NOOP("A18. Prisoner and enemy") },
+	{ 0x135DE,	I18N_NOOP("A19. Dancer and acrobat") },
+	{ 0x135EB,	I18N_NOOP("A20. Musician") },
+	{ 0x13604,	I18N_NOOP("A21. Man and animal") },
+	{ 0x1361C,	I18N_NOOP("A22. Man in a boat") },
+	{ 0x1361D,	I18N_NOOP("A23. Child") },
+	{ 0x1363D,	I18N_NOOP("A24. Dwarf") },
+	{ 0x1363E,	I18N_NOOP("A25. King or noble seated on a chair") },
+	{ 0x13652,	I18N_NOOP("A26. King or god seated without crown") },
+	{ 0x13662,	I18N_NOOP("A27. King or god standing without crown") },
+	{ 0x1366F,	I18N_NOOP("A28. King or god wearing the white crown") },
+	{ 0x1368A,	I18N_NOOP("A29. King or god wearing the red crown") },
+	{ 0x13698,	I18N_NOOP("A30. King or god wearing another crown") },
+	{ 0x136B0,	I18N_NOOP("A31. Dead person kneeling") },
+	{ 0x136B5,	I18N_NOOP("A32. Mummy") },
+	{ 0x136B9,	I18N_NOOP("A33. Statue") },
+	{ 0x136C3,	I18N_NOOP("A34. Man, varia") },
+	{ 0x136D4,	I18N_NOOP("B01. Woman seated") },
+	{ 0x136F0,	I18N_NOOP("B02. Woman kneeling") },
+	{ 0x136F6,	I18N_NOOP("B03. Woman kneeling with visible arms") },
+	{ 0x13700,	I18N_NOOP("B04. Woman seated on a chair") },
+	{ 0x1370F,	I18N_NOOP("B05. Woman, standing") },
+	{ 0x1372A,	I18N_NOOP("B06. Queen or goddess, seated, wearing a crown") },
+	{ 0x1372D,	I18N_NOOP("B07. Queen or goddess, standing, wearing a crown") },
+	{ 0x13732,	I18N_NOOP("B08. Woman, musician") },
+	{ 0x13737,	I18N_NOOP("B09. Woman, queen or goddess pregnant, giving birth, breastfeeding") },
+	{ 0x13744,	I18N_NOOP("B10. Woman, varia") },
+	{ 0x13749,	I18N_NOOP("C01. God, seated, various headsets") },
+	{ 0x1375E,	I18N_NOOP("C02. God, various, with animal heads") },
+	{ 0x13763,	I18N_NOOP("C03. Amon") },
+	{ 0x1376E,	I18N_NOOP("C04. Anubis and canides gods") },
+	{ 0x1378D,	I18N_NOOP("C05. Apis and bull head gods") },
+	{ 0x13792,	I18N_NOOP("C07. Bes") },
+	{ 0x13793,	I18N_NOOP("C08. Chou") },
+	{ 0x13796,	I18N_NOOP("C09. Falcon, seated") },
+	{ 0x137CC,	I18N_NOOP("C10. Falcon, standing") },
+	{ 0x137DF,	I18N_NOOP("C11. Falcon, slaying an animal") },
+	{ 0x137E7,	I18N_NOOP("C12. Geb") },
+	{ 0x137E8,	I18N_NOOP("C13. Heh") },
+	{ 0x13804,	I18N_NOOP("C14. Ihy and children gods") },
+	{ 0x1380B,	I18N_NOOP("C15. Khnoum and ram gods") },
+	{ 0x1381B,	I18N_NOOP("C16. Gods with lion head") },
+	{ 0x1381E,	I18N_NOOP("C17. Min") },
+	{ 0x13821,	I18N_NOOP("C18. Nefertoum") },
+	{ 0x13822,	I18N_NOOP("C19. Nil") },
+	{ 0x1382B,	I18N_NOOP("C20. Onouris") },
+	{ 0x1382E,	I18N_NOOP("C21. Orion") },
+	{ 0x13830,	I18N_NOOP("C22. Osiris") },
+	{ 0x13839,	I18N_NOOP("C23. Ptah") },
+	{ 0x13843,	I18N_NOOP("C24. Re") },
+	{ 0x13848,	I18N_NOOP("C25. Rechep") },
+	{ 0x13849,	I18N_NOOP("C26. Seth") },
+	{ 0x13851,	I18N_NOOP("C27. Sobek") },
+	{ 0x13856,	I18N_NOOP("C28. Soped") },
+	{ 0x13857,	I18N_NOOP("C29. Gods with monkey head") },
+	{ 0x1385B,	I18N_NOOP("C30. Tatenen") },
+	{ 0x13864,	I18N_NOOP("C31. Thot") },
+	{ 0x13871,	I18N_NOOP("C32. Gods, varia") },
+	{ 0x13876,	I18N_NOOP("C33. Anoukis") },
+	{ 0x13878,	I18N_NOOP("C34. Ermouthis and snake goddesses") },
+	{ 0x1387D,	I18N_NOOP("C35. Hathor/Isis") },
+	{ 0x138AE,	I18N_NOOP("C36. Lion gods and goddesses") },
+	{ 0x138C8,	I18N_NOOP("C37. Maat") },
+	{ 0x138D7,	I18N_NOOP("C38. Meret") },
+	{ 0x138DE,	I18N_NOOP("C39. Mut") },
+	{ 0x138E5,	I18N_NOOP("C40. Neith") },
+	{ 0x138F0,	I18N_NOOP("C41. Nekhbet") },
+	{ 0x138F1,	I18N_NOOP("C42. Nephthys") },
+	{ 0x138F5,	I18N_NOOP("C43. Nout") },
+	{ 0x138FF,	I18N_NOOP("C44. Satis") },
+	{ 0x13900,	I18N_NOOP("C45. Seshat") },
+	{ 0x13905,	I18N_NOOP("C46. Sothis") },
+	{ 0x13907,	I18N_NOOP("C47. Goddesses, varia") },
+	{ 0x13923,	I18N_NOOP("C48. Goddesses, gods group") },
+	{ 0x1392D,	I18N_NOOP("D01. Head, sideways") },
+	{ 0x13935,	I18N_NOOP("D02. Head, front") },
+	{ 0x13937,	I18N_NOOP("D03. Head and arms") },
+	{ 0x1396A,	I18N_NOOP("D04. Hairs") },
+	{ 0x13973,	I18N_NOOP("D05. Eye") },
+	{ 0x13976,	I18N_NOOP("D06. Eye made up") },
+	{ 0x13986,	I18N_NOOP("D07. Eye crying") },
+	{ 0x1398C,	I18N_NOOP("D08. Udjat eye") },
+	{ 0x1398F,	I18N_NOOP("D09. Udjat eye components") },
+	{ 0x13990,	I18N_NOOP("D10. Ear") },
+	{ 0x13991,	I18N_NOOP("D11. Face sideways") },
+	{ 0x13994,	I18N_NOOP("D12. Mouth") },
+	{ 0x13997,	I18N_NOOP("D13. Lips") },
+	{ 0x13999,	I18N_NOOP("D14. Mouth spitting") },
+	{ 0x1399E,	I18N_NOOP("D15. Beard") },
+	{ 0x1399F,	I18N_NOOP("D17. Lower part of kneeling or sitting man") },
+	{ 0x139A0,	I18N_NOOP("D18. Arms (straight)") },
+	{ 0x139A6,	I18N_NOOP("D19. Arms (bent)") },
+	{ 0x139B0,	I18N_NOOP("D20. Arm or arms holding an oar") },
+	{ 0x139B7,	I18N_NOOP("D21. Arm holding shield and weapons") },
+	{ 0x139C2,	I18N_NOOP("D22. Arm flat") },
+	{ 0x139C3,	I18N_NOOP("D23. Forearm (empty handed, palm up)") },
+	{ 0x139C5,	I18N_NOOP("D24. Forearm (holding loaf of bread or round vase with rim)") },
+	{ 0x139C7,	I18N_NOOP("D25. Forearm (holding stick, varia)") },
+	{ 0x139DB,	I18N_NOOP("D26. Arm bent") },
+	{ 0x139F0,	I18N_NOOP("D27. Arms bent, holding an object") },
+	{ 0x139F7,	I18N_NOOP("D28. Hand") },
+	{ 0x13A00,	I18N_NOOP("D29. Fist") },
+	{ 0x13A05,	I18N_NOOP("D30. Finger") },
+	{ 0x13A07,	I18N_NOOP("D31. Male genitals") },
+	{ 0x13A0D,	I18N_NOOP("D32. Female genitals") },
+	{ 0x13A12,	I18N_NOOP("D34. Legs") },
+	{ 0x13A19,	I18N_NOOP("D35. Leg") },
+	{ 0x13A21,	I18N_NOOP("D36. Toes") },
+	{ 0x13A30,	I18N_NOOP("D37. Sole") },
+	{ 0x13A32,	I18N_NOOP("D39. Human parts, varia") },
+	{ 0x13A36,	I18N_NOOP("E01. Donkey") },
+	{ 0x13A4C,	I18N_NOOP("E02. Sethian animal") },
+	{ 0x13A5A,	I18N_NOOP("E03. Antelope") },
+	{ 0x13A67,	I18N_NOOP("E04. Ram and ewe") },
+	{ 0x13A75,	I18N_NOOP("E05. Bubale") },
+	{ 0x13A7C,	I18N_NOOP("E06. Dog, jackal standing") },
+	{ 0x13A86,	I18N_NOOP("E07. Dog, jackal sitting") },
+	{ 0x13A99,	I18N_NOOP("E08. Cat") },
+	{ 0x13AA5,	I18N_NOOP("E09. Horse") },
+	{ 0x13AAA,	I18N_NOOP("E10. Goat and kid") },
+	{ 0x13AAE,	I18N_NOOP("E13. Griffin") },
+	{ 0x13AB0,	I18N_NOOP("E14. Hippopotamus") },
+	{ 0x13ABB,	I18N_NOOP("E15. Hyena") },
+	{ 0x13ABD,	I18N_NOOP("E16. Hare") },
+	{ 0x13AC1,	I18N_NOOP("E17. Lion") },
+	{ 0x13AE5,	I18N_NOOP("E18. Panther") },
+	{ 0x13AE7,	I18N_NOOP("E19. Pig") },
+	{ 0x13AE8,	I18N_NOOP("E20. Monkey") },
+	{ 0x13B14,	I18N_NOOP("E21. Mouse") },
+	{ 0x13B15,	I18N_NOOP("E22. Sphinx") },
+	{ 0x13B29,	I18N_NOOP("E23. Bovid") },
+	{ 0x13B57,	I18N_NOOP("E25. Calf") },
+	{ 0x13B59,	I18N_NOOP("E26. Mammals, varia") },
+	{ 0x13B5C,	I18N_NOOP("F01. Donkey head") },
+	{ 0x13B60,	I18N_NOOP("F02. Ram head") },
+	{ 0x13B6A,	I18N_NOOP("F03. Bovidae heads") },
+	{ 0x13B76,	I18N_NOOP("F04. Dog head") },
+	{ 0x13B81,	I18N_NOOP("F05. Animal heads on stick or leg") },
+	{ 0x13B87,	I18N_NOOP("F06. Cervidae heads") },
+	{ 0x13B8F,	I18N_NOOP("F07. Hippopotamus head") },
+	{ 0x13B90,	I18N_NOOP("F08. Lion head and protome") },
+	{ 0x13B97,	I18N_NOOP("F09. Donkey and horse protomes") },
+	{ 0x13BA1,	I18N_NOOP("F10. Animal head, varia") },
+	{ 0x13BA4,	I18N_NOOP("F11. Bovidae horns") },
+	{ 0x13BAA,	I18N_NOOP("F12. Ram horns") },
+	{ 0x13BAC,	I18N_NOOP("F14. Elephant tusk") },
+	{ 0x13BB2,	I18N_NOOP("F15. Jaws") },
+	{ 0x13BB3,	I18N_NOOP("F16. Tongue") },
+	{ 0x13BB6,	I18N_NOOP("F17. Ear") },
+	{ 0x13BB7,	I18N_NOOP("F18. Hindquarter") },
+	{ 0x13BB8,	I18N_NOOP("F19. Leg") },
+	{ 0x13BC5,	I18N_NOOP("F20. Skin") },
+	{ 0x13BD4,	I18N_NOOP("F21. Teat") },
+	{ 0x13BD6,	I18N_NOOP("F22. Tail") },
+	{ 0x13BD7,	I18N_NOOP("F23. Heart") },
+	{ 0x13BDD,	I18N_NOOP("F24. Heart and lungs") },
+	{ 0x13BE3,	I18N_NOOP("F25. Spine") },
+	{ 0x13BF0,	I18N_NOOP("F26. Vertebrae and ribs") },
+	{ 0x13BF7,	I18N_NOOP("F27. Haunch") },
+	{ 0x13BFD,	I18N_NOOP("F28. Intestines") },
+	{ 0x13C01,	I18N_NOOP("F30. Excrements, pustule") },
+	{ 0x13C03,	I18N_NOOP("F31. Placenta") },
+	{ 0x13C05,	I18N_NOOP("F32. Mammal parts, varia") },
+	{ 0x13C0B,	I18N_NOOP("G01. Ostrich") },
+	{ 0x13C0D,	I18N_NOOP("G02. Buzzard") },
+	{ 0x13C0E,	I18N_NOOP("G04. Duck") },
+	{ 0x13C15,	I18N_NOOP("G05. Duck, flying") },
+	{ 0x13C21,	I18N_NOOP("G06. Duck tied to a pole") },
+	{ 0x13C25,	I18N_NOOP("G08. Goose") },
+	{ 0x13C2C,	I18N_NOOP("G09. Owl") },
+	{ 0x13C31,	I18N_NOOP("G10. Cormorant") },
+	{ 0x13C32,	I18N_NOOP("G11. Wader: ibis, flamingo, stork, heron, egret") },
+	{ 0x13C6B,	I18N_NOOP("G12. Falcon") },
+	{ 0x13CAD,	I18N_NOOP("G13. Falcon opening his wings") },
+	{ 0x13CBF,	I18N_NOOP("G14. Falcon legs bent") },
+	{ 0x13CC3,	I18N_NOOP("G15. Falcon mummified or emblem of falcon") },
+	{ 0x13CCF,	I18N_NOOP("G16. Swallow, sparrow") },
+	{ 0x13CD2,	I18N_NOOP("G17. Hoopoe") },
+	{ 0x13CD5,	I18N_NOOP("G18. Bird, human-headed") },
+	{ 0x13CDE,	I18N_NOOP("G19. Bird, dog- or ram-headed") },
+	{ 0x13CE0,	I18N_NOOP("G20. Chick or sitting duck") },
+	{ 0x13CF0,	I18N_NOOP("G21. Pelican") },
+	{ 0x13CF1,	I18N_NOOP("G22. Guinea fowl") },
+	{ 0x13CF7,	I18N_NOOP("G23. Peewit, lapwing") },
+	{ 0x13CFC,	I18N_NOOP("G24. Vulture") },
+	{ 0x13D09,	I18N_NOOP("G25. Vulture, with open wings") },
+	{ 0x13D0D,	I18N_NOOP("G26. Vulture (Neophron percnopterus)") },
+	{ 0x13D0F,	I18N_NOOP("G27. Bird, varia") },
+	{ 0x13D10,	I18N_NOOP("H01. Falcon head") },
+	{ 0x13D17,	I18N_NOOP("H02. Falcon eye") },
+	{ 0x13D19,	I18N_NOOP("H03. Duck/goose head") },
+	{ 0x13D1D,	I18N_NOOP("H04. Crested bird head") },
+	{ 0x13D1F,	I18N_NOOP("H06. Vulture head") },
+	{ 0x13D20,	I18N_NOOP("H07. Wing") },
+	{ 0x13D22,	I18N_NOOP("H08. Feather") },
+	{ 0x13D26,	I18N_NOOP("H09. Leg") },
+	{ 0x13D29,	I18N_NOOP("H10. Egg") },
+	{ 0x13D2B,	I18N_NOOP("H11. Bird part, varia") },
+	{ 0x13D2F,	I18N_NOOP("I01. Lizard") },
+	{ 0x13D31,	I18N_NOOP("I02. Turtle") },
+	{ 0x13D32,	I18N_NOOP("I03. Crocodile") },
+	{ 0x13D4A,	I18N_NOOP("I04. Crocodile parts") },
+	{ 0x13D51,	I18N_NOOP("I05. Frog, tadpole") },
+	{ 0x13D54,	I18N_NOOP("I06. Viper") },
+	{ 0x13D5C,	I18N_NOOP("I07. Horned viper") },
+	{ 0x13D65,	I18N_NOOP("I08. Snake wrt hk.w") },
+	{ 0x13D66,	I18N_NOOP("I09. Cobra type 1 (I10)") },
+	{ 0x13D73,	I18N_NOOP("I10. Cobra type 2 (I40)") },
+	{ 0x13D79,	I18N_NOOP("I11. Cobra type 3 (I64)") },
+	{ 0x13DAB,	I18N_NOOP("I12. Cobra type 4 (I80)") },
+	{ 0x13DB1,	I18N_NOOP("I13. Cobra type 5 (I14/I15)") },
+	{ 0x13DC9,	I18N_NOOP("I14. Snake head") },
+	{ 0x13DCA,	I18N_NOOP("I15. Snake, varia") },
+	{ 0x13DCC,	I18N_NOOP("K01. Fishes") },
+	{ 0x13DDB,	I18N_NOOP("K02. Fish parts") },
+	{ 0x13DE1,	I18N_NOOP("L01. Scarab") },
+	{ 0x13DEE,	I18N_NOOP("L02. Bee, fly and wasp") },
+	{ 0x13DF0,	I18N_NOOP("L03. Grasshopper, locust") },
+	{ 0x13DF1,	I18N_NOOP("L04. Praying mantis") },
+	{ 0x13DF2,	I18N_NOOP("L06. Scorpion and water bug") },
+	{ 0x13DF7,	I18N_NOOP("L07. Insects, varia") },
+	{ 0x13DFA,	I18N_NOOP("M01. Tree") },
+	{ 0x13E08,	I18N_NOOP("M02. Palm tree") },
+	{ 0x13E0B,	I18N_NOOP("M03. Clump type 1") },
+	{ 0x13E0F,	I18N_NOOP("M04. Branch") },
+	{ 0x13E18,	I18N_NOOP("M05. Stripped palm branch") },
+	{ 0x13E29,	I18N_NOOP("M06. Lotus on a pond") },
+	{ 0x13E38,	I18N_NOOP("M07. Lotus bud") },
+	{ 0x13E3C,	I18N_NOOP("M08. Lotus flower") },
+	{ 0x13E4F,	I18N_NOOP("M09. Composite flower bunch") },
+	{ 0x13E59,	I18N_NOOP("M10. Lotus with bent stem") },
+	{ 0x13E5C,	I18N_NOOP("M11. Lotus leaf") },
+	{ 0x13E66,	I18N_NOOP("M12. Papyrus stem") },
+	{ 0x13E73,	I18N_NOOP("M13. Clump of papyrus and lily") },
+	{ 0x13E84,	I18N_NOOP("M14. Reed leaf") },
+	{ 0x13E8A,	I18N_NOOP("M15. Clump of reeds") },
+	{ 0x13E8C,	I18N_NOOP("M16. Rush with shoots") },
+	{ 0x13E9E,	I18N_NOOP("M17. Carob pod") },
+	{ 0x13E9F,	I18N_NOOP("M18. Root") },
+	{ 0x13EA3,	I18N_NOOP("M19. Rhizome") },
+	{ 0x13EA5,	I18N_NOOP("M20. Grains") },
+	{ 0x13EA6,	I18N_NOOP("M21. Ear") },
+	{ 0x13EA8,	I18N_NOOP("M22. Sheaf (flax bundle)") },
+	{ 0x13EB1,	I18N_NOOP("M23. Basket of fruits or grains") },
+	{ 0x13EB3,	I18N_NOOP("M24. Reed bundle") },
+	{ 0x13EB7,	I18N_NOOP("M26. Vine arbor (grape vines on props)") },
+	{ 0x13EB9,	I18N_NOOP("M28. Vegetal elements, varia") },
+	{ 0x13EC2,	I18N_NOOP("N01. Sky") },
+	{ 0x13ED2,	I18N_NOOP("N02. Sun") },
+	{ 0x13ED3,	I18N_NOOP("N03. Sun with uraeus") },
+	{ 0x13EDB,	I18N_NOOP("N04. Sun, radiant, with rays") },
+	{ 0x13EE7,	I18N_NOOP("N05. Sun with wings") },
+	{ 0x13EF3,	I18N_NOOP("N06. Moon") },
+	{ 0x13EF6,	I18N_NOOP("N08. Star") },
+	{ 0x13EF7,	I18N_NOOP("N09. Flat land") },
+	{ 0x13F01,	I18N_NOOP("N10. Tongue of land") },
+	{ 0x13F02,	I18N_NOOP("N11. Canal, irrigated land") },
+	{ 0x13F14,	I18N_NOOP("N13. Mountain range (desert)") },
+	{ 0x13F1F,	I18N_NOOP("N14. Sand") },
+	{ 0x13F20,	I18N_NOOP("N15. Sunrise over mountain (horizon)") },
+	{ 0x13F24,	I18N_NOOP("N16. Rising sun") },
+	{ 0x13F25,	I18N_NOOP("N17. Sand slope, hill with shrubs (mound)") },
+	{ 0x13F29,	I18N_NOOP("N18. Road bordered with shrubs (road)") },
+	{ 0x13F30,	I18N_NOOP("N19. Water") },
+	{ 0x13F34,	I18N_NOOP("N20. Canal and pool") },
+	{ 0x13F44,	I18N_NOOP("N21. Well") },
+	{ 0x13F46,	I18N_NOOP("N22. Sky, ground, earth, varia") },
+	{ 0x13F4C,	I18N_NOOP("O01. House") },
+	{ 0x13F53,	I18N_NOOP("O02. Reed shelter, winding wall (enclosure)") },
+	{ 0x13F55,	I18N_NOOP("O03. Plan of rectangular enclosure") },
+	{ 0x13F62,	I18N_NOOP("O04. Palace with battlements") },
+	{ 0x13F6A,	I18N_NOOP("O05. Enclosure with battlements") },
+	{ 0x13F7B,	I18N_NOOP("O06. Palace or tomb façade") },
+	{ 0x13F88,	I18N_NOOP("O07. Shrine façade") },
+	{ 0x13F92,	I18N_NOOP("O08. Door and gateway with snake") },
+	{ 0x13F9B,	I18N_NOOP("O09. Shrine") },
+	{ 0x13FB7,	I18N_NOOP("O10. Open shelter") },
+	{ 0x13FC0,	I18N_NOOP("O11. Double platform (sed-festival)") },
+	{ 0x13FD8,	I18N_NOOP("O12. Pyramid") },
+	{ 0x13FDA,	I18N_NOOP("O13. Obelisk") },
+	{ 0x13FDD,	I18N_NOOP("O14. Stela") },
+	{ 0x13FDF,	I18N_NOOP("O16. Column (support)") },
+	{ 0x13FEE,	I18N_NOOP("O18. Door bolt") },
+	{ 0x13FF3,	I18N_NOOP("O19. Building angle") },
+	{ 0x13FF4,	I18N_NOOP("O20. Stairway") },
+	{ 0x13FF5,	I18N_NOOP("O21. Fence") },
+	{ 0x13FFF,	I18N_NOOP("O22. Grain mound on mud floor") },
+	{ 0x14006,	I18N_NOOP("O23. Frieze elements") },
+	{ 0x14008,	I18N_NOOP("O24. Architecture elements") },
+	{ 0x1401A,	I18N_NOOP("P01. Boat") },
+	{ 0x1403D,	I18N_NOOP("P02. Sailboat") },
+	{ 0x14043,	I18N_NOOP("P03. Sacred boat") },
+	{ 0x14076,	I18N_NOOP("P04. Boat with net") },
+	{ 0x1407A,	I18N_NOOP("P05. Boat, varia") },
+	{ 0x1407B,	I18N_NOOP("P06. Sail") },
+	{ 0x1408B,	I18N_NOOP("P07. Mast") },
+	{ 0x14091,	I18N_NOOP("P08. Oar") },
+	{ 0x14092,	I18N_NOOP("P09. Steering oar") },
+	{ 0x14094,	I18N_NOOP("P10. Mooring post") },
+	{ 0x14095,	I18N_NOOP("P11. Steering gear") },
+	{ 0x14098,	I18N_NOOP("P13. Boat parts, varia") },
+	{ 0x14099,	I18N_NOOP("Q01. Seat") },
+	{ 0x140A6,	I18N_NOOP("Q02. Headrest") },
+	{ 0x140A8,	I18N_NOOP("Q03. Bed") },
+	{ 0x140B0,	I18N_NOOP("Q04. Mirror and base") },
+	{ 0x140B2,	I18N_NOOP("Q05. Chest and coffin") },
+	{ 0x140C6,	I18N_NOOP("Q06. Brazier") },
+	{ 0x140CB,	I18N_NOOP("Q07. Furniture, varia") },
+	{ 0x140CF,	I18N_NOOP("R01. Table for offerings") },
+	{ 0x140D4,	I18N_NOOP("R02. Low table (dresser)") },
+	{ 0x140E7,	I18N_NOOP("R03. Altar") },
+	{ 0x140F2,	I18N_NOOP("R04. Bread loaf on a mat") },
+	{ 0x140F3,	I18N_NOOP("R05. Censer") },
+	{ 0x140F9,	I18N_NOOP("R06. Incense bowl") },
+	{ 0x140FC,	I18N_NOOP("R07. Flag") },
+	{ 0x14112,	I18N_NOOP("R08. Reed column") },
+	{ 0x14115,	I18N_NOOP("R09. Standard") },
+	{ 0x1411F,	I18N_NOOP("R11. West or right side emblem") },
+	{ 0x14128,	I18N_NOOP("R12. East or left side emblem") },
+	{ 0x14133,	I18N_NOOP("R13. Emblem type R80") },
+	{ 0x14134,	I18N_NOOP("R14. Emblem of eighth nome of Upper Egypt") },
+	{ 0x1413E,	I18N_NOOP("R15. Nefertoum emblem") },
+	{ 0x14141,	I18N_NOOP("R16. Seth emblem") },
+	{ 0x14144,	I18N_NOOP("R17. Seshat emblem") },
+	{ 0x14145,	I18N_NOOP("R18. Min emblem") },
+	{ 0x14148,	I18N_NOOP("R20. Sign mks") },
+	{ 0x14149,	I18N_NOOP("R22. Shedet emblem") },
+	{ 0x1414A,	I18N_NOOP("R23. Temple furniture, varia") },
+	{ 0x1414D,	I18N_NOOP("S01. White crown of Upper Egypt") },
+	{ 0x14157,	I18N_NOOP("S02. Red crown of Lower Egypt") },
+	{ 0x1415B,	I18N_NOOP("S03. Union of red crown of Lower Egypt and white crown of Upper Egypt") },
+	{ 0x1415C,	I18N_NOOP("S04. Blue crown") },
+	{ 0x1415D,	I18N_NOOP("S05. Head cloth") },
+	{ 0x14164,	I18N_NOOP("S06. Band of head cloth with loop and ties at the back") },
+	{ 0x14166,	I18N_NOOP("S07. Atef crown") },
+	{ 0x1416B,	I18N_NOOP("S08. Hemhem crown") },
+	{ 0x1416E,	I18N_NOOP("S09. Double plumes headdress") },
+	{ 0x14182,	I18N_NOOP("S10. Headband") },
+	{ 0x14187,	I18N_NOOP("S11. Collar") },
+	{ 0x141A8,	I18N_NOOP("S12. Seal") },
+	{ 0x141AA,	I18N_NOOP("S13. Knots, bracelets, garment with knots") },
+	{ 0x141AF,	I18N_NOOP("S14. Loincloth, apron") },
+	{ 0x141B1,	I18N_NOOP("S15. Cloth") },
+	{ 0x141C5,	I18N_NOOP("S17. Sandal strap, ankh") },
+	{ 0x141CA,	I18N_NOOP("S20. Sunshade type 2 (S36)") },
+	{ 0x141CF,	I18N_NOOP("S21. Sunshade type 3 (S37D)") },
+	{ 0x141D3,	I18N_NOOP("S22. Sceptre type 1 (crook)") },
+	{ 0x141D4,	I18N_NOOP("S23. Sceptre type 2 (Seth animal)") },
+	{ 0x141D8,	I18N_NOOP("S24. Sceptre type 3 (S42)") },
+	{ 0x141DB,	I18N_NOOP("S25. Sticks, other sceptres") },
+	{ 0x141E3,	I18N_NOOP("S26. Flabellum") },
+	{ 0x141E5,	I18N_NOOP("S27. Seth tool") },
+	{ 0x141E9,	I18N_NOOP("S28. Collar counterweight, bag of clothes") },
+	{ 0x141F1,	I18N_NOOP("S29. S category, varia") },
+	{ 0x141F7,	I18N_NOOP("T01. Mace") },
+	{ 0x14201,	I18N_NOOP("T02. Shield") },
+	{ 0x14204,	I18N_NOOP("T03. Axe") },
+	{ 0x14206,	I18N_NOOP("T04. Axe head") },
+	{ 0x14207,	I18N_NOOP("T05. Dagger") },
+	{ 0x14208,	I18N_NOOP("T06. Bow") },
+	{ 0x1420C,	I18N_NOOP("T07. Arrow, quiver, cover of a quiver") },
+	{ 0x14224,	I18N_NOOP("T08. Bowstring") },
+	{ 0x14229,	I18N_NOOP("T09. Throwing stick") },
+	{ 0x1422F,	I18N_NOOP("T10. Scimitar") },
+	{ 0x14235,	I18N_NOOP("T12. Crook with package") },
+	{ 0x14238,	I18N_NOOP("T13. Harpoon") },
+	{ 0x14258,	I18N_NOOP("T14. Fishing net (sideways)") },
+	{ 0x14261,	I18N_NOOP("T15. Reed float") },
+	{ 0x14266,	I18N_NOOP("T16. Trap") },
+	{ 0x14274,	I18N_NOOP("T18. Knife") },
+	{ 0x14287,	I18N_NOOP("T19. Sharpener, butcher's knife") },
+	{ 0x14289,	I18N_NOOP("T20. Knife pesesh-kaf") },
+	{ 0x1428A,	I18N_NOOP("T21. T category, varia") },
+	{ 0x1428F,	I18N_NOOP("U01. Sickle") },
+	{ 0x14290,	I18N_NOOP("U02. Hoe") },
+	{ 0x14295,	I18N_NOOP("U03. Grain measure") },
+	{ 0x1429C,	I18N_NOOP("U05. Plow") },
+	{ 0x142A3,	I18N_NOOP("U06. Sled (protome)") },
+	{ 0x142A9,	I18N_NOOP("U07. Planted Pick") },
+	{ 0x142AB,	I18N_NOOP("U08. Adze") },
+	{ 0x142B1,	I18N_NOOP("U09. Chisel and Drill") },
+	{ 0x142D8,	I18N_NOOP("U11. Kiln and ingot") },
+	{ 0x142DA,	I18N_NOOP("U12. Pestle") },
+	{ 0x142DE,	I18N_NOOP("U13. Spindle (stopper)") },
+	{ 0x142DF,	I18N_NOOP("U15. Razor") },
+	{ 0x142E2,	I18N_NOOP("U16. Scale, measuring instrument") },
+	{ 0x142FB,	I18N_NOOP("U17. Potter's wheel") },
+	{ 0x14301,	I18N_NOOP("U18. Press (wine, oil), warp extended between poles") },
+	{ 0x14313,	I18N_NOOP("U19. Riddle (coarse sieve)") },
+	{ 0x14316,	I18N_NOOP("U21. Mill tool") },
+	{ 0x14319,	I18N_NOOP("U22. U category, varia") },
+	{ 0x1431E,	I18N_NOOP("V01. Rope and rope coils") },
+	{ 0x14324,	I18N_NOOP("V02. Round cartouche, knot") },
+	{ 0x14325,	I18N_NOOP("V03. Cartouche") },
+	{ 0x14326,	I18N_NOOP("V04. String, tethering rope, hobble") },
+	{ 0x14333,	I18N_NOOP("V05. Whip") },
+	{ 0x14335,	I18N_NOOP("V06. Cord on stick") },
+	{ 0x14336,	I18N_NOOP("V07. Spool with thread") },
+	{ 0x14337,	I18N_NOOP("V08. Wick and swab") },
+	{ 0x14343,	I18N_NOOP("V09. Basket") },
+	{ 0x14346,	I18N_NOOP("V10. Woven basket") },
+	{ 0x14347,	I18N_NOOP("V11. Wicker satchel") },
+	{ 0x1434A,	I18N_NOOP("V14. Receptacle, bunch") },
+	{ 0x14352,	I18N_NOOP("V15. Bandage, receptacle") },
+	{ 0x14356,	I18N_NOOP("V16. Bushel") },
+	{ 0x14357,	I18N_NOOP("V17. Net") },
+	{ 0x14359,	I18N_NOOP("W01. Oil vessel") },
+	{ 0x14363,	I18N_NOOP("W02. Alabaster basin") },
+	{ 0x14367,	I18N_NOOP("W03. Stone jug (hnm)") },
+	{ 0x1436C,	I18N_NOOP("W04. Cup") },
+	{ 0x1436D,	I18N_NOOP("W05. Stand") },
+	{ 0x1436E,	I18N_NOOP("W06. Tall jar") },
+	{ 0x1437F,	I18N_NOOP("W07. Milk jug") },
+	{ 0x14383,	I18N_NOOP("W08. Situla") },
+	{ 0x14386,	I18N_NOOP("W09. Jug pouring liquid") },
+	{ 0x14389,	I18N_NOOP("W10. Wine jars (twin jars)") },
+	{ 0x1438E,	I18N_NOOP("W11. Receptacles, varia") },
+	{ 0x143BC,	I18N_NOOP("X02. Tall bread loaf") },
+	{ 0x143C0,	I18N_NOOP("X03. Bread type 1 (X3)") },
+	{ 0x143C3,	I18N_NOOP("X04. Bread roll type 2") },
+	{ 0x143C9,	I18N_NOOP("X05. Bread roll type 3 (X5)") },
+	{ 0x143CA,	I18N_NOOP("X06. Bread type 4 (X6)") },
+	{ 0x143CD,	I18N_NOOP("X08. Other breads") },
+	{ 0x143CF,	I18N_NOOP("Y01. Papyrus scroll") },
+	{ 0x143D1,	I18N_NOOP("Y02. Scribal kit, graver") },
+	{ 0x143D8,	I18N_NOOP("Y03. Game board and piece (senet)") },
+	{ 0x143D9,	I18N_NOOP("Y04. Harp") },
+	{ 0x143DE,	I18N_NOOP("Y05. Tambourine and ball") },
+	{ 0x143E1,	I18N_NOOP("Y06. Sistrum") },
+	{ 0x143E7,	I18N_NOOP("Z01. Strokes") },
+	{ 0x143E9,	I18N_NOOP("Z02. Cross") },
+	{ 0x143EB,	I18N_NOOP("Z03. Squares and rectangles") },
+	{ 0x143EC,	I18N_NOOP("Z04. Triangles, lozenges") },
+	{ 0x143EE,	I18N_NOOP("Z06. Geometric shapes, varia") },
+	{ 0x143F3,	I18N_NOOP("Z07. Hieratic signs") },
+	{ 0x143F7,	I18N_NOOP("AA08. Sign type 8") },
+	{ 0x143F8,	I18N_NOOP("AA22. Unclassified signs, varia") },
+};
+
+static const TDEUnicodeData::Subcategory AnatolianHieroglyphs[] = {
+	{ 0x14400,	I18N_NOOP("A. The human body and clothing") },
+	{ 0x1446A,	I18N_NOOP("B. Animals") },
+	{ 0x144B0,	I18N_NOOP("C. Plants") },
+	{ 0x144D1,	I18N_NOOP("D. Nature") },
+	{ 0x14502,	I18N_NOOP("E. Buildings") },
+	{ 0x14530,	I18N_NOOP("F. Arms, tools, furniture, and other instruments") },
+	{ 0x14577,	I18N_NOOP("G. Vases and receptacles") },
+	{ 0x14596,	I18N_NOOP("H. Symbols") },
+	{ 0x145AD,	I18N_NOOP("J. Lines, numbers, and geometric shapes") },
+	{ 0x145E6,	I18N_NOOP("K. Varia") },
+	{ 0x14629,	I18N_NOOP("M. Additional signs") },
+};
+
+static const TDEUnicodeData::Subcategory GurungKhema[] = {
+	{ 0x16100,	I18N_NOOP("Vowel carrier") },
+	{ 0x16101,	I18N_NOOP("Consonants") },
+	{ 0x1611E,	I18N_NOOP("Vowel signs") },
+	{ 0x16129,	I18N_NOOP("Vowel length mark") },
+	{ 0x1612A,	I18N_NOOP("Medial consonant signs") },
+	{ 0x1612D,	I18N_NOOP("Various signs") },
+	{ 0x16130,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory BamumSupplement[] = {
+	{ 0x16800,	I18N_NOOP("Characters found through Phase A") },
+	{ 0x16857,	I18N_NOOP("Characters found through Phase B") },
+	{ 0x1688F,	I18N_NOOP("Characters found through Phase C") },
+	{ 0x168F1,	I18N_NOOP("Characters found through Phase D") },
+	{ 0x16966,	I18N_NOOP("Characters found through Phase E") },
+	{ 0x16A03,	I18N_NOOP("Characters found through Phase F") },
+};
+
+static const TDEUnicodeData::Subcategory Mro[] = {
+	{ 0x16A40,	I18N_NOOP("Letters") },
+	{ 0x16A60,	I18N_NOOP("Digits") },
+	{ 0x16A6E,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory Tangsa[] = {
+	{ 0x16A70,	I18N_NOOP("Vowels") },
+	{ 0x16AA0,	I18N_NOOP("Consonants") },
+	{ 0x16AC0,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory BassaVah[] = {
+	{ 0x16AD0,	I18N_NOOP("Consonant letters") },
+	{ 0x16AE7,	I18N_NOOP("Vowel letters") },
+	{ 0x16AF0,	I18N_NOOP("Combining tone marks") },
+	{ 0x16AF5,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory PahawhHmong[] = {
+	{ 0x16B00,	I18N_NOOP("Vowel rimes") },
+	{ 0x16B1C,	I18N_NOOP("Consonant onsets") },
+	{ 0x16B30,	I18N_NOOP("Combining diacritical marks") },
+	{ 0x16B37,	I18N_NOOP("Punctuation") },
+	{ 0x16B3C,	I18N_NOOP("Mathematical operators") },
+	{ 0x16B40,	I18N_NOOP("Modifier letters") },
+	{ 0x16B44,	I18N_NOOP("Punctuation") },
+	{ 0x16B50,	I18N_NOOP("Digits") },
+	{ 0x16B5B,	I18N_NOOP("Numbers") },
+	{ 0x16B63,	I18N_NOOP("Logographs") },
+	{ 0x16B7D,	I18N_NOOP("Logographs for clan names") },
+};
+
+static const TDEUnicodeData::Subcategory KiratRai[] = {
+	{ 0x16D40,	I18N_NOOP("Various signs") },
+	{ 0x16D43,	I18N_NOOP("Independent vowel") },
+	{ 0x16D44,	I18N_NOOP("Consonants") },
+	{ 0x16D63,	I18N_NOOP("Vowel signs") },
+	{ 0x16D6B,	I18N_NOOP("Various signs") },
+	{ 0x16D6E,	I18N_NOOP("Punctuation") },
+	{ 0x16D70,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory Medefaidrin[] = {
+	{ 0x16E40,	I18N_NOOP("Uppercase letters") },
+	{ 0x16E60,	I18N_NOOP("Lowercase letters") },
+	{ 0x16E80,	I18N_NOOP("Digits") },
+	{ 0x16E8A,	I18N_NOOP("Numbers") },
+	{ 0x16E94,	I18N_NOOP("Alternate digits") },
+	{ 0x16E97,	I18N_NOOP("Punctuation") },
+	{ 0x16E99,	I18N_NOOP("Symbols") },
+};
+
+static const TDEUnicodeData::Subcategory BeriaErfe[] = {
+	{ 0x16EA0,	I18N_NOOP("Uppercase letters") },
+	{ 0x16EBB,	I18N_NOOP("Lowercase letters") },
+};
+
+static const TDEUnicodeData::Subcategory Miao[] = {
+	{ 0x16F00,	I18N_NOOP("Consonant onsets") },
+	{ 0x16F4F,	I18N_NOOP("Modifiers") },
+	{ 0x16F54,	I18N_NOOP("Vowels and finals") },
+	{ 0x16F8F,	I18N_NOOP("Positioning tone marks") },
+	{ 0x16F93,	I18N_NOOP("Baseline tone marks") },
+	{ 0x16F9A,	I18N_NOOP("Archaic baseline tone marks") },
+};
+
+static const TDEUnicodeData::Subcategory IdeographicSymbolsandPunctuation[] = {
+	{ 0x16FE0,	I18N_NOOP("Tangut mark") },
+	{ 0x16FE1,	I18N_NOOP("Nushu mark") },
+	{ 0x16FE2,	I18N_NOOP("Marks used in ancient Chinese texts") },
+	{ 0x16FE4,	I18N_NOOP("Small Khitan format character") },
+	{ 0x16FF0,	I18N_NOOP("Combining diacritics for CJK ideographs") },
+	{ 0x16FF2,	I18N_NOOP("Characters used for rhotacization") },
+	{ 0x16FF4,	I18N_NOOP("Characters used for Cantonese music") },
+};
+
+static const TDEUnicodeData::Subcategory Tangut[] = {
+};
+
+static const TDEUnicodeData::Subcategory TangutComponents[] = {
+	{ 0x18800,	I18N_NOOP("One-stroke components") },
+	{ 0x1880A,	I18N_NOOP("Two-stroke components") },
+	{ 0x18826,	I18N_NOOP("Three-stroke components") },
+	{ 0x18860,	I18N_NOOP("Four-stroke components") },
+	{ 0x188CC,	I18N_NOOP("Five-stroke components") },
+	{ 0x18959,	I18N_NOOP("Six-stroke components") },
+	{ 0x189DB,	I18N_NOOP("Seven-stroke components") },
+	{ 0x18A41,	I18N_NOOP("Eight-stroke components") },
+	{ 0x18A99,	I18N_NOOP("Nine-stroke components") },
+	{ 0x18AA4,	I18N_NOOP("Ten-stroke component") },
+	{ 0x18AA5,	I18N_NOOP("Nine-stroke components") },
+	{ 0x18AC1,	I18N_NOOP("Ten-stroke components") },
+	{ 0x18AD5,	I18N_NOOP("Eleven-stroke components") },
+	{ 0x18AE3,	I18N_NOOP("Twelve-stroke components") },
+	{ 0x18AEC,	I18N_NOOP("Thirteen-stroke components") },
+	{ 0x18AF2,	I18N_NOOP("Sixteen-stroke component") },
+	{ 0x18AF3,	I18N_NOOP("Additional components") },
+};
+
+static const TDEUnicodeData::Subcategory KhitanSmallScript[] = {
+	{ 0x18B00,	I18N_NOOP("Iteration mark") },
+	{ 0x18B01,	I18N_NOOP("Radical-01") },
+	{ 0x18B36,	I18N_NOOP("Radical-02") },
+	{ 0x18B6A,	I18N_NOOP("Radical-03") },
+	{ 0x18B94,	I18N_NOOP("Radical-04") },
+	{ 0x18BAD,	I18N_NOOP("Radical-05") },
+	{ 0x18BD2,	I18N_NOOP("Radical-06") },
+	{ 0x18C01,	I18N_NOOP("Radical-07") },
+	{ 0x18C13,	I18N_NOOP("Radical-08") },
+	{ 0x18C28,	I18N_NOOP("Radical-09") },
+	{ 0x18C2F,	I18N_NOOP("Radical-10") },
+	{ 0x18C37,	I18N_NOOP("Radical-11") },
+	{ 0x18C4C,	I18N_NOOP("Radical-12") },
+	{ 0x18C52,	I18N_NOOP("Radical-13") },
+	{ 0x18C64,	I18N_NOOP("Radical-14") },
+	{ 0x18C7F,	I18N_NOOP("Radical-15") },
+	{ 0x18C8C,	I18N_NOOP("Radical-16") },
+	{ 0x18C95,	I18N_NOOP("Radical-17") },
+	{ 0x18CC0,	I18N_NOOP("Radical-18") },
+	{ 0x18CCC,	I18N_NOOP("Radical-19") },
+	{ 0x18CD3,	I18N_NOOP("Radical-20") },
+	{ 0x18CFF,	I18N_NOOP("Indication of missing character") },
+};
+
+static const TDEUnicodeData::Subcategory TangutSupplement[] = {
+};
+
+static const TDEUnicodeData::Subcategory TangutComponentsSupplement[] = {
+	{ 0x18D80,	I18N_NOOP("Miscellaneous components") },
+	{ 0x18D82,	I18N_NOOP("One-stroke components") },
+	{ 0x18D84,	I18N_NOOP("Two-stroke component") },
+	{ 0x18D85,	I18N_NOOP("Three-stroke component") },
+	{ 0x18D86,	I18N_NOOP("Four-stroke components") },
+	{ 0x18D89,	I18N_NOOP("Five-stroke components") },
+	{ 0x18D91,	I18N_NOOP("Six-stroke components") },
+	{ 0x18D9D,	I18N_NOOP("Seven-stroke components") },
+	{ 0x18DAE,	I18N_NOOP("Eight-stroke components") },
+	{ 0x18DC4,	I18N_NOOP("Nine-stroke components") },
+	{ 0x18DD9,	I18N_NOOP("Ten-stroke components") },
+	{ 0x18DE7,	I18N_NOOP("Eleven-stroke components") },
+	{ 0x18DEB,	I18N_NOOP("Twelve-stroke components") },
+	{ 0x18DEF,	I18N_NOOP("Thirteen-stroke components") },
+	{ 0x18DF2,	I18N_NOOP("Fourteen-stroke component") },
+};
+
+static const TDEUnicodeData::Subcategory KanaExtendedB[] = {
+	{ 0x1AFF0,	I18N_NOOP("Tone marks") },
+	{ 0x1AFF7,	I18N_NOOP("Nasalized tone marks") },
+};
+
+static const TDEUnicodeData::Subcategory KanaSupplement[] = {
+	{ 0x1B000,	I18N_NOOP("Historic Katakana") },
+	{ 0x1B001,	I18N_NOOP("Historic Hiragana and Hentaigana") },
+	{ 0x1B002,	I18N_NOOP("Hentaigana") },
+};
+
+static const TDEUnicodeData::Subcategory KanaExtendedA[] = {
+	{ 0x1B100,	I18N_NOOP("Hentaigana") },
+	{ 0x1B11F,	I18N_NOOP("Historic Hiragana") },
+	{ 0x1B120,	I18N_NOOP("Historic Katakana") },
+};
+
+static const TDEUnicodeData::Subcategory SmallKanaExtension[] = {
+	{ 0x1B132,	I18N_NOOP("Historic small hiragana letters") },
+	{ 0x1B155,	I18N_NOOP("Historic small katakana letters") },
+};
+
+static const TDEUnicodeData::Subcategory Nushu[] = {
+	{ 0x1B170,	I18N_NOOP("One-stroke character") },
+	{ 0x1B171,	I18N_NOOP("Two-stroke characters") },
+	{ 0x1B178,	I18N_NOOP("Three-stroke characters") },
+	{ 0x1B18B,	I18N_NOOP("Four-stroke characters") },
+	{ 0x1B1A8,	I18N_NOOP("Five-stroke characters") },
+	{ 0x1B1DE,	I18N_NOOP("Six-stroke characters") },
+	{ 0x1B216,	I18N_NOOP("Seven-stroke characters") },
+	{ 0x1B244,	I18N_NOOP("Eight-stroke characters") },
+	{ 0x1B284,	I18N_NOOP("Nine-stroke characters") },
+	{ 0x1B2B0,	I18N_NOOP("Ten-stroke characters") },
+	{ 0x1B2CE,	I18N_NOOP("Eleven-stroke characters") },
+	{ 0x1B2E1,	I18N_NOOP("Twelve-stroke characters") },
+	{ 0x1B2EE,	I18N_NOOP("Thirteen-stroke characters") },
+	{ 0x1B2F4,	I18N_NOOP("Fourteen-stroke characters") },
+	{ 0x1B2F7,	I18N_NOOP("Fifteen-stroke characters") },
+	{ 0x1B2FA,	I18N_NOOP("Sixteen-stroke characters") },
+};
+
+static const TDEUnicodeData::Subcategory Duployan[] = {
+	{ 0x1BC00,	I18N_NOOP("Non-joining consonants") },
+	{ 0x1BC02,	I18N_NOOP("Line consonants") },
+	{ 0x1BC19,	I18N_NOOP("Arc consonants") },
+	{ 0x1BC32,	I18N_NOOP("Quarter-arc consonants written downwards") },
+	{ 0x1BC3B,	I18N_NOOP("Quarter-arc consonants written upwards") },
+	{ 0x1BC41,	I18N_NOOP("Circle vowels") },
+	{ 0x1BC46,	I18N_NOOP("Semi-circle vowels") },
+	{ 0x1BC4F,	I18N_NOOP("Diagonal-line vowels") },
+	{ 0x1BC51,	I18N_NOOP("Quarter-circle vowels") },
+	{ 0x1BC55,	I18N_NOOP("Other vowels") },
+	{ 0x1BC5A,	I18N_NOOP("Dotted-circle vowels") },
+	{ 0x1BC5C,	I18N_NOOP("Compound vowels") },
+	{ 0x1BC61,	I18N_NOOP("Basic nasal vowels") },
+	{ 0x1BC65,	I18N_NOOP("Additional nasal vowels") },
+	{ 0x1BC70,	I18N_NOOP("Attached affixes") },
+	{ 0x1BC80,	I18N_NOOP("High affixes") },
+	{ 0x1BC90,	I18N_NOOP("Low affixes") },
+	{ 0x1BC9C,	I18N_NOOP("Miscellaneous sign") },
+	{ 0x1BC9D,	I18N_NOOP("Sloan R-form selector") },
+	{ 0x1BC9E,	I18N_NOOP("Shorthand double mark") },
+	{ 0x1BC9F,	I18N_NOOP("Chinook punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory ShorthandFormatControls[] = {
+	{ 0x1BCA0,	I18N_NOOP("Shorthand format controls") },
+};
+
+static const TDEUnicodeData::Subcategory SymbolsforLegacyComputingSupplement[] = {
+	{ 0x1CC00,	I18N_NOOP("Game sprites") },
+	{ 0x1CC05,	I18N_NOOP("Rule segments") },
+	{ 0x1CC08,	I18N_NOOP("Schematic symbols") },
+	{ 0x1CC1B,	I18N_NOOP("Box drawing characters") },
+	{ 0x1CC21,	I18N_NOOP("Separated mosaic terminal graphic characters") },
+	{ 0x1CC30,	I18N_NOOP("Circle segments") },
+	{ 0x1CC40,	I18N_NOOP("Fill characters") },
+	{ 0x1CC48,	I18N_NOOP("Game sprites") },
+	{ 0x1CC6F,	I18N_NOOP("Emoticon") },
+	{ 0x1CC70,	I18N_NOOP("Game sprites") },
+	{ 0x1CC86,	I18N_NOOP("Terminal graphic characters") },
+	{ 0x1CC90,	I18N_NOOP("Lines with tick marks") },
+	{ 0x1CC92,	I18N_NOOP("Game sprites") },
+	{ 0x1CCA6,	I18N_NOOP("Faces") },
+	{ 0x1CCB2,	I18N_NOOP("Icons") },
+	{ 0x1CCBA,	I18N_NOOP("Chess symbols") },
+	{ 0x1CCD2,	I18N_NOOP("Icons") },
+	{ 0x1CCD6,	I18N_NOOP("Outlined uppercase Latin alphabet") },
+	{ 0x1CCF0,	I18N_NOOP("Outlined digits") },
+	{ 0x1CCFA,	I18N_NOOP("Terminal graphic characters") },
+	{ 0x1CD00,	I18N_NOOP("Block mosaic terminal graphic characters") },
+	{ 0x1CDE6,	I18N_NOOP("Game sprites") },
+	{ 0x1CE00,	I18N_NOOP("Terminal graphic characters") },
+	{ 0x1CE0D,	I18N_NOOP("Dashed lines") },
+	{ 0x1CE0F,	I18N_NOOP("Lines with tick marks") },
+	{ 0x1CE16,	I18N_NOOP("Box drawing characters") },
+	{ 0x1CE1A,	I18N_NOOP("Large type pieces") },
+	{ 0x1CE51,	I18N_NOOP("Separated mosaic terminal graphic characters") },
+	{ 0x1CE90,	I18N_NOOP("Block elements") },
+	{ 0x1CEB0,	I18N_NOOP("Smalltalk symbols") },
+	{ 0x1CEBA,	I18N_NOOP("Terminal graphic characters") },
+};
+
+static const TDEUnicodeData::Subcategory MiscellaneousSymbolsSupplement[] = {
+	{ 0x1CEC0,	I18N_NOOP("Astronomical symbols for asteroids") },
+	{ 0x1CEE0,	I18N_NOOP("Symbols for geomantic figures") },
+	{ 0x1CEF0,	I18N_NOOP("Miscellaneous symbol") },
+};
+
+static const TDEUnicodeData::Subcategory ZnamennyMusicalNotation[] = {
+	{ 0x1CF00,	I18N_NOOP("Combining red marks") },
+	{ 0x1CF30,	I18N_NOOP("Combining black marks") },
+	{ 0x1CF42,	I18N_NOOP("Modifying marks for priznaki") },
+	{ 0x1CF50,	I18N_NOOP("Znamenny neumes") },
+};
+
+static const TDEUnicodeData::Subcategory ByzantineMusicalSymbols[] = {
+	{ 0x1D000,	I18N_NOOP("Prosodies (Prosodics)") },
+	{ 0x1D003,	I18N_NOOP("Ekfonetika") },
+	{ 0x1D015,	I18N_NOOP("Melodimata (Melodics)") },
+	{ 0x1D046,	I18N_NOOP("Fonitika (Vocals)") },
+	{ 0x1D057,	I18N_NOOP("Afona or Ypostaseis (Mutes or Hypostases)") },
+	{ 0x1D07F,	I18N_NOOP("Argies (Retards)") },
+	{ 0x1D08A,	I18N_NOOP("Leimmata or Siopes (Leimmas or Silencers)") },
+	{ 0x1D08F,	I18N_NOOP("Synagmata or Gorgotites (Synagmas or Quickeners)") },
+	{ 0x1D09A,	I18N_NOOP("Agogika (Conduits)") },
+	{ 0x1D0A2,	I18N_NOOP("Ichimata and Martyrika (Ichimas and Evidentials)") },
+	{ 0x1D0B6,	I18N_NOOP("Fthores (Destroyers)") },
+	{ 0x1D0CB,	I18N_NOOP("Alloioseis (Differentiators)") },
+	{ 0x1D0DA,	I18N_NOOP("Rythmika (Rhythmics)") },
+	{ 0x1D0E6,	I18N_NOOP("Grammata (Letters)") },
+	{ 0x1D0F0,	I18N_NOOP("Specials") },
+};
+
+static const TDEUnicodeData::Subcategory MusicalSymbols[] = {
+	{ 0x1D100,	I18N_NOOP("Bars") },
+	{ 0x1D106,	I18N_NOOP("Codas") },
+	{ 0x1D10D,	I18N_NOOP("Figure repetitions") },
+	{ 0x1D110,	I18N_NOOP("Holds and pauses") },
+	{ 0x1D114,	I18N_NOOP("Staff brackets") },
+	{ 0x1D116,	I18N_NOOP("Staves") },
+	{ 0x1D11C,	I18N_NOOP("Tablature") },
+	{ 0x1D11E,	I18N_NOOP("Clefs") },
+	{ 0x1D129,	I18N_NOOP("Rest") },
+	{ 0x1D12A,	I18N_NOOP("Pitch modifiers") },
+	{ 0x1D134,	I18N_NOOP("Time signatures") },
+	{ 0x1D136,	I18N_NOOP("Octaves") },
+	{ 0x1D13A,	I18N_NOOP("Rests") },
+	{ 0x1D143,	I18N_NOOP("Noteheads") },
+	{ 0x1D15C,	I18N_NOOP("Notes") },
+	{ 0x1D165,	I18N_NOOP("Stems") },
+	{ 0x1D167,	I18N_NOOP("Tremolos") },
+	{ 0x1D16D,	I18N_NOOP("Augmentation dot") },
+	{ 0x1D16E,	I18N_NOOP("Flags") },
+	{ 0x1D173,	I18N_NOOP("Beams and slurs") },
+	{ 0x1D17B,	I18N_NOOP("Articulation") },
+	{ 0x1D18F,	I18N_NOOP("Dynamics") },
+	{ 0x1D194,	I18N_NOOP("Ornaments") },
+	{ 0x1D1A6,	I18N_NOOP("Analytics") },
+	{ 0x1D1AA,	I18N_NOOP("Instrumentation") },
+	{ 0x1D1AE,	I18N_NOOP("Pedals") },
+	{ 0x1D1B1,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x1D1B6,	I18N_NOOP("Mensural notes") },
+	{ 0x1D1C1,	I18N_NOOP("Mensural rests") },
+	{ 0x1D1C7,	I18N_NOOP("Mensural prolations") },
+	{ 0x1D1CF,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x1D1D0,	I18N_NOOP("Clefs") },
+	{ 0x1D1D2,	I18N_NOOP("Accidental") },
+	{ 0x1D1D3,	I18N_NOOP("Notes") },
+	{ 0x1D1DE,	I18N_NOOP("Clef") },
+	{ 0x1D1DF,	I18N_NOOP("Ornamentation") },
+	{ 0x1D1E0,	I18N_NOOP("Notes") },
+	{ 0x1D1E8,	I18N_NOOP("Accidental") },
+	{ 0x1D1E9,	I18N_NOOP("Accidentals for quarter tones") },
+};
+
+static const TDEUnicodeData::Subcategory AncientGreekMusicalNotation[] = {
+	{ 0x1D200,	I18N_NOOP("Ancient Greek vocalic notation") },
+	{ 0x1D21D,	I18N_NOOP("Ancient Greek instrumental notation") },
+	{ 0x1D242,	I18N_NOOP("Further Greek musical notation symbols") },
+};
+
+static const TDEUnicodeData::Subcategory KaktovikNumerals[] = {
+	{ 0x1D2C0,	I18N_NOOP("Numerals") },
+};
+
+static const TDEUnicodeData::Subcategory MayanNumerals[] = {
+	{ 0x1D2E0,	I18N_NOOP("Mayan numerals") },
+};
+
+static const TDEUnicodeData::Subcategory TaiXuanJingSymbols[] = {
+	{ 0x1D300,	I18N_NOOP("Monogram") },
+	{ 0x1D301,	I18N_NOOP("Digrams") },
+	{ 0x1D306,	I18N_NOOP("Tetragrams") },
+};
+
+static const TDEUnicodeData::Subcategory CountingRodNumerals[] = {
+	{ 0x1D360,	I18N_NOOP("Counting rod units") },
+	{ 0x1D372,	I18N_NOOP("Ideographic tally marks") },
+	{ 0x1D377,	I18N_NOOP("Western tally marks") },
+};
+
+static const TDEUnicodeData::Subcategory MathematicalAlphanumericSymbols[] = {
+	{ 0x1D400,	I18N_NOOP("Bold symbols") },
+	{ 0x1D434,	I18N_NOOP("Italic symbols") },
+	{ 0x1D468,	I18N_NOOP("Bold italic symbols") },
+	{ 0x1D49C,	I18N_NOOP("Script symbols") },
+	{ 0x1D4D0,	I18N_NOOP("Bold script symbols") },
+	{ 0x1D504,	I18N_NOOP("Fraktur symbols") },
+	{ 0x1D538,	I18N_NOOP("Double-struck symbols") },
+	{ 0x1D56C,	I18N_NOOP("Bold Fraktur symbols") },
+	{ 0x1D5A0,	I18N_NOOP("Sans-serif symbols") },
+	{ 0x1D5D4,	I18N_NOOP("Sans-serif bold symbols") },
+	{ 0x1D608,	I18N_NOOP("Sans-serif italic symbols") },
+	{ 0x1D63C,	I18N_NOOP("Sans-serif bold italic symbols") },
+	{ 0x1D670,	I18N_NOOP("Monospace symbols") },
+	{ 0x1D6A4,	I18N_NOOP("Dotless symbols") },
+	{ 0x1D6A8,	I18N_NOOP("Bold Greek symbols") },
+	{ 0x1D6DB,	I18N_NOOP("Additional bold Greek symbols") },
+	{ 0x1D6E2,	I18N_NOOP("Italic Greek symbols") },
+	{ 0x1D715,	I18N_NOOP("Additional italic Greek symbols") },
+	{ 0x1D71C,	I18N_NOOP("Bold italic Greek symbols") },
+	{ 0x1D74F,	I18N_NOOP("Additional bold italic Greek symbols") },
+	{ 0x1D756,	I18N_NOOP("Sans-serif bold Greek symbols") },
+	{ 0x1D789,	I18N_NOOP("Additional sans-serif bold Greek symbols") },
+	{ 0x1D790,	I18N_NOOP("Sans-serif bold italic Greek symbols") },
+	{ 0x1D7C3,	I18N_NOOP("Additional sans-serif bold italic Greek symbols") },
+	{ 0x1D7CA,	I18N_NOOP("Additional bold Greek symbols") },
+	{ 0x1D7CE,	I18N_NOOP("Bold digits") },
+	{ 0x1D7D8,	I18N_NOOP("Double-struck digits") },
+	{ 0x1D7E2,	I18N_NOOP("Sans-serif digits") },
+	{ 0x1D7EC,	I18N_NOOP("Sans-serif bold digits") },
+	{ 0x1D7F6,	I18N_NOOP("Monospace digits") },
+};
+
+static const TDEUnicodeData::Subcategory SuttonSignWriting[] = {
+	{ 0x1D800,	I18N_NOOP("Hand shapes with index finger") },
+	{ 0x1D80E,	I18N_NOOP("Hand shapes with index and middle fingers") },
+	{ 0x1D81E,	I18N_NOOP("Hand shapes with index and middle fingers and thumb") },
+	{ 0x1D844,	I18N_NOOP("Hand shapes with four fingers") },
+	{ 0x1D84C,	I18N_NOOP("Hand shapes with five fingers") },
+	{ 0x1D886,	I18N_NOOP("Hand shapes with little finger") },
+	{ 0x1D8A4,	I18N_NOOP("Hand shapes with ring finger") },
+	{ 0x1D8BA,	I18N_NOOP("Hand shapes with middle finger") },
+	{ 0x1D8CD,	I18N_NOOP("Hand shapes with index finger and thumb") },
+	{ 0x1D8F5,	I18N_NOOP("Hand shapes with thumb") },
+	{ 0x1D905,	I18N_NOOP("Contact movement indicators") },
+	{ 0x1D916,	I18N_NOOP("Finger movement indicators") },
+	{ 0x1D92A,	I18N_NOOP("Movement indicators") },
+	{ 0x1D9F5,	I18N_NOOP("Dynamics indicators") },
+	{ 0x1D9FF,	I18N_NOOP("Head shapes") },
+	{ 0x1DA6D,	I18N_NOOP("Body shapes") },
+	{ 0x1DA7F,	I18N_NOOP("Location bases") },
+	{ 0x1DA87,	I18N_NOOP("Punctuation") },
+	{ 0x1DA9B,	I18N_NOOP("Fill modifiers") },
+	{ 0x1DAA1,	I18N_NOOP("Rotation modifiers") },
+};
+
+static const TDEUnicodeData::Subcategory LatinExtendedG[] = {
+	{ 0x1DF00,	I18N_NOOP("Extended IPA for disordered speech") },
+	{ 0x1DF08,	I18N_NOOP("IPA extensions") },
+	{ 0x1DF0B,	I18N_NOOP("Clicks") },
+	{ 0x1DF11,	I18N_NOOP("Lateral") },
+	{ 0x1DF12,	I18N_NOOP("Letters with palatal hooks") },
+	{ 0x1DF19,	I18N_NOOP("Letters with retroflex hooks") },
+	{ 0x1DF1E,	I18N_NOOP("IPA extension") },
+	{ 0x1DF25,	I18N_NOOP("Letters for Malayalam transliteration") },
+};
+
+static const TDEUnicodeData::Subcategory GlagoliticSupplement[] = {
+	{ 0x1E000,	I18N_NOOP("Combining letters") },
+};
+
+static const TDEUnicodeData::Subcategory CyrillicExtendedD[] = {
+	{ 0x1E030,	I18N_NOOP("Superscript modifier letters") },
+	{ 0x1E051,	I18N_NOOP("Subscript modifier letters") },
+	{ 0x1E06B,	I18N_NOOP("Superscript modifier letters") },
+	{ 0x1E08F,	I18N_NOOP("Diacritical mark") },
+};
+
+static const TDEUnicodeData::Subcategory NyiakengPuachueHmong[] = {
+	{ 0x1E100,	I18N_NOOP("Consonant onsets") },
+	{ 0x1E124,	I18N_NOOP("Vowel rimes") },
+	{ 0x1E130,	I18N_NOOP("Tone marks") },
+	{ 0x1E137,	I18N_NOOP("Determinatives") },
+	{ 0x1E13C,	I18N_NOOP("Repetition mark") },
+	{ 0x1E13D,	I18N_NOOP("Syllable lengthener") },
+	{ 0x1E140,	I18N_NOOP("Digits") },
+	{ 0x1E14E,	I18N_NOOP("Symbols") },
+};
+
+static const TDEUnicodeData::Subcategory Toto[] = {
+	{ 0x1E290,	I18N_NOOP("Basic consonants") },
+	{ 0x1E2A1,	I18N_NOOP("Basic vowels") },
+	{ 0x1E2AE,	I18N_NOOP("Sign") },
+};
+
+static const TDEUnicodeData::Subcategory Wancho[] = {
+	{ 0x1E2C0,	I18N_NOOP("Letters") },
+	{ 0x1E2EC,	I18N_NOOP("Tone marks") },
+	{ 0x1E2F0,	I18N_NOOP("Digits") },
+	{ 0x1E2FF,	I18N_NOOP("Currency symbol") },
+};
+
+static const TDEUnicodeData::Subcategory NagMundari[] = {
+	{ 0x1E4D0,	I18N_NOOP("Letters") },
+	{ 0x1E4EB,	I18N_NOOP("Various signs") },
+	{ 0x1E4F0,	I18N_NOOP("Digits") },
+};
+
+static const TDEUnicodeData::Subcategory OlOnal[] = {
+	{ 0x1E5D0,	I18N_NOOP("Letters") },
+	{ 0x1E5EE,	I18N_NOOP("Various signs") },
+	{ 0x1E5F1,	I18N_NOOP("Digits") },
+	{ 0x1E5FF,	I18N_NOOP("Abbreviation sign") },
+};
+
+static const TDEUnicodeData::Subcategory TaiYo[] = {
+	{ 0x1E6C0,	I18N_NOOP("Letters") },
+	{ 0x1E6E0,	I18N_NOOP("Vowel letters and rhyme signs") },
+	{ 0x1E6EE,	I18N_NOOP("Finals") },
+	{ 0x1E6FE,	I18N_NOOP("Symbols") },
+};
+
+static const TDEUnicodeData::Subcategory EthiopicExtendedB[] = {
+	{ 0x1E7E0,	I18N_NOOP("Syllables for Gurage") },
+};
+
+static const TDEUnicodeData::Subcategory MendeKikakui[] = {
+	{ 0x1E800,	I18N_NOOP("Syllables in k-") },
+	{ 0x1E808,	I18N_NOOP("Syllables in w-") },
+	{ 0x1E811,	I18N_NOOP("Syllables in wv-") },
+	{ 0x1E814,	I18N_NOOP("Syllables in m-") },
+	{ 0x1E81B,	I18N_NOOP("Syllables in b-") },
+	{ 0x1E822,	I18N_NOOP("Vowels") },
+	{ 0x1E82E,	I18N_NOOP("Syllables in s-") },
+	{ 0x1E836,	I18N_NOOP("Syllables in l-") },
+	{ 0x1E83E,	I18N_NOOP("Syllables in d-") },
+	{ 0x1E844,	I18N_NOOP("Syllables in t-") },
+	{ 0x1E84B,	I18N_NOOP("Syllables in j-") },
+	{ 0x1E853,	I18N_NOOP("Syllables in y-") },
+	{ 0x1E85A,	I18N_NOOP("Syllables in f-") },
+	{ 0x1E863,	I18N_NOOP("Syllables in n-") },
+	{ 0x1E868,	I18N_NOOP("Syllables in h-") },
+	{ 0x1E877,	I18N_NOOP("Syllables in ngg-") },
+	{ 0x1E883,	I18N_NOOP("Syllables in g-") },
+	{ 0x1E889,	I18N_NOOP("Syllables in ng-") },
+	{ 0x1E88C,	I18N_NOOP("Syllables in p-") },
+	{ 0x1E893,	I18N_NOOP("Syllables in mb-") },
+	{ 0x1E89F,	I18N_NOOP("Syllables in kp-") },
+	{ 0x1E8A6,	I18N_NOOP("Syllables in gb-") },
+	{ 0x1E8AD,	I18N_NOOP("Syllable in r-") },
+	{ 0x1E8AE,	I18N_NOOP("Syllables in nd-") },
+	{ 0x1E8B5,	I18N_NOOP("Syllables in nj-") },
+	{ 0x1E8B9,	I18N_NOOP("Syllables in v-") },
+	{ 0x1E8C0,	I18N_NOOP("Syllables in ny-") },
+	{ 0x1E8C7,	I18N_NOOP("Digits") },
+	{ 0x1E8D0,	I18N_NOOP("Combining number bases") },
+};
+
+static const TDEUnicodeData::Subcategory Adlam[] = {
+	{ 0x1E900,	I18N_NOOP("Capital letters") },
+	{ 0x1E91C,	I18N_NOOP("Supplementary capital letters") },
+	{ 0x1E922,	I18N_NOOP("Small letters") },
+	{ 0x1E93E,	I18N_NOOP("Supplementary small letters") },
+	{ 0x1E944,	I18N_NOOP("Diacritical marks") },
+	{ 0x1E94B,	I18N_NOOP("Modifier letter") },
+	{ 0x1E950,	I18N_NOOP("Digits") },
+	{ 0x1E95E,	I18N_NOOP("Punctuation") },
+};
+
+static const TDEUnicodeData::Subcategory IndicSiyaqNumbers[] = {
+	{ 0x1EC71,	I18N_NOOP("Primary numbers") },
+	{ 0x1EC7A,	I18N_NOOP("Tens") },
+	{ 0x1EC83,	I18N_NOOP("Hundreds") },
+	{ 0x1EC8C,	I18N_NOOP("Thousands") },
+	{ 0x1EC95,	I18N_NOOP("Ten thousands") },
+	{ 0x1EC9E,	I18N_NOOP("Lakhs") },
+	{ 0x1ECA1,	I18N_NOOP("Crores") },
+	{ 0x1ECA3,	I18N_NOOP("Prefixed forms of primary numbers") },
+	{ 0x1ECAC,	I18N_NOOP("Placeholder") },
+	{ 0x1ECAD,	I18N_NOOP("Fractions") },
+	{ 0x1ECB0,	I18N_NOOP("Currency symbol") },
+	{ 0x1ECB1,	I18N_NOOP("Alternate forms") },
+};
+
+static const TDEUnicodeData::Subcategory OttomanSiyaqNumbers[] = {
+	{ 0x1ED01,	I18N_NOOP("Primary numbers") },
+	{ 0x1ED0A,	I18N_NOOP("Tens") },
+	{ 0x1ED13,	I18N_NOOP("Hundreds") },
+	{ 0x1ED1C,	I18N_NOOP("Thousands") },
+	{ 0x1ED25,	I18N_NOOP("Ten thousands") },
+	{ 0x1ED2E,	I18N_NOOP("Multiplier") },
+	{ 0x1ED2F,	I18N_NOOP("Alternate forms") },
+	{ 0x1ED3C,	I18N_NOOP("Fractions") },
+};
+
+static const TDEUnicodeData::Subcategory ArabicMathematicalAlphabeticSymbols[] = {
+	{ 0x1EE00,	I18N_NOOP("Isolated symbols") },
+	{ 0x1EE21,	I18N_NOOP("Initial symbols") },
+	{ 0x1EE42,	I18N_NOOP("Tailed symbols") },
+	{ 0x1EE61,	I18N_NOOP("Stretched symbols") },
+	{ 0x1EE80,	I18N_NOOP("Looped symbols") },
+	{ 0x1EEA1,	I18N_NOOP("Double-struck symbols") },
+	{ 0x1EEF0,	I18N_NOOP("Stretching operators") },
+};
+
+static const TDEUnicodeData::Subcategory MahjongTiles[] = {
+	{ 0x1F000,	I18N_NOOP("Prevailing wind tiles") },
+	{ 0x1F004,	I18N_NOOP("Dragon tiles") },
+	{ 0x1F007,	I18N_NOOP("Character suit tiles") },
+	{ 0x1F010,	I18N_NOOP("Bamboo suit tiles") },
+	{ 0x1F019,	I18N_NOOP("Circle suit tiles") },
+	{ 0x1F022,	I18N_NOOP("Flower tiles") },
+	{ 0x1F026,	I18N_NOOP("Season tiles") },
+	{ 0x1F02A,	I18N_NOOP("Miscellaneous tiles") },
+};
+
+static const TDEUnicodeData::Subcategory DominoTiles[] = {
+	{ 0x1F030,	I18N_NOOP("Horizontal tiles") },
+	{ 0x1F031,	I18N_NOOP("Zeroes") },
+	{ 0x1F038,	I18N_NOOP("Ones") },
+	{ 0x1F03F,	I18N_NOOP("Twos") },
+	{ 0x1F046,	I18N_NOOP("Threes") },
+	{ 0x1F04D,	I18N_NOOP("Fours") },
+	{ 0x1F054,	I18N_NOOP("Fives") },
+	{ 0x1F05B,	I18N_NOOP("Sixes") },
+	{ 0x1F062,	I18N_NOOP("Vertical tiles") },
+	{ 0x1F063,	I18N_NOOP("Zeroes") },
+	{ 0x1F06A,	I18N_NOOP("Ones") },
+	{ 0x1F071,	I18N_NOOP("Twos") },
+	{ 0x1F078,	I18N_NOOP("Threes") },
+	{ 0x1F07F,	I18N_NOOP("Fours") },
+	{ 0x1F086,	I18N_NOOP("Fives") },
+	{ 0x1F08D,	I18N_NOOP("Sixes") },
+};
+
+static const TDEUnicodeData::Subcategory PlayingCards[] = {
+	{ 0x1F0A0,	I18N_NOOP("Back of card") },
+	{ 0x1F0A1,	I18N_NOOP("Spades or swords") },
+	{ 0x1F0B1,	I18N_NOOP("Hearts or cups") },
+	{ 0x1F0BF,	I18N_NOOP("Joker") },
+	{ 0x1F0C1,	I18N_NOOP("Diamonds or pentacles") },
+	{ 0x1F0CF,	I18N_NOOP("Joker") },
+	{ 0x1F0D1,	I18N_NOOP("Clubs or wands") },
+	{ 0x1F0DF,	I18N_NOOP("Joker") },
+	{ 0x1F0E0,	I18N_NOOP("Trumps") },
+};
+
+static const TDEUnicodeData::Subcategory EnclosedAlphanumericSupplement[] = {
+	{ 0x1F100,	I18N_NOOP("Number with full stop") },
+	{ 0x1F101,	I18N_NOOP("Numbers with comma") },
+	{ 0x1F10B,	I18N_NOOP("Circled sans-serif digits") },
+	{ 0x1F10D,	I18N_NOOP("Creative Commons symbols") },
+	{ 0x1F110,	I18N_NOOP("Parenthesized Latin letters") },
+	{ 0x1F12A,	I18N_NOOP("Latin letter with tortoise shell brackets") },
+	{ 0x1F12B,	I18N_NOOP("Circled italic Latin letters") },
+	{ 0x1F12D,	I18N_NOOP("Circled Latin letters or letter sequences") },
+	{ 0x1F130,	I18N_NOOP("Squared Latin letters") },
+	{ 0x1F150,	I18N_NOOP("White on black circled Latin letters") },
+	{ 0x1F16A,	I18N_NOOP("Raised squared Latin sequences") },
+	{ 0x1F16D,	I18N_NOOP("Creative Commons symbols") },
+	{ 0x1F170,	I18N_NOOP("White on black squared Latin letters") },
+	{ 0x1F190,	I18N_NOOP("Squared Latin letter sequences") },
+	{ 0x1F19B,	I18N_NOOP("Squared Latin letter sequences from ARIB STD B62") },
+	{ 0x1F1AD,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x1F1E6,	I18N_NOOP("Regional indicator symbols") },
+};
+
+static const TDEUnicodeData::Subcategory EnclosedIdeographicSupplement[] = {
+	{ 0x1F200,	I18N_NOOP("Squared hiragana from ARIB STD B24") },
+	{ 0x1F201,	I18N_NOOP("Squared katakana") },
+	{ 0x1F210,	I18N_NOOP("Squared ideographs and kana from ARIB STD B24") },
+	{ 0x1F232,	I18N_NOOP("Squared ideographs") },
+	{ 0x1F240,	I18N_NOOP("Ideographs with tortoise shell brackets from ARIB STD B24") },
+	{ 0x1F250,	I18N_NOOP("Circled ideographs") },
+	{ 0x1F260,	I18N_NOOP("Symbols for Chinese folk religion") },
+};
+
+static const TDEUnicodeData::Subcategory MiscellaneousSymbolsandPictographs[] = {
+	{ 0x1F300,	I18N_NOOP("Weather, landscape, and sky symbols") },
+	{ 0x1F30D,	I18N_NOOP("Globe symbols") },
+	{ 0x1F311,	I18N_NOOP("Moon, sun, and star symbols") },
+	{ 0x1F321,	I18N_NOOP("Weather symbols") },
+	{ 0x1F32D,	I18N_NOOP("Food symbols") },
+	{ 0x1F330,	I18N_NOOP("Plant symbols") },
+	{ 0x1F345,	I18N_NOOP("Fruit and vegetable symbols") },
+	{ 0x1F354,	I18N_NOOP("Food symbols") },
+	{ 0x1F375,	I18N_NOOP("Beverage symbols") },
+	{ 0x1F37D,	I18N_NOOP("Accommodation symbol") },
+	{ 0x1F37E,	I18N_NOOP("Beverage and food symbols") },
+	{ 0x1F380,	I18N_NOOP("Celebration symbols") },
+	{ 0x1F398,	I18N_NOOP("Musical symbols") },
+	{ 0x1F39E,	I18N_NOOP("Entertainment symbols") },
+	{ 0x1F3AE,	I18N_NOOP("Game symbols") },
+	{ 0x1F3B5,	I18N_NOOP("Musical symbols") },
+	{ 0x1F3BD,	I18N_NOOP("Sport symbols") },
+	{ 0x1F3D4,	I18N_NOOP("Building and map symbols") },
+	{ 0x1F3F1,	I18N_NOOP("Flag symbols") },
+	{ 0x1F3F5,	I18N_NOOP("Rosettes") },
+	{ 0x1F3F7,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x1F3F8,	I18N_NOOP("Sport symbols") },
+	{ 0x1F3FA,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x1F3FB,	I18N_NOOP("Emoji modifiers") },
+	{ 0x1F400,	I18N_NOOP("Animal symbols") },
+	{ 0x1F42D,	I18N_NOOP("Animal faces") },
+	{ 0x1F43E,	I18N_NOOP("Animal symbols") },
+	{ 0x1F440,	I18N_NOOP("Facial parts symbols") },
+	{ 0x1F446,	I18N_NOOP("Hand symbols") },
+	{ 0x1F451,	I18N_NOOP("Clothing and accessories") },
+	{ 0x1F464,	I18N_NOOP("Portrait and role symbols") },
+	{ 0x1F478,	I18N_NOOP("Fairy tale symbols") },
+	{ 0x1F481,	I18N_NOOP("Role symbols") },
+	{ 0x1F484,	I18N_NOOP("Personal care symbols") },
+	{ 0x1F489,	I18N_NOOP("Medical symbols") },
+	{ 0x1F48B,	I18N_NOOP("Romance symbols") },
+	{ 0x1F493,	I18N_NOOP("Heart symbols") },
+	{ 0x1F4A0,	I18N_NOOP("Comic style symbols") },
+	{ 0x1F4AE,	I18N_NOOP("Japanese school grade symbols") },
+	{ 0x1F4B0,	I18N_NOOP("Money symbols") },
+	{ 0x1F4BA,	I18N_NOOP("Office symbols") },
+	{ 0x1F4DD,	I18N_NOOP("Communication symbols") },
+	{ 0x1F4F7,	I18N_NOOP("Audio and video symbols") },
+	{ 0x1F4FF,	I18N_NOOP("Religious symbol") },
+	{ 0x1F500,	I18N_NOOP("User interface symbols") },
+	{ 0x1F519,	I18N_NOOP("Words with arrows") },
+	{ 0x1F51E,	I18N_NOOP("Enclosed alphanumeric symbols") },
+	{ 0x1F520,	I18N_NOOP("User interface input status symbols") },
+	{ 0x1F525,	I18N_NOOP("Tool symbols") },
+	{ 0x1F52F,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x1F532,	I18N_NOOP("Geometric shapes") },
+	{ 0x1F53A,	I18N_NOOP("User interface symbols") },
+	{ 0x1F53E,	I18N_NOOP("Shadowed geometric shapes") },
+	{ 0x1F540,	I18N_NOOP("Religious symbols") },
+	{ 0x1F54F,	I18N_NOOP("Miscellaneous symbol") },
+	{ 0x1F550,	I18N_NOOP("Clock face symbols") },
+	{ 0x1F568,	I18N_NOOP("Communication symbols") },
+	{ 0x1F56D,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x1F577,	I18N_NOOP("Animal symbols") },
+	{ 0x1F579,	I18N_NOOP("Game symbol") },
+	{ 0x1F57A,	I18N_NOOP("Role symbol") },
+	{ 0x1F57B,	I18N_NOOP("Communication symbols") },
+	{ 0x1F58E,	I18N_NOOP("Hand symbols") },
+	{ 0x1F5A4,	I18N_NOOP("Heart symbol") },
+	{ 0x1F5A5,	I18N_NOOP("Computer symbols") },
+	{ 0x1F5B9,	I18N_NOOP("Office symbols") },
+	{ 0x1F5BF,	I18N_NOOP("User interface symbols") },
+	{ 0x1F5DE,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x1F5E1,	I18N_NOOP("Rating symbols") },
+	{ 0x1F5E4,	I18N_NOOP("Sound symbols") },
+	{ 0x1F5E8,	I18N_NOOP("Bubble symbols") },
+	{ 0x1F5F3,	I18N_NOOP("Ballot symbols") },
+	{ 0x1F5FA,	I18N_NOOP("Map symbol") },
+	{ 0x1F5FB,	I18N_NOOP("Cultural symbols") },
+};
+
+static const TDEUnicodeData::Subcategory Emoticons[] = {
+	{ 0x1F600,	I18N_NOOP("Faces") },
+	{ 0x1F638,	I18N_NOOP("Cat faces") },
+	{ 0x1F641,	I18N_NOOP("Faces") },
+	{ 0x1F645,	I18N_NOOP("Gesture symbols") },
+};
+
+static const TDEUnicodeData::Subcategory OrnamentalDingbats[] = {
+	{ 0x1F650,	I18N_NOOP("Fleurons") },
+	{ 0x1F668,	I18N_NOOP("Quilt square ornaments") },
+	{ 0x1F66C,	I18N_NOOP("Rocket ornaments") },
+	{ 0x1F670,	I18N_NOOP("Ampersand and ligature et ornaments") },
+	{ 0x1F676,	I18N_NOOP("Punctuation mark ornaments") },
+	{ 0x1F67E,	I18N_NOOP("Miscellaneous symbols") },
+};
+
+static const TDEUnicodeData::Subcategory TransportandMapSymbols[] = {
+	{ 0x1F680,	I18N_NOOP("Vehicles") },
+	{ 0x1F6A5,	I18N_NOOP("Traffic signs") },
+	{ 0x1F6A9,	I18N_NOOP("Signage and other symbols") },
+	{ 0x1F6CB,	I18N_NOOP("Accommodation symbols") },
+	{ 0x1F6D0,	I18N_NOOP("Signage and other symbols") },
+	{ 0x1F6D3,	I18N_NOOP("Map symbols") },
+	{ 0x1F6DC,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x1F6E5,	I18N_NOOP("Vehicles") },
+};
+
+static const TDEUnicodeData::Subcategory AlchemicalSymbols[] = {
+	{ 0x1F700,	I18N_NOOP("Symbols for Aristotelian elements") },
+	{ 0x1F705,	I18N_NOOP("Symbols for important solvents") },
+	{ 0x1F70D,	I18N_NOOP("Symbols for sulfur and mercury") },
+	{ 0x1F714,	I18N_NOOP("Symbols for salt, vitriol, and nitre") },
+	{ 0x1F71A,	I18N_NOOP("Symbols for gold and silver") },
+	{ 0x1F71C,	I18N_NOOP("Symbols for iron, iron ore and derivatives") },
+	{ 0x1F720,	I18N_NOOP("Symbols for copper, copper ore and derivatives") },
+	{ 0x1F729,	I18N_NOOP("Symbols for tin and lead ore") },
+	{ 0x1F72B,	I18N_NOOP("Symbols for antimony, antimony ore and derivatives") },
+	{ 0x1F736,	I18N_NOOP("Symbols for other substances") },
+	{ 0x1F75B,	I18N_NOOP("Composition") },
+	{ 0x1F75E,	I18N_NOOP("Processes") },
+	{ 0x1F765,	I18N_NOOP("Apparatus") },
+	{ 0x1F76E,	I18N_NOOP("Time") },
+	{ 0x1F772,	I18N_NOOP("Measures") },
+	{ 0x1F774,	I18N_NOOP("Other symbol") },
+	{ 0x1F775,	I18N_NOOP("Eclipse symbols") },
+	{ 0x1F777,	I18N_NOOP("Historical symbols for asteroids") },
+	{ 0x1F77B,	I18N_NOOP("Symbols for dwarf planets") },
+};
+
+static const TDEUnicodeData::Subcategory GeometricShapesExtended[] = {
+	{ 0x1F780,	I18N_NOOP("Isosceles right triangles") },
+	{ 0x1F784,	I18N_NOOP("Black circles") },
+	{ 0x1F785,	I18N_NOOP("White circles") },
+	{ 0x1F78A,	I18N_NOOP("White circles containing another black circle") },
+	{ 0x1F78B,	I18N_NOOP("Target symbol") },
+	{ 0x1F78C,	I18N_NOOP("Black squares") },
+	{ 0x1F78E,	I18N_NOOP("White squares") },
+	{ 0x1F794,	I18N_NOOP("White squares containing another black square") },
+	{ 0x1F796,	I18N_NOOP("Target symbol") },
+	{ 0x1F797,	I18N_NOOP("Black diamonds") },
+	{ 0x1F79A,	I18N_NOOP("White diamonds containing another black diamond") },
+	{ 0x1F79C,	I18N_NOOP("Target symbol") },
+	{ 0x1F79D,	I18N_NOOP("Black lozenges") },
+	{ 0x1F7A0,	I18N_NOOP("White lozenge containing another black lozenge") },
+	{ 0x1F7A1,	I18N_NOOP("Greek crosses") },
+	{ 0x1F7A8,	I18N_NOOP("Saltires") },
+	{ 0x1F7AF,	I18N_NOOP("Five spoked asterisks") },
+	{ 0x1F7B5,	I18N_NOOP("Six spoked asterisks") },
+	{ 0x1F7BB,	I18N_NOOP("Eight spoked asterisks") },
+	{ 0x1F7C0,	I18N_NOOP("Three pointed stars") },
+	{ 0x1F7C4,	I18N_NOOP("Four pointed stars") },
+	{ 0x1F7C9,	I18N_NOOP("Five pointed stars") },
+	{ 0x1F7CB,	I18N_NOOP("Six pointed stars") },
+	{ 0x1F7CE,	I18N_NOOP("Eight pointed stars") },
+	{ 0x1F7D2,	I18N_NOOP("Twelve pointed stars") },
+	{ 0x1F7D5,	I18N_NOOP("Go stone markers") },
+	{ 0x1F7D9,	I18N_NOOP("Nine pointed star") },
+	{ 0x1F7E0,	I18N_NOOP("Colored circles") },
+	{ 0x1F7E5,	I18N_NOOP("Colored squares") },
+	{ 0x1F7F0,	I18N_NOOP("Miscellaneous symbol") },
+};
+
+static const TDEUnicodeData::Subcategory SupplementalArrowsC[] = {
+	{ 0x1F800,	I18N_NOOP("Arrows with triangle arrowheads") },
+	{ 0x1F810,	I18N_NOOP("Arrows with equilateral triangle arrowheads") },
+	{ 0x1F820,	I18N_NOOP("Triangle headed arrows with different shaft weights") },
+	{ 0x1F834,	I18N_NOOP("Finger-post arrows") },
+	{ 0x1F838,	I18N_NOOP("Squared arrows") },
+	{ 0x1F83C,	I18N_NOOP("Compressed arrows") },
+	{ 0x1F844,	I18N_NOOP("Heavy arrows") },
+	{ 0x1F850,	I18N_NOOP("Sans-serif arrows") },
+	{ 0x1F860,	I18N_NOOP("Wide-headed barb arrows") },
+	{ 0x1F890,	I18N_NOOP("Arrowheads") },
+	{ 0x1F898,	I18N_NOOP("Notched arrows") },
+	{ 0x1F89C,	I18N_NOOP("Heavy arrow shafts") },
+	{ 0x1F8A0,	I18N_NOOP("Shaded white arrows") },
+	{ 0x1F8AC,	I18N_NOOP("White arrow shafts") },
+	{ 0x1F8B0,	I18N_NOOP("Arrows for legacy computing") },
+	{ 0x1F8C0,	I18N_NOOP("Arrows for Egyptology") },
+	{ 0x1F8D0,	I18N_NOOP("Reaction arrows for chemistry") },
+	{ 0x1F8D6,	I18N_NOOP("Unsuccessful reaction arrows for chemistry") },
+	{ 0x1F8D8,	I18N_NOOP("Isolobal arrow") },
+};
+
+static const TDEUnicodeData::Subcategory SupplementalSymbolsandPictographs[] = {
+	{ 0x1F900,	I18N_NOOP("Typicon symbols") },
+	{ 0x1F90C,	I18N_NOOP("Hand symbol") },
+	{ 0x1F90D,	I18N_NOOP("Colored heart symbols") },
+	{ 0x1F90F,	I18N_NOOP("Hand symbol") },
+	{ 0x1F910,	I18N_NOOP("Emoticon faces") },
+	{ 0x1F918,	I18N_NOOP("Hand symbols") },
+	{ 0x1F920,	I18N_NOOP("Emoticon faces") },
+	{ 0x1F930,	I18N_NOOP("Portrait and role symbols") },
+	{ 0x1F938,	I18N_NOOP("Sport symbols") },
+	{ 0x1F940,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x1F950,	I18N_NOOP("Food symbols") },
+	{ 0x1F970,	I18N_NOOP("Faces") },
+	{ 0x1F97B,	I18N_NOOP("Clothing") },
+	{ 0x1F980,	I18N_NOOP("Animal symbols") },
+	{ 0x1F9AE,	I18N_NOOP("Accessibility symbols") },
+	{ 0x1F9B0,	I18N_NOOP("Emoji components") },
+	{ 0x1F9B4,	I18N_NOOP("Body parts") },
+	{ 0x1F9B8,	I18N_NOOP("Role symbols") },
+	{ 0x1F9BA,	I18N_NOOP("Accessibility symbols") },
+	{ 0x1F9C0,	I18N_NOOP("Food symbols") },
+	{ 0x1F9CC,	I18N_NOOP("Fantasy being") },
+	{ 0x1F9CD,	I18N_NOOP("Portrait and accessibility symbols") },
+	{ 0x1F9D0,	I18N_NOOP("Portrait and role symbols") },
+	{ 0x1F9D9,	I18N_NOOP("Fantasy beings") },
+	{ 0x1F9E0,	I18N_NOOP("Miscellaneous symbols") },
+	{ 0x1F9E7,	I18N_NOOP("Activities") },
+	{ 0x1F9EA,	I18N_NOOP("Objects") },
+};
+
+static const TDEUnicodeData::Subcategory ChessSymbols[] = {
+	{ 0x1FA00,	I18N_NOOP("Neutral chess symbols") },
+	{ 0x1FA06,	I18N_NOOP("Chess symbols rotated 45 degrees") },
+	{ 0x1FA09,	I18N_NOOP("Chess symbols rotated 90 degrees") },
+	{ 0x1FA1B,	I18N_NOOP("Chess symbols rotated 135 degrees") },
+	{ 0x1FA1E,	I18N_NOOP("Chess symbols rotated 180 degrees (turned)") },
+	{ 0x1FA30,	I18N_NOOP("Chess symbols rotated 225 degrees") },
+	{ 0x1FA33,	I18N_NOOP("Chess symbols rotated 270 degrees") },
+	{ 0x1FA45,	I18N_NOOP("Chess symbols rotated 315 degrees") },
+	{ 0x1FA48,	I18N_NOOP("Chess equihoppers") },
+	{ 0x1FA4B,	I18N_NOOP("Chess equihoppers rotated 90 degrees") },
+	{ 0x1FA4E,	I18N_NOOP("Hybrid chess symbols") },
+	{ 0x1FA54,	I18N_NOOP("Shatranj chess symbols") },
+	{ 0x1FA60,	I18N_NOOP("Xiangqi symbols") },
+};
+
+static const TDEUnicodeData::Subcategory SymbolsandPictographsExtendedA[] = {
+	{ 0x1FA70,	I18N_NOOP("Clothing") },
+	{ 0x1FA75,	I18N_NOOP("Colored heart symbols") },
+	{ 0x1FA78,	I18N_NOOP("Medical symbols") },
+	{ 0x1FA80,	I18N_NOOP("Toys and sport symbols") },
+	{ 0x1FA87,	I18N_NOOP("Musical instruments") },
+	{ 0x1FA8E,	I18N_NOOP("Miscellaneous objects") },
+	{ 0x1FAAF,	I18N_NOOP("Religious symbol") },
+	{ 0x1FAB0,	I18N_NOOP("Animals and nature") },
+	{ 0x1FAC0,	I18N_NOOP("Body parts") },
+	{ 0x1FAC2,	I18N_NOOP("People") },
+	{ 0x1FAC6,	I18N_NOOP("Miscellaneous") },
+	{ 0x1FAC8,	I18N_NOOP("Animals and nature") },
+	{ 0x1FAD0,	I18N_NOOP("Food and drink") },
+	{ 0x1FADF,	I18N_NOOP("Miscellaneous") },
+	{ 0x1FAE0,	I18N_NOOP("Faces") },
+	{ 0x1FAE6,	I18N_NOOP("Emotion") },
+	{ 0x1FAE8,	I18N_NOOP("Faces") },
+	{ 0x1FAEF,	I18N_NOOP("Emotion") },
+	{ 0x1FAF0,	I18N_NOOP("Hand symbols") },
+};
+
+static const TDEUnicodeData::Subcategory SymbolsforLegacyComputing[] = {
+	{ 0x1FB00,	I18N_NOOP("Block mosaic terminal graphic characters") },
+	{ 0x1FB3C,	I18N_NOOP("Smooth mosaic terminal graphic characters") },
+	{ 0x1FB70,	I18N_NOOP("Block elements") },
+	{ 0x1FB81,	I18N_NOOP("Window title bar") },
+	{ 0x1FB82,	I18N_NOOP("Block elements") },
+	{ 0x1FB8C,	I18N_NOOP("Rectangular shade characters") },
+	{ 0x1FB95,	I18N_NOOP("Fill characters") },
+	{ 0x1FB98,	I18N_NOOP("Diagonal fill characters") },
+	{ 0x1FB9A,	I18N_NOOP("Smooth mosaic terminal graphic characters") },
+	{ 0x1FB9C,	I18N_NOOP("Triangular shade characters") },
+	{ 0x1FBA0,	I18N_NOOP("Character cell diagonals") },
+	{ 0x1FBAF,	I18N_NOOP("Light solid line with stroke") },
+	{ 0x1FBB0,	I18N_NOOP("Terminal graphic characters") },
+	{ 0x1FBB4,	I18N_NOOP("Arrows") },
+	{ 0x1FBB9,	I18N_NOOP("Terminal graphic characters") },
+	{ 0x1FBBD,	I18N_NOOP("Negative terminal graphic characters") },
+	{ 0x1FBC0,	I18N_NOOP("Terminal graphic characters") },
+	{ 0x1FBCB,	I18N_NOOP("Terminal graphic characters") },
+	{ 0x1FBCE,	I18N_NOOP("Block elements") },
+	{ 0x1FBD0,	I18N_NOOP("Character cell diagonals") },
+	{ 0x1FBE0,	I18N_NOOP("Geometric shapes") },
+	{ 0x1FBF0,	I18N_NOOP("Segmented digits") },
+	{ 0x1FBFA,	I18N_NOOP("Terminal graphic character") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned[] = {
+	{ 0x1FFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory CJKUnifiedIdeographsExtensionB[] = {
+};
+
+static const TDEUnicodeData::Subcategory CJKUnifiedIdeographsExtensionC[] = {
+};
+
+static const TDEUnicodeData::Subcategory CJKUnifiedIdeographsExtensionD[] = {
+};
+
+static const TDEUnicodeData::Subcategory CJKUnifiedIdeographsExtensionE[] = {
+};
+
+static const TDEUnicodeData::Subcategory CJKUnifiedIdeographsExtensionF[] = {
+};
+
+static const TDEUnicodeData::Subcategory CJKUnifiedIdeographsExtensionI[] = {
+};
+
+static const TDEUnicodeData::Subcategory CJKCompatibilityIdeographsSupplement[] = {
+	{ 0x2F800,	I18N_NOOP("Duplicate characters from CNS 11643-1992") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned2[] = {
+	{ 0x2FFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory CJKUnifiedIdeographsExtensionG[] = {
+};
+
+static const TDEUnicodeData::Subcategory CJKUnifiedIdeographsExtensionH[] = {
+};
+
+static const TDEUnicodeData::Subcategory CJKUnifiedIdeographsExtensionJ[] = {
+};
+
+static const TDEUnicodeData::Subcategory Unassigned3[] = {
+	{ 0x3FFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned4[] = {
+	{ 0x4FFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned5[] = {
+	{ 0x5FFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned6[] = {
+	{ 0x6FFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned7[] = {
+	{ 0x7FFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned8[] = {
+	{ 0x8FFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned9[] = {
+	{ 0x9FFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned10[] = {
+	{ 0xAFFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned11[] = {
+	{ 0xBFFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned12[] = {
+	{ 0xCFFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned13[] = {
+	{ 0xDFFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory Tags[] = {
+	{ 0xE0001,	I18N_NOOP("Tag identifiers") },
+	{ 0xE0020,	I18N_NOOP("Tag components") },
+	{ 0xE007F,	I18N_NOOP("Stateful tag terminator") },
+};
+
+static const TDEUnicodeData::Subcategory VariationSelectorsSupplement[] = {
+	{ 0xE0100,	I18N_NOOP("Ideographic-specific variation selectors") },
+};
+
+static const TDEUnicodeData::Subcategory Unassigned14[] = {
+	{ 0xEFFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory SupplementaryPrivateUseAreaA[] = {
+	{ 0xFFFFE,	I18N_NOOP("Noncharacters") },
+};
+
+static const TDEUnicodeData::Subcategory SupplementaryPrivateUseAreaB[] = {
+	{ 0x10FFFE,	I18N_NOOP("Noncharacters") },
+};
+
+constexpr TDEUnicodeData::Category categories[] = {
+	{ 0x0000,	I18N_NOOP("Basic Latin"),	BasicLatin,	sizeof(BasicLatin) / sizeof(*BasicLatin) },
+	{ 0x0080,	I18N_NOOP("Latin-1 Supplement"),	Latin1Supplement,	sizeof(Latin1Supplement) / sizeof(*Latin1Supplement) },
+	{ 0x0100,	I18N_NOOP("Latin Extended-A"),	LatinExtendedA,	sizeof(LatinExtendedA) / sizeof(*LatinExtendedA) },
+	{ 0x0180,	I18N_NOOP("Latin Extended-B"),	LatinExtendedB,	sizeof(LatinExtendedB) / sizeof(*LatinExtendedB) },
+	{ 0x0250,	I18N_NOOP("IPA Extensions"),	IPAExtensions,	sizeof(IPAExtensions) / sizeof(*IPAExtensions) },
+	{ 0x02B0,	I18N_NOOP("Spacing Modifier Letters"),	SpacingModifierLetters,	sizeof(SpacingModifierLetters) / sizeof(*SpacingModifierLetters) },
+	{ 0x0300,	I18N_NOOP("Combining Diacritical Marks"),	CombiningDiacriticalMarks,	sizeof(CombiningDiacriticalMarks) / sizeof(*CombiningDiacriticalMarks) },
+	{ 0x0370,	I18N_NOOP("Greek and Coptic"),	GreekandCoptic,	sizeof(GreekandCoptic) / sizeof(*GreekandCoptic) },
+	{ 0x0400,	I18N_NOOP("Cyrillic"),	Cyrillic,	sizeof(Cyrillic) / sizeof(*Cyrillic) },
+	{ 0x0500,	I18N_NOOP("Cyrillic Supplement"),	CyrillicSupplement,	sizeof(CyrillicSupplement) / sizeof(*CyrillicSupplement) },
+	{ 0x0530,	I18N_NOOP("Armenian"),	Armenian,	sizeof(Armenian) / sizeof(*Armenian) },
+	{ 0x0590,	I18N_NOOP("Hebrew"),	Hebrew,	sizeof(Hebrew) / sizeof(*Hebrew) },
+	{ 0x0600,	I18N_NOOP("Arabic"),	Arabic,	sizeof(Arabic) / sizeof(*Arabic) },
+	{ 0x0700,	I18N_NOOP("Syriac"),	Syriac,	sizeof(Syriac) / sizeof(*Syriac) },
+	{ 0x0750,	I18N_NOOP("Arabic Supplement"),	ArabicSupplement,	sizeof(ArabicSupplement) / sizeof(*ArabicSupplement) },
+	{ 0x0780,	I18N_NOOP("Thaana"),	Thaana,	sizeof(Thaana) / sizeof(*Thaana) },
+	{ 0x07C0,	I18N_NOOP("NKo"),	NKo,	sizeof(NKo) / sizeof(*NKo) },
+	{ 0x0800,	I18N_NOOP("Samaritan"),	Samaritan,	sizeof(Samaritan) / sizeof(*Samaritan) },
+	{ 0x0840,	I18N_NOOP("Mandaic"),	Mandaic,	sizeof(Mandaic) / sizeof(*Mandaic) },
+	{ 0x0860,	I18N_NOOP("Syriac Supplement"),	SyriacSupplement,	sizeof(SyriacSupplement) / sizeof(*SyriacSupplement) },
+	{ 0x0870,	I18N_NOOP("Arabic Extended-B"),	ArabicExtendedB,	sizeof(ArabicExtendedB) / sizeof(*ArabicExtendedB) },
+	{ 0x08A0,	I18N_NOOP("Arabic Extended-A"),	ArabicExtendedA,	sizeof(ArabicExtendedA) / sizeof(*ArabicExtendedA) },
+	{ 0x0900,	I18N_NOOP("Devanagari"),	Devanagari,	sizeof(Devanagari) / sizeof(*Devanagari) },
+	{ 0x0980,	I18N_NOOP("Bengali"),	Bengali,	sizeof(Bengali) / sizeof(*Bengali) },
+	{ 0x0A00,	I18N_NOOP("Gurmukhi"),	Gurmukhi,	sizeof(Gurmukhi) / sizeof(*Gurmukhi) },
+	{ 0x0A80,	I18N_NOOP("Gujarati"),	Gujarati,	sizeof(Gujarati) / sizeof(*Gujarati) },
+	{ 0x0B00,	I18N_NOOP("Oriya"),	Oriya,	sizeof(Oriya) / sizeof(*Oriya) },
+	{ 0x0B80,	I18N_NOOP("Tamil"),	Tamil,	sizeof(Tamil) / sizeof(*Tamil) },
+	{ 0x0C00,	I18N_NOOP("Telugu"),	Telugu,	sizeof(Telugu) / sizeof(*Telugu) },
+	{ 0x0C80,	I18N_NOOP("Kannada"),	Kannada,	sizeof(Kannada) / sizeof(*Kannada) },
+	{ 0x0D00,	I18N_NOOP("Malayalam"),	Malayalam,	sizeof(Malayalam) / sizeof(*Malayalam) },
+	{ 0x0D80,	I18N_NOOP("Sinhala"),	Sinhala,	sizeof(Sinhala) / sizeof(*Sinhala) },
+	{ 0x0E00,	I18N_NOOP("Thai"),	Thai,	sizeof(Thai) / sizeof(*Thai) },
+	{ 0x0E80,	I18N_NOOP("Lao"),	Lao,	sizeof(Lao) / sizeof(*Lao) },
+	{ 0x0F00,	I18N_NOOP("Tibetan"),	Tibetan,	sizeof(Tibetan) / sizeof(*Tibetan) },
+	{ 0x1000,	I18N_NOOP("Myanmar"),	Myanmar,	sizeof(Myanmar) / sizeof(*Myanmar) },
+	{ 0x10A0,	I18N_NOOP("Georgian"),	Georgian,	sizeof(Georgian) / sizeof(*Georgian) },
+	{ 0x1100,	I18N_NOOP("Hangul Jamo"),	HangulJamo,	sizeof(HangulJamo) / sizeof(*HangulJamo) },
+	{ 0x1200,	I18N_NOOP("Ethiopic"),	Ethiopic,	sizeof(Ethiopic) / sizeof(*Ethiopic) },
+	{ 0x1380,	I18N_NOOP("Ethiopic Supplement"),	EthiopicSupplement,	sizeof(EthiopicSupplement) / sizeof(*EthiopicSupplement) },
+	{ 0x13A0,	I18N_NOOP("Cherokee"),	Cherokee,	sizeof(Cherokee) / sizeof(*Cherokee) },
+	{ 0x1400,	I18N_NOOP("Unified Canadian Aboriginal Syllabics"),	UnifiedCanadianAboriginalSyllabics,	sizeof(UnifiedCanadianAboriginalSyllabics) / sizeof(*UnifiedCanadianAboriginalSyllabics) },
+	{ 0x1680,	I18N_NOOP("Ogham"),	Ogham,	sizeof(Ogham) / sizeof(*Ogham) },
+	{ 0x16A0,	I18N_NOOP("Runic"),	Runic,	sizeof(Runic) / sizeof(*Runic) },
+	{ 0x1700,	I18N_NOOP("Tagalog"),	Tagalog,	sizeof(Tagalog) / sizeof(*Tagalog) },
+	{ 0x1720,	I18N_NOOP("Hanunoo"),	Hanunoo,	sizeof(Hanunoo) / sizeof(*Hanunoo) },
+	{ 0x1740,	I18N_NOOP("Buhid"),	Buhid,	sizeof(Buhid) / sizeof(*Buhid) },
+	{ 0x1760,	I18N_NOOP("Tagbanwa"),	Tagbanwa,	sizeof(Tagbanwa) / sizeof(*Tagbanwa) },
+	{ 0x1780,	I18N_NOOP("Khmer"),	Khmer,	sizeof(Khmer) / sizeof(*Khmer) },
+	{ 0x1800,	I18N_NOOP("Mongolian"),	Mongolian,	sizeof(Mongolian) / sizeof(*Mongolian) },
+	{ 0x18B0,	I18N_NOOP("Unified Canadian Aboriginal Syllabics Extended"),	UnifiedCanadianAboriginalSyllabicsExtended,	sizeof(UnifiedCanadianAboriginalSyllabicsExtended) / sizeof(*UnifiedCanadianAboriginalSyllabicsExtended) },
+	{ 0x1900,	I18N_NOOP("Limbu"),	Limbu,	sizeof(Limbu) / sizeof(*Limbu) },
+	{ 0x1950,	I18N_NOOP("Tai Le"),	TaiLe,	sizeof(TaiLe) / sizeof(*TaiLe) },
+	{ 0x1980,	I18N_NOOP("New Tai Lue"),	NewTaiLue,	sizeof(NewTaiLue) / sizeof(*NewTaiLue) },
+	{ 0x19E0,	I18N_NOOP("Khmer Symbols"),	KhmerSymbols,	sizeof(KhmerSymbols) / sizeof(*KhmerSymbols) },
+	{ 0x1A00,	I18N_NOOP("Buginese"),	Buginese,	sizeof(Buginese) / sizeof(*Buginese) },
+	{ 0x1A20,	I18N_NOOP("Tai Tham"),	TaiTham,	sizeof(TaiTham) / sizeof(*TaiTham) },
+	{ 0x1AB0,	I18N_NOOP("Combining Diacritical Marks Extended"),	CombiningDiacriticalMarksExtended,	sizeof(CombiningDiacriticalMarksExtended) / sizeof(*CombiningDiacriticalMarksExtended) },
+	{ 0x1B00,	I18N_NOOP("Balinese"),	Balinese,	sizeof(Balinese) / sizeof(*Balinese) },
+	{ 0x1B80,	I18N_NOOP("Sundanese"),	Sundanese,	sizeof(Sundanese) / sizeof(*Sundanese) },
+	{ 0x1BC0,	I18N_NOOP("Batak"),	Batak,	sizeof(Batak) / sizeof(*Batak) },
+	{ 0x1C00,	I18N_NOOP("Lepcha"),	Lepcha,	sizeof(Lepcha) / sizeof(*Lepcha) },
+	{ 0x1C50,	I18N_NOOP("Ol Chiki"),	OlChiki,	sizeof(OlChiki) / sizeof(*OlChiki) },
+	{ 0x1C80,	I18N_NOOP("Cyrillic Extended-C"),	CyrillicExtendedC,	sizeof(CyrillicExtendedC) / sizeof(*CyrillicExtendedC) },
+	{ 0x1C90,	I18N_NOOP("Georgian Extended"),	GeorgianExtended,	sizeof(GeorgianExtended) / sizeof(*GeorgianExtended) },
+	{ 0x1CC0,	I18N_NOOP("Sundanese Supplement"),	SundaneseSupplement,	sizeof(SundaneseSupplement) / sizeof(*SundaneseSupplement) },
+	{ 0x1CD0,	I18N_NOOP("Vedic Extensions"),	VedicExtensions,	sizeof(VedicExtensions) / sizeof(*VedicExtensions) },
+	{ 0x1D00,	I18N_NOOP("Phonetic Extensions"),	PhoneticExtensions,	sizeof(PhoneticExtensions) / sizeof(*PhoneticExtensions) },
+	{ 0x1D80,	I18N_NOOP("Phonetic Extensions Supplement"),	PhoneticExtensionsSupplement,	sizeof(PhoneticExtensionsSupplement) / sizeof(*PhoneticExtensionsSupplement) },
+	{ 0x1DC0,	I18N_NOOP("Combining Diacritical Marks Supplement"),	CombiningDiacriticalMarksSupplement,	sizeof(CombiningDiacriticalMarksSupplement) / sizeof(*CombiningDiacriticalMarksSupplement) },
+	{ 0x1E00,	I18N_NOOP("Latin Extended Additional"),	LatinExtendedAdditional,	sizeof(LatinExtendedAdditional) / sizeof(*LatinExtendedAdditional) },
+	{ 0x1F00,	I18N_NOOP("Greek Extended"),	GreekExtended,	sizeof(GreekExtended) / sizeof(*GreekExtended) },
+	{ 0x2000,	I18N_NOOP("General Punctuation"),	GeneralPunctuation,	sizeof(GeneralPunctuation) / sizeof(*GeneralPunctuation) },
+	{ 0x2070,	I18N_NOOP("Superscripts and Subscripts"),	SuperscriptsandSubscripts,	sizeof(SuperscriptsandSubscripts) / sizeof(*SuperscriptsandSubscripts) },
+	{ 0x20A0,	I18N_NOOP("Currency Symbols"),	CurrencySymbols,	sizeof(CurrencySymbols) / sizeof(*CurrencySymbols) },
+	{ 0x20D0,	I18N_NOOP("Combining Diacritical Marks for Symbols"),	CombiningDiacriticalMarksforSymbols,	sizeof(CombiningDiacriticalMarksforSymbols) / sizeof(*CombiningDiacriticalMarksforSymbols) },
+	{ 0x2100,	I18N_NOOP("Letterlike Symbols"),	LetterlikeSymbols,	sizeof(LetterlikeSymbols) / sizeof(*LetterlikeSymbols) },
+	{ 0x2150,	I18N_NOOP("Number Forms"),	NumberForms,	sizeof(NumberForms) / sizeof(*NumberForms) },
+	{ 0x2190,	I18N_NOOP("Arrows"),	Arrows,	sizeof(Arrows) / sizeof(*Arrows) },
+	{ 0x2200,	I18N_NOOP("Mathematical Operators"),	MathematicalOperators,	sizeof(MathematicalOperators) / sizeof(*MathematicalOperators) },
+	{ 0x2300,	I18N_NOOP("Miscellaneous Technical"),	MiscellaneousTechnical,	sizeof(MiscellaneousTechnical) / sizeof(*MiscellaneousTechnical) },
+	{ 0x2400,	I18N_NOOP("Control Pictures"),	ControlPictures,	sizeof(ControlPictures) / sizeof(*ControlPictures) },
+	{ 0x2440,	I18N_NOOP("Optical Character Recognition"),	OpticalCharacterRecognition,	sizeof(OpticalCharacterRecognition) / sizeof(*OpticalCharacterRecognition) },
+	{ 0x2460,	I18N_NOOP("Enclosed Alphanumerics"),	EnclosedAlphanumerics,	sizeof(EnclosedAlphanumerics) / sizeof(*EnclosedAlphanumerics) },
+	{ 0x2500,	I18N_NOOP("Box Drawing"),	BoxDrawing,	sizeof(BoxDrawing) / sizeof(*BoxDrawing) },
+	{ 0x2580,	I18N_NOOP("Block Elements"),	BlockElements,	sizeof(BlockElements) / sizeof(*BlockElements) },
+	{ 0x25A0,	I18N_NOOP("Geometric Shapes"),	GeometricShapes,	sizeof(GeometricShapes) / sizeof(*GeometricShapes) },
+	{ 0x2600,	I18N_NOOP("Miscellaneous Symbols"),	MiscellaneousSymbols,	sizeof(MiscellaneousSymbols) / sizeof(*MiscellaneousSymbols) },
+	{ 0x2700,	I18N_NOOP("Dingbats"),	Dingbats,	sizeof(Dingbats) / sizeof(*Dingbats) },
+	{ 0x27C0,	I18N_NOOP("Miscellaneous Mathematical Symbols-A"),	MiscellaneousMathematicalSymbolsA,	sizeof(MiscellaneousMathematicalSymbolsA) / sizeof(*MiscellaneousMathematicalSymbolsA) },
+	{ 0x27F0,	I18N_NOOP("Supplemental Arrows-A"),	SupplementalArrowsA,	sizeof(SupplementalArrowsA) / sizeof(*SupplementalArrowsA) },
+	{ 0x2800,	I18N_NOOP("Braille Patterns"),	BraillePatterns,	sizeof(BraillePatterns) / sizeof(*BraillePatterns) },
+	{ 0x2900,	I18N_NOOP("Supplemental Arrows-B"),	SupplementalArrowsB,	sizeof(SupplementalArrowsB) / sizeof(*SupplementalArrowsB) },
+	{ 0x2980,	I18N_NOOP("Miscellaneous Mathematical Symbols-B"),	MiscellaneousMathematicalSymbolsB,	sizeof(MiscellaneousMathematicalSymbolsB) / sizeof(*MiscellaneousMathematicalSymbolsB) },
+	{ 0x2A00,	I18N_NOOP("Supplemental Mathematical Operators"),	SupplementalMathematicalOperators,	sizeof(SupplementalMathematicalOperators) / sizeof(*SupplementalMathematicalOperators) },
+	{ 0x2B00,	I18N_NOOP("Miscellaneous Symbols and Arrows"),	MiscellaneousSymbolsandArrows,	sizeof(MiscellaneousSymbolsandArrows) / sizeof(*MiscellaneousSymbolsandArrows) },
+	{ 0x2C00,	I18N_NOOP("Glagolitic"),	Glagolitic,	sizeof(Glagolitic) / sizeof(*Glagolitic) },
+	{ 0x2C60,	I18N_NOOP("Latin Extended-C"),	LatinExtendedC,	sizeof(LatinExtendedC) / sizeof(*LatinExtendedC) },
+	{ 0x2C80,	I18N_NOOP("Coptic"),	Coptic,	sizeof(Coptic) / sizeof(*Coptic) },
+	{ 0x2D00,	I18N_NOOP("Georgian Supplement"),	GeorgianSupplement,	sizeof(GeorgianSupplement) / sizeof(*GeorgianSupplement) },
+	{ 0x2D30,	I18N_NOOP("Tifinagh"),	Tifinagh,	sizeof(Tifinagh) / sizeof(*Tifinagh) },
+	{ 0x2D80,	I18N_NOOP("Ethiopic Extended"),	EthiopicExtended,	sizeof(EthiopicExtended) / sizeof(*EthiopicExtended) },
+	{ 0x2DE0,	I18N_NOOP("Cyrillic Extended-A"),	CyrillicExtendedA,	sizeof(CyrillicExtendedA) / sizeof(*CyrillicExtendedA) },
+	{ 0x2E00,	I18N_NOOP("Supplemental Punctuation"),	SupplementalPunctuation,	sizeof(SupplementalPunctuation) / sizeof(*SupplementalPunctuation) },
+	{ 0x2E80,	I18N_NOOP("CJK Radicals Supplement"),	CJKRadicalsSupplement,	sizeof(CJKRadicalsSupplement) / sizeof(*CJKRadicalsSupplement) },
+	{ 0x2F00,	I18N_NOOP("Kangxi Radicals"),	KangxiRadicals,	sizeof(KangxiRadicals) / sizeof(*KangxiRadicals) },
+	{ 0x2FF0,	I18N_NOOP("Ideographic Description Characters"),	IdeographicDescriptionCharacters,	sizeof(IdeographicDescriptionCharacters) / sizeof(*IdeographicDescriptionCharacters) },
+	{ 0x3000,	I18N_NOOP("CJK Symbols and Punctuation"),	CJKSymbolsandPunctuation,	sizeof(CJKSymbolsandPunctuation) / sizeof(*CJKSymbolsandPunctuation) },
+	{ 0x3040,	I18N_NOOP("Hiragana"),	Hiragana,	sizeof(Hiragana) / sizeof(*Hiragana) },
+	{ 0x30A0,	I18N_NOOP("Katakana"),	Katakana,	sizeof(Katakana) / sizeof(*Katakana) },
+	{ 0x3100,	I18N_NOOP("Bopomofo"),	Bopomofo,	sizeof(Bopomofo) / sizeof(*Bopomofo) },
+	{ 0x3130,	I18N_NOOP("Hangul Compatibility Jamo"),	HangulCompatibilityJamo,	sizeof(HangulCompatibilityJamo) / sizeof(*HangulCompatibilityJamo) },
+	{ 0x3190,	I18N_NOOP("Kanbun"),	Kanbun,	sizeof(Kanbun) / sizeof(*Kanbun) },
+	{ 0x31A0,	I18N_NOOP("Bopomofo Extended"),	BopomofoExtended,	sizeof(BopomofoExtended) / sizeof(*BopomofoExtended) },
+	{ 0x31C0,	I18N_NOOP("CJK Strokes"),	CJKStrokes,	sizeof(CJKStrokes) / sizeof(*CJKStrokes) },
+	{ 0x31F0,	I18N_NOOP("Katakana Phonetic Extensions"),	KatakanaPhoneticExtensions,	sizeof(KatakanaPhoneticExtensions) / sizeof(*KatakanaPhoneticExtensions) },
+	{ 0x3200,	I18N_NOOP("Enclosed CJK Letters and Months"),	EnclosedCJKLettersandMonths,	sizeof(EnclosedCJKLettersandMonths) / sizeof(*EnclosedCJKLettersandMonths) },
+	{ 0x3300,	I18N_NOOP("CJK Compatibility"),	CJKCompatibility,	sizeof(CJKCompatibility) / sizeof(*CJKCompatibility) },
+	{ 0x3400,	I18N_NOOP("CJK Unified Ideographs Extension A"),	CJKUnifiedIdeographsExtensionA,	sizeof(CJKUnifiedIdeographsExtensionA) / sizeof(*CJKUnifiedIdeographsExtensionA) },
+	{ 0x4DC0,	I18N_NOOP("Yijing Hexagram Symbols"),	YijingHexagramSymbols,	sizeof(YijingHexagramSymbols) / sizeof(*YijingHexagramSymbols) },
+	{ 0x4E00,	I18N_NOOP("CJK Unified Ideographs"),	CJKUnifiedIdeographs,	sizeof(CJKUnifiedIdeographs) / sizeof(*CJKUnifiedIdeographs) },
+	{ 0xA000,	I18N_NOOP("Yi Syllables"),	YiSyllables,	sizeof(YiSyllables) / sizeof(*YiSyllables) },
+	{ 0xA490,	I18N_NOOP("Yi Radicals"),	YiRadicals,	sizeof(YiRadicals) / sizeof(*YiRadicals) },
+	{ 0xA4D0,	I18N_NOOP("Lisu"),	Lisu,	sizeof(Lisu) / sizeof(*Lisu) },
+	{ 0xA500,	I18N_NOOP("Vai"),	Vai,	sizeof(Vai) / sizeof(*Vai) },
+	{ 0xA640,	I18N_NOOP("Cyrillic Extended-B"),	CyrillicExtendedB,	sizeof(CyrillicExtendedB) / sizeof(*CyrillicExtendedB) },
+	{ 0xA6A0,	I18N_NOOP("Bamum"),	Bamum,	sizeof(Bamum) / sizeof(*Bamum) },
+	{ 0xA700,	I18N_NOOP("Modifier Tone Letters"),	ModifierToneLetters,	sizeof(ModifierToneLetters) / sizeof(*ModifierToneLetters) },
+	{ 0xA720,	I18N_NOOP("Latin Extended-D"),	LatinExtendedD,	sizeof(LatinExtendedD) / sizeof(*LatinExtendedD) },
+	{ 0xA800,	I18N_NOOP("Syloti Nagri"),	SylotiNagri,	sizeof(SylotiNagri) / sizeof(*SylotiNagri) },
+	{ 0xA830,	I18N_NOOP("Common Indic Number Forms"),	CommonIndicNumberForms,	sizeof(CommonIndicNumberForms) / sizeof(*CommonIndicNumberForms) },
+	{ 0xA840,	I18N_NOOP("Phags-pa"),	Phagspa,	sizeof(Phagspa) / sizeof(*Phagspa) },
+	{ 0xA880,	I18N_NOOP("Saurashtra"),	Saurashtra,	sizeof(Saurashtra) / sizeof(*Saurashtra) },
+	{ 0xA8E0,	I18N_NOOP("Devanagari Extended"),	DevanagariExtended,	sizeof(DevanagariExtended) / sizeof(*DevanagariExtended) },
+	{ 0xA900,	I18N_NOOP("Kayah Li"),	KayahLi,	sizeof(KayahLi) / sizeof(*KayahLi) },
+	{ 0xA930,	I18N_NOOP("Rejang"),	Rejang,	sizeof(Rejang) / sizeof(*Rejang) },
+	{ 0xA960,	I18N_NOOP("Hangul Jamo Extended-A"),	HangulJamoExtendedA,	sizeof(HangulJamoExtendedA) / sizeof(*HangulJamoExtendedA) },
+	{ 0xA980,	I18N_NOOP("Javanese"),	Javanese,	sizeof(Javanese) / sizeof(*Javanese) },
+	{ 0xA9E0,	I18N_NOOP("Myanmar Extended-B"),	MyanmarExtendedB,	sizeof(MyanmarExtendedB) / sizeof(*MyanmarExtendedB) },
+	{ 0xAA00,	I18N_NOOP("Cham"),	Cham,	sizeof(Cham) / sizeof(*Cham) },
+	{ 0xAA60,	I18N_NOOP("Myanmar Extended-A"),	MyanmarExtendedA,	sizeof(MyanmarExtendedA) / sizeof(*MyanmarExtendedA) },
+	{ 0xAA80,	I18N_NOOP("Tai Viet"),	TaiViet,	sizeof(TaiViet) / sizeof(*TaiViet) },
+	{ 0xAAE0,	I18N_NOOP("Meetei Mayek Extensions"),	MeeteiMayekExtensions,	sizeof(MeeteiMayekExtensions) / sizeof(*MeeteiMayekExtensions) },
+	{ 0xAB00,	I18N_NOOP("Ethiopic Extended-A"),	EthiopicExtendedA,	sizeof(EthiopicExtendedA) / sizeof(*EthiopicExtendedA) },
+	{ 0xAB30,	I18N_NOOP("Latin Extended-E"),	LatinExtendedE,	sizeof(LatinExtendedE) / sizeof(*LatinExtendedE) },
+	{ 0xAB70,	I18N_NOOP("Cherokee Supplement"),	CherokeeSupplement,	sizeof(CherokeeSupplement) / sizeof(*CherokeeSupplement) },
+	{ 0xABC0,	I18N_NOOP("Meetei Mayek"),	MeeteiMayek,	sizeof(MeeteiMayek) / sizeof(*MeeteiMayek) },
+	{ 0xAC00,	I18N_NOOP("Hangul Syllables"),	HangulSyllables,	sizeof(HangulSyllables) / sizeof(*HangulSyllables) },
+	{ 0xD7B0,	I18N_NOOP("Hangul Jamo Extended-B"),	HangulJamoExtendedB,	sizeof(HangulJamoExtendedB) / sizeof(*HangulJamoExtendedB) },
+	{ 0xD800,	I18N_NOOP("High Surrogates"),	HighSurrogates,	sizeof(HighSurrogates) / sizeof(*HighSurrogates) },
+	{ 0xDB80,	I18N_NOOP("High Private Use Surrogates"),	HighPrivateUseSurrogates,	sizeof(HighPrivateUseSurrogates) / sizeof(*HighPrivateUseSurrogates) },
+	{ 0xDC00,	I18N_NOOP("Low Surrogates"),	LowSurrogates,	sizeof(LowSurrogates) / sizeof(*LowSurrogates) },
+	{ 0xE000,	I18N_NOOP("Private Use Area"),	PrivateUseArea,	sizeof(PrivateUseArea) / sizeof(*PrivateUseArea) },
+	{ 0xF900,	I18N_NOOP("CJK Compatibility Ideographs"),	CJKCompatibilityIdeographs,	sizeof(CJKCompatibilityIdeographs) / sizeof(*CJKCompatibilityIdeographs) },
+	{ 0xFB00,	I18N_NOOP("Alphabetic Presentation Forms"),	AlphabeticPresentationForms,	sizeof(AlphabeticPresentationForms) / sizeof(*AlphabeticPresentationForms) },
+	{ 0xFB50,	I18N_NOOP("Arabic Presentation Forms-A"),	ArabicPresentationFormsA,	sizeof(ArabicPresentationFormsA) / sizeof(*ArabicPresentationFormsA) },
+	{ 0xFE00,	I18N_NOOP("Variation Selectors"),	VariationSelectors,	sizeof(VariationSelectors) / sizeof(*VariationSelectors) },
+	{ 0xFE10,	I18N_NOOP("Vertical Forms"),	VerticalForms,	sizeof(VerticalForms) / sizeof(*VerticalForms) },
+	{ 0xFE20,	I18N_NOOP("Combining Half Marks"),	CombiningHalfMarks,	sizeof(CombiningHalfMarks) / sizeof(*CombiningHalfMarks) },
+	{ 0xFE30,	I18N_NOOP("CJK Compatibility Forms"),	CJKCompatibilityForms,	sizeof(CJKCompatibilityForms) / sizeof(*CJKCompatibilityForms) },
+	{ 0xFE50,	I18N_NOOP("Small Form Variants"),	SmallFormVariants,	sizeof(SmallFormVariants) / sizeof(*SmallFormVariants) },
+	{ 0xFE70,	I18N_NOOP("Arabic Presentation Forms-B"),	ArabicPresentationFormsB,	sizeof(ArabicPresentationFormsB) / sizeof(*ArabicPresentationFormsB) },
+	{ 0xFF00,	I18N_NOOP("Halfwidth and Fullwidth Forms"),	HalfwidthandFullwidthForms,	sizeof(HalfwidthandFullwidthForms) / sizeof(*HalfwidthandFullwidthForms) },
+	{ 0xFFF0,	I18N_NOOP("Specials"),	Specials,	sizeof(Specials) / sizeof(*Specials) },
+	{ 0x10000,	I18N_NOOP("Linear B Syllabary"),	LinearBSyllabary,	sizeof(LinearBSyllabary) / sizeof(*LinearBSyllabary) },
+	{ 0x10080,	I18N_NOOP("Linear B Ideograms"),	LinearBIdeograms,	sizeof(LinearBIdeograms) / sizeof(*LinearBIdeograms) },
+	{ 0x10100,	I18N_NOOP("Aegean Numbers"),	AegeanNumbers,	sizeof(AegeanNumbers) / sizeof(*AegeanNumbers) },
+	{ 0x10140,	I18N_NOOP("Ancient Greek Numbers"),	AncientGreekNumbers,	sizeof(AncientGreekNumbers) / sizeof(*AncientGreekNumbers) },
+	{ 0x10190,	I18N_NOOP("Ancient Symbols"),	AncientSymbols,	sizeof(AncientSymbols) / sizeof(*AncientSymbols) },
+	{ 0x101D0,	I18N_NOOP("Phaistos Disc"),	PhaistosDisc,	sizeof(PhaistosDisc) / sizeof(*PhaistosDisc) },
+	{ 0x10280,	I18N_NOOP("Lycian"),	Lycian,	sizeof(Lycian) / sizeof(*Lycian) },
+	{ 0x102A0,	I18N_NOOP("Carian"),	Carian,	sizeof(Carian) / sizeof(*Carian) },
+	{ 0x102E0,	I18N_NOOP("Coptic Epact Numbers"),	CopticEpactNumbers,	sizeof(CopticEpactNumbers) / sizeof(*CopticEpactNumbers) },
+	{ 0x10300,	I18N_NOOP("Old Italic"),	OldItalic,	sizeof(OldItalic) / sizeof(*OldItalic) },
+	{ 0x10330,	I18N_NOOP("Gothic"),	Gothic,	sizeof(Gothic) / sizeof(*Gothic) },
+	{ 0x10350,	I18N_NOOP("Old Permic"),	OldPermic,	sizeof(OldPermic) / sizeof(*OldPermic) },
+	{ 0x10380,	I18N_NOOP("Ugaritic"),	Ugaritic,	sizeof(Ugaritic) / sizeof(*Ugaritic) },
+	{ 0x103A0,	I18N_NOOP("Old Persian"),	OldPersian,	sizeof(OldPersian) / sizeof(*OldPersian) },
+	{ 0x10400,	I18N_NOOP("Deseret"),	Deseret,	sizeof(Deseret) / sizeof(*Deseret) },
+	{ 0x10450,	I18N_NOOP("Shavian"),	Shavian,	sizeof(Shavian) / sizeof(*Shavian) },
+	{ 0x10480,	I18N_NOOP("Osmanya"),	Osmanya,	sizeof(Osmanya) / sizeof(*Osmanya) },
+	{ 0x104B0,	I18N_NOOP("Osage"),	Osage,	sizeof(Osage) / sizeof(*Osage) },
+	{ 0x10500,	I18N_NOOP("Elbasan"),	Elbasan,	sizeof(Elbasan) / sizeof(*Elbasan) },
+	{ 0x10530,	I18N_NOOP("Caucasian Albanian"),	CaucasianAlbanian,	sizeof(CaucasianAlbanian) / sizeof(*CaucasianAlbanian) },
+	{ 0x10570,	I18N_NOOP("Vithkuqi"),	Vithkuqi,	sizeof(Vithkuqi) / sizeof(*Vithkuqi) },
+	{ 0x105C0,	I18N_NOOP("Todhri"),	Todhri,	sizeof(Todhri) / sizeof(*Todhri) },
+	{ 0x10600,	I18N_NOOP("Linear A"),	LinearA,	sizeof(LinearA) / sizeof(*LinearA) },
+	{ 0x10780,	I18N_NOOP("Latin Extended-F"),	LatinExtendedF,	sizeof(LatinExtendedF) / sizeof(*LatinExtendedF) },
+	{ 0x10800,	I18N_NOOP("Cypriot Syllabary"),	CypriotSyllabary,	sizeof(CypriotSyllabary) / sizeof(*CypriotSyllabary) },
+	{ 0x10840,	I18N_NOOP("Imperial Aramaic"),	ImperialAramaic,	sizeof(ImperialAramaic) / sizeof(*ImperialAramaic) },
+	{ 0x10860,	I18N_NOOP("Palmyrene"),	Palmyrene,	sizeof(Palmyrene) / sizeof(*Palmyrene) },
+	{ 0x10880,	I18N_NOOP("Nabataean"),	Nabataean,	sizeof(Nabataean) / sizeof(*Nabataean) },
+	{ 0x108E0,	I18N_NOOP("Hatran"),	Hatran,	sizeof(Hatran) / sizeof(*Hatran) },
+	{ 0x10900,	I18N_NOOP("Phoenician"),	Phoenician,	sizeof(Phoenician) / sizeof(*Phoenician) },
+	{ 0x10920,	I18N_NOOP("Lydian"),	Lydian,	sizeof(Lydian) / sizeof(*Lydian) },
+	{ 0x10940,	I18N_NOOP("Sidetic"),	Sidetic,	sizeof(Sidetic) / sizeof(*Sidetic) },
+	{ 0x10980,	I18N_NOOP("Meroitic Hieroglyphs"),	MeroiticHieroglyphs,	sizeof(MeroiticHieroglyphs) / sizeof(*MeroiticHieroglyphs) },
+	{ 0x109A0,	I18N_NOOP("Meroitic Cursive"),	MeroiticCursive,	sizeof(MeroiticCursive) / sizeof(*MeroiticCursive) },
+	{ 0x10A00,	I18N_NOOP("Kharoshthi"),	Kharoshthi,	sizeof(Kharoshthi) / sizeof(*Kharoshthi) },
+	{ 0x10A60,	I18N_NOOP("Old South Arabian"),	OldSouthArabian,	sizeof(OldSouthArabian) / sizeof(*OldSouthArabian) },
+	{ 0x10A80,	I18N_NOOP("Old North Arabian"),	OldNorthArabian,	sizeof(OldNorthArabian) / sizeof(*OldNorthArabian) },
+	{ 0x10AC0,	I18N_NOOP("Manichaean"),	Manichaean,	sizeof(Manichaean) / sizeof(*Manichaean) },
+	{ 0x10B00,	I18N_NOOP("Avestan"),	Avestan,	sizeof(Avestan) / sizeof(*Avestan) },
+	{ 0x10B40,	I18N_NOOP("Inscriptional Parthian"),	InscriptionalParthian,	sizeof(InscriptionalParthian) / sizeof(*InscriptionalParthian) },
+	{ 0x10B60,	I18N_NOOP("Inscriptional Pahlavi"),	InscriptionalPahlavi,	sizeof(InscriptionalPahlavi) / sizeof(*InscriptionalPahlavi) },
+	{ 0x10B80,	I18N_NOOP("Psalter Pahlavi"),	PsalterPahlavi,	sizeof(PsalterPahlavi) / sizeof(*PsalterPahlavi) },
+	{ 0x10C00,	I18N_NOOP("Old Turkic"),	OldTurkic,	sizeof(OldTurkic) / sizeof(*OldTurkic) },
+	{ 0x10C80,	I18N_NOOP("Old Hungarian"),	OldHungarian,	sizeof(OldHungarian) / sizeof(*OldHungarian) },
+	{ 0x10D00,	I18N_NOOP("Hanifi Rohingya"),	HanifiRohingya,	sizeof(HanifiRohingya) / sizeof(*HanifiRohingya) },
+	{ 0x10D40,	I18N_NOOP("Garay"),	Garay,	sizeof(Garay) / sizeof(*Garay) },
+	{ 0x10E60,	I18N_NOOP("Rumi Numeral Symbols"),	RumiNumeralSymbols,	sizeof(RumiNumeralSymbols) / sizeof(*RumiNumeralSymbols) },
+	{ 0x10E80,	I18N_NOOP("Yezidi"),	Yezidi,	sizeof(Yezidi) / sizeof(*Yezidi) },
+	{ 0x10EC0,	I18N_NOOP("Arabic Extended-C"),	ArabicExtendedC,	sizeof(ArabicExtendedC) / sizeof(*ArabicExtendedC) },
+	{ 0x10F00,	I18N_NOOP("Old Sogdian"),	OldSogdian,	sizeof(OldSogdian) / sizeof(*OldSogdian) },
+	{ 0x10F30,	I18N_NOOP("Sogdian"),	Sogdian,	sizeof(Sogdian) / sizeof(*Sogdian) },
+	{ 0x10F70,	I18N_NOOP("Old Uyghur"),	OldUyghur,	sizeof(OldUyghur) / sizeof(*OldUyghur) },
+	{ 0x10FB0,	I18N_NOOP("Chorasmian"),	Chorasmian,	sizeof(Chorasmian) / sizeof(*Chorasmian) },
+	{ 0x10FE0,	I18N_NOOP("Elymaic"),	Elymaic,	sizeof(Elymaic) / sizeof(*Elymaic) },
+	{ 0x11000,	I18N_NOOP("Brahmi"),	Brahmi,	sizeof(Brahmi) / sizeof(*Brahmi) },
+	{ 0x11080,	I18N_NOOP("Kaithi"),	Kaithi,	sizeof(Kaithi) / sizeof(*Kaithi) },
+	{ 0x110D0,	I18N_NOOP("Sora Sompeng"),	SoraSompeng,	sizeof(SoraSompeng) / sizeof(*SoraSompeng) },
+	{ 0x11100,	I18N_NOOP("Chakma"),	Chakma,	sizeof(Chakma) / sizeof(*Chakma) },
+	{ 0x11150,	I18N_NOOP("Mahajani"),	Mahajani,	sizeof(Mahajani) / sizeof(*Mahajani) },
+	{ 0x11180,	I18N_NOOP("Sharada"),	Sharada,	sizeof(Sharada) / sizeof(*Sharada) },
+	{ 0x111E0,	I18N_NOOP("Sinhala Archaic Numbers"),	SinhalaArchaicNumbers,	sizeof(SinhalaArchaicNumbers) / sizeof(*SinhalaArchaicNumbers) },
+	{ 0x11200,	I18N_NOOP("Khojki"),	Khojki,	sizeof(Khojki) / sizeof(*Khojki) },
+	{ 0x11280,	I18N_NOOP("Multani"),	Multani,	sizeof(Multani) / sizeof(*Multani) },
+	{ 0x112B0,	I18N_NOOP("Khudawadi"),	Khudawadi,	sizeof(Khudawadi) / sizeof(*Khudawadi) },
+	{ 0x11300,	I18N_NOOP("Grantha"),	Grantha,	sizeof(Grantha) / sizeof(*Grantha) },
+	{ 0x11380,	I18N_NOOP("Tulu-Tigalari"),	TuluTigalari,	sizeof(TuluTigalari) / sizeof(*TuluTigalari) },
+	{ 0x11400,	I18N_NOOP("Newa"),	Newa,	sizeof(Newa) / sizeof(*Newa) },
+	{ 0x11480,	I18N_NOOP("Tirhuta"),	Tirhuta,	sizeof(Tirhuta) / sizeof(*Tirhuta) },
+	{ 0x11580,	I18N_NOOP("Siddham"),	Siddham,	sizeof(Siddham) / sizeof(*Siddham) },
+	{ 0x11600,	I18N_NOOP("Modi"),	Modi,	sizeof(Modi) / sizeof(*Modi) },
+	{ 0x11660,	I18N_NOOP("Mongolian Supplement"),	MongolianSupplement,	sizeof(MongolianSupplement) / sizeof(*MongolianSupplement) },
+	{ 0x11680,	I18N_NOOP("Takri"),	Takri,	sizeof(Takri) / sizeof(*Takri) },
+	{ 0x116D0,	I18N_NOOP("Myanmar Extended-C"),	MyanmarExtendedC,	sizeof(MyanmarExtendedC) / sizeof(*MyanmarExtendedC) },
+	{ 0x11700,	I18N_NOOP("Ahom"),	Ahom,	sizeof(Ahom) / sizeof(*Ahom) },
+	{ 0x11800,	I18N_NOOP("Dogra"),	Dogra,	sizeof(Dogra) / sizeof(*Dogra) },
+	{ 0x118A0,	I18N_NOOP("Warang Citi"),	WarangCiti,	sizeof(WarangCiti) / sizeof(*WarangCiti) },
+	{ 0x11900,	I18N_NOOP("Dives Akuru"),	DivesAkuru,	sizeof(DivesAkuru) / sizeof(*DivesAkuru) },
+	{ 0x119A0,	I18N_NOOP("Nandinagari"),	Nandinagari,	sizeof(Nandinagari) / sizeof(*Nandinagari) },
+	{ 0x11A00,	I18N_NOOP("Zanabazar Square"),	ZanabazarSquare,	sizeof(ZanabazarSquare) / sizeof(*ZanabazarSquare) },
+	{ 0x11A50,	I18N_NOOP("Soyombo"),	Soyombo,	sizeof(Soyombo) / sizeof(*Soyombo) },
+	{ 0x11AB0,	I18N_NOOP("Unified Canadian Aboriginal Syllabics Extended-A"),	UnifiedCanadianAboriginalSyllabicsExtendedA,	sizeof(UnifiedCanadianAboriginalSyllabicsExtendedA) / sizeof(*UnifiedCanadianAboriginalSyllabicsExtendedA) },
+	{ 0x11AC0,	I18N_NOOP("Pau Cin Hau"),	PauCinHau,	sizeof(PauCinHau) / sizeof(*PauCinHau) },
+	{ 0x11B00,	I18N_NOOP("Devanagari Extended-A"),	DevanagariExtendedA,	sizeof(DevanagariExtendedA) / sizeof(*DevanagariExtendedA) },
+	{ 0x11B60,	I18N_NOOP("Sharada Supplement"),	SharadaSupplement,	sizeof(SharadaSupplement) / sizeof(*SharadaSupplement) },
+	{ 0x11BC0,	I18N_NOOP("Sunuwar"),	Sunuwar,	sizeof(Sunuwar) / sizeof(*Sunuwar) },
+	{ 0x11C00,	I18N_NOOP("Bhaiksuki"),	Bhaiksuki,	sizeof(Bhaiksuki) / sizeof(*Bhaiksuki) },
+	{ 0x11C70,	I18N_NOOP("Marchen"),	Marchen,	sizeof(Marchen) / sizeof(*Marchen) },
+	{ 0x11D00,	I18N_NOOP("Masaram Gondi"),	MasaramGondi,	sizeof(MasaramGondi) / sizeof(*MasaramGondi) },
+	{ 0x11D60,	I18N_NOOP("Gunjala Gondi"),	GunjalaGondi,	sizeof(GunjalaGondi) / sizeof(*GunjalaGondi) },
+	{ 0x11DB0,	I18N_NOOP("Tolong Siki"),	TolongSiki,	sizeof(TolongSiki) / sizeof(*TolongSiki) },
+	{ 0x11EE0,	I18N_NOOP("Makasar"),	Makasar,	sizeof(Makasar) / sizeof(*Makasar) },
+	{ 0x11F00,	I18N_NOOP("Kawi"),	Kawi,	sizeof(Kawi) / sizeof(*Kawi) },
+	{ 0x11FB0,	I18N_NOOP("Lisu Supplement"),	LisuSupplement,	sizeof(LisuSupplement) / sizeof(*LisuSupplement) },
+	{ 0x11FC0,	I18N_NOOP("Tamil Supplement"),	TamilSupplement,	sizeof(TamilSupplement) / sizeof(*TamilSupplement) },
+	{ 0x12000,	I18N_NOOP("Cuneiform"),	Cuneiform,	sizeof(Cuneiform) / sizeof(*Cuneiform) },
+	{ 0x12400,	I18N_NOOP("Cuneiform Numbers and Punctuation"),	CuneiformNumbersandPunctuation,	sizeof(CuneiformNumbersandPunctuation) / sizeof(*CuneiformNumbersandPunctuation) },
+	{ 0x12480,	I18N_NOOP("Early Dynastic Cuneiform"),	EarlyDynasticCuneiform,	sizeof(EarlyDynasticCuneiform) / sizeof(*EarlyDynasticCuneiform) },
+	{ 0x12F90,	I18N_NOOP("Cypro-Minoan"),	CyproMinoan,	sizeof(CyproMinoan) / sizeof(*CyproMinoan) },
+	{ 0x13000,	I18N_NOOP("Egyptian Hieroglyphs"),	EgyptianHieroglyphs,	sizeof(EgyptianHieroglyphs) / sizeof(*EgyptianHieroglyphs) },
+	{ 0x13430,	I18N_NOOP("Egyptian Hieroglyph Format Controls"),	EgyptianHieroglyphFormatControls,	sizeof(EgyptianHieroglyphFormatControls) / sizeof(*EgyptianHieroglyphFormatControls) },
+	{ 0x13460,	I18N_NOOP("Egyptian Hieroglyphs Extended-A"),	EgyptianHieroglyphsExtendedA,	sizeof(EgyptianHieroglyphsExtendedA) / sizeof(*EgyptianHieroglyphsExtendedA) },
+	{ 0x14400,	I18N_NOOP("Anatolian Hieroglyphs"),	AnatolianHieroglyphs,	sizeof(AnatolianHieroglyphs) / sizeof(*AnatolianHieroglyphs) },
+	{ 0x16100,	I18N_NOOP("Gurung Khema"),	GurungKhema,	sizeof(GurungKhema) / sizeof(*GurungKhema) },
+	{ 0x16800,	I18N_NOOP("Bamum Supplement"),	BamumSupplement,	sizeof(BamumSupplement) / sizeof(*BamumSupplement) },
+	{ 0x16A40,	I18N_NOOP("Mro"),	Mro,	sizeof(Mro) / sizeof(*Mro) },
+	{ 0x16A70,	I18N_NOOP("Tangsa"),	Tangsa,	sizeof(Tangsa) / sizeof(*Tangsa) },
+	{ 0x16AD0,	I18N_NOOP("Bassa Vah"),	BassaVah,	sizeof(BassaVah) / sizeof(*BassaVah) },
+	{ 0x16B00,	I18N_NOOP("Pahawh Hmong"),	PahawhHmong,	sizeof(PahawhHmong) / sizeof(*PahawhHmong) },
+	{ 0x16D40,	I18N_NOOP("Kirat Rai"),	KiratRai,	sizeof(KiratRai) / sizeof(*KiratRai) },
+	{ 0x16E40,	I18N_NOOP("Medefaidrin"),	Medefaidrin,	sizeof(Medefaidrin) / sizeof(*Medefaidrin) },
+	{ 0x16EA0,	I18N_NOOP("Beria Erfe"),	BeriaErfe,	sizeof(BeriaErfe) / sizeof(*BeriaErfe) },
+	{ 0x16F00,	I18N_NOOP("Miao"),	Miao,	sizeof(Miao) / sizeof(*Miao) },
+	{ 0x16FE0,	I18N_NOOP("Ideographic Symbols and Punctuation"),	IdeographicSymbolsandPunctuation,	sizeof(IdeographicSymbolsandPunctuation) / sizeof(*IdeographicSymbolsandPunctuation) },
+	{ 0x17000,	I18N_NOOP("Tangut"),	Tangut,	sizeof(Tangut) / sizeof(*Tangut) },
+	{ 0x18800,	I18N_NOOP("Tangut Components"),	TangutComponents,	sizeof(TangutComponents) / sizeof(*TangutComponents) },
+	{ 0x18B00,	I18N_NOOP("Khitan Small Script"),	KhitanSmallScript,	sizeof(KhitanSmallScript) / sizeof(*KhitanSmallScript) },
+	{ 0x18D00,	I18N_NOOP("Tangut Supplement"),	TangutSupplement,	sizeof(TangutSupplement) / sizeof(*TangutSupplement) },
+	{ 0x18D80,	I18N_NOOP("Tangut Components Supplement"),	TangutComponentsSupplement,	sizeof(TangutComponentsSupplement) / sizeof(*TangutComponentsSupplement) },
+	{ 0x1AFF0,	I18N_NOOP("Kana Extended-B"),	KanaExtendedB,	sizeof(KanaExtendedB) / sizeof(*KanaExtendedB) },
+	{ 0x1B000,	I18N_NOOP("Kana Supplement"),	KanaSupplement,	sizeof(KanaSupplement) / sizeof(*KanaSupplement) },
+	{ 0x1B100,	I18N_NOOP("Kana Extended-A"),	KanaExtendedA,	sizeof(KanaExtendedA) / sizeof(*KanaExtendedA) },
+	{ 0x1B130,	I18N_NOOP("Small Kana Extension"),	SmallKanaExtension,	sizeof(SmallKanaExtension) / sizeof(*SmallKanaExtension) },
+	{ 0x1B170,	I18N_NOOP("Nushu"),	Nushu,	sizeof(Nushu) / sizeof(*Nushu) },
+	{ 0x1BC00,	I18N_NOOP("Duployan"),	Duployan,	sizeof(Duployan) / sizeof(*Duployan) },
+	{ 0x1BCA0,	I18N_NOOP("Shorthand Format Controls"),	ShorthandFormatControls,	sizeof(ShorthandFormatControls) / sizeof(*ShorthandFormatControls) },
+	{ 0x1CC00,	I18N_NOOP("Symbols for Legacy Computing Supplement"),	SymbolsforLegacyComputingSupplement,	sizeof(SymbolsforLegacyComputingSupplement) / sizeof(*SymbolsforLegacyComputingSupplement) },
+	{ 0x1CEC0,	I18N_NOOP("Miscellaneous Symbols Supplement"),	MiscellaneousSymbolsSupplement,	sizeof(MiscellaneousSymbolsSupplement) / sizeof(*MiscellaneousSymbolsSupplement) },
+	{ 0x1CF00,	I18N_NOOP("Znamenny Musical Notation"),	ZnamennyMusicalNotation,	sizeof(ZnamennyMusicalNotation) / sizeof(*ZnamennyMusicalNotation) },
+	{ 0x1D000,	I18N_NOOP("Byzantine Musical Symbols"),	ByzantineMusicalSymbols,	sizeof(ByzantineMusicalSymbols) / sizeof(*ByzantineMusicalSymbols) },
+	{ 0x1D100,	I18N_NOOP("Musical Symbols"),	MusicalSymbols,	sizeof(MusicalSymbols) / sizeof(*MusicalSymbols) },
+	{ 0x1D200,	I18N_NOOP("Ancient Greek Musical Notation"),	AncientGreekMusicalNotation,	sizeof(AncientGreekMusicalNotation) / sizeof(*AncientGreekMusicalNotation) },
+	{ 0x1D2C0,	I18N_NOOP("Kaktovik Numerals"),	KaktovikNumerals,	sizeof(KaktovikNumerals) / sizeof(*KaktovikNumerals) },
+	{ 0x1D2E0,	I18N_NOOP("Mayan Numerals"),	MayanNumerals,	sizeof(MayanNumerals) / sizeof(*MayanNumerals) },
+	{ 0x1D300,	I18N_NOOP("Tai Xuan Jing Symbols"),	TaiXuanJingSymbols,	sizeof(TaiXuanJingSymbols) / sizeof(*TaiXuanJingSymbols) },
+	{ 0x1D360,	I18N_NOOP("Counting Rod Numerals"),	CountingRodNumerals,	sizeof(CountingRodNumerals) / sizeof(*CountingRodNumerals) },
+	{ 0x1D400,	I18N_NOOP("Mathematical Alphanumeric Symbols"),	MathematicalAlphanumericSymbols,	sizeof(MathematicalAlphanumericSymbols) / sizeof(*MathematicalAlphanumericSymbols) },
+	{ 0x1D800,	I18N_NOOP("Sutton SignWriting"),	SuttonSignWriting,	sizeof(SuttonSignWriting) / sizeof(*SuttonSignWriting) },
+	{ 0x1DF00,	I18N_NOOP("Latin Extended-G"),	LatinExtendedG,	sizeof(LatinExtendedG) / sizeof(*LatinExtendedG) },
+	{ 0x1E000,	I18N_NOOP("Glagolitic Supplement"),	GlagoliticSupplement,	sizeof(GlagoliticSupplement) / sizeof(*GlagoliticSupplement) },
+	{ 0x1E030,	I18N_NOOP("Cyrillic Extended-D"),	CyrillicExtendedD,	sizeof(CyrillicExtendedD) / sizeof(*CyrillicExtendedD) },
+	{ 0x1E100,	I18N_NOOP("Nyiakeng Puachue Hmong"),	NyiakengPuachueHmong,	sizeof(NyiakengPuachueHmong) / sizeof(*NyiakengPuachueHmong) },
+	{ 0x1E290,	I18N_NOOP("Toto"),	Toto,	sizeof(Toto) / sizeof(*Toto) },
+	{ 0x1E2C0,	I18N_NOOP("Wancho"),	Wancho,	sizeof(Wancho) / sizeof(*Wancho) },
+	{ 0x1E4D0,	I18N_NOOP("Nag Mundari"),	NagMundari,	sizeof(NagMundari) / sizeof(*NagMundari) },
+	{ 0x1E5D0,	I18N_NOOP("Ol Onal"),	OlOnal,	sizeof(OlOnal) / sizeof(*OlOnal) },
+	{ 0x1E6C0,	I18N_NOOP("Tai Yo"),	TaiYo,	sizeof(TaiYo) / sizeof(*TaiYo) },
+	{ 0x1E7E0,	I18N_NOOP("Ethiopic Extended-B"),	EthiopicExtendedB,	sizeof(EthiopicExtendedB) / sizeof(*EthiopicExtendedB) },
+	{ 0x1E800,	I18N_NOOP("Mende Kikakui"),	MendeKikakui,	sizeof(MendeKikakui) / sizeof(*MendeKikakui) },
+	{ 0x1E900,	I18N_NOOP("Adlam"),	Adlam,	sizeof(Adlam) / sizeof(*Adlam) },
+	{ 0x1EC70,	I18N_NOOP("Indic Siyaq Numbers"),	IndicSiyaqNumbers,	sizeof(IndicSiyaqNumbers) / sizeof(*IndicSiyaqNumbers) },
+	{ 0x1ED00,	I18N_NOOP("Ottoman Siyaq Numbers"),	OttomanSiyaqNumbers,	sizeof(OttomanSiyaqNumbers) / sizeof(*OttomanSiyaqNumbers) },
+	{ 0x1EE00,	I18N_NOOP("Arabic Mathematical Alphabetic Symbols"),	ArabicMathematicalAlphabeticSymbols,	sizeof(ArabicMathematicalAlphabeticSymbols) / sizeof(*ArabicMathematicalAlphabeticSymbols) },
+	{ 0x1F000,	I18N_NOOP("Mahjong Tiles"),	MahjongTiles,	sizeof(MahjongTiles) / sizeof(*MahjongTiles) },
+	{ 0x1F030,	I18N_NOOP("Domino Tiles"),	DominoTiles,	sizeof(DominoTiles) / sizeof(*DominoTiles) },
+	{ 0x1F0A0,	I18N_NOOP("Playing Cards"),	PlayingCards,	sizeof(PlayingCards) / sizeof(*PlayingCards) },
+	{ 0x1F100,	I18N_NOOP("Enclosed Alphanumeric Supplement"),	EnclosedAlphanumericSupplement,	sizeof(EnclosedAlphanumericSupplement) / sizeof(*EnclosedAlphanumericSupplement) },
+	{ 0x1F200,	I18N_NOOP("Enclosed Ideographic Supplement"),	EnclosedIdeographicSupplement,	sizeof(EnclosedIdeographicSupplement) / sizeof(*EnclosedIdeographicSupplement) },
+	{ 0x1F300,	I18N_NOOP("Miscellaneous Symbols and Pictographs"),	MiscellaneousSymbolsandPictographs,	sizeof(MiscellaneousSymbolsandPictographs) / sizeof(*MiscellaneousSymbolsandPictographs) },
+	{ 0x1F600,	I18N_NOOP("Emoticons"),	Emoticons,	sizeof(Emoticons) / sizeof(*Emoticons) },
+	{ 0x1F650,	I18N_NOOP("Ornamental Dingbats"),	OrnamentalDingbats,	sizeof(OrnamentalDingbats) / sizeof(*OrnamentalDingbats) },
+	{ 0x1F680,	I18N_NOOP("Transport and Map Symbols"),	TransportandMapSymbols,	sizeof(TransportandMapSymbols) / sizeof(*TransportandMapSymbols) },
+	{ 0x1F700,	I18N_NOOP("Alchemical Symbols"),	AlchemicalSymbols,	sizeof(AlchemicalSymbols) / sizeof(*AlchemicalSymbols) },
+	{ 0x1F780,	I18N_NOOP("Geometric Shapes Extended"),	GeometricShapesExtended,	sizeof(GeometricShapesExtended) / sizeof(*GeometricShapesExtended) },
+	{ 0x1F800,	I18N_NOOP("Supplemental Arrows-C"),	SupplementalArrowsC,	sizeof(SupplementalArrowsC) / sizeof(*SupplementalArrowsC) },
+	{ 0x1F900,	I18N_NOOP("Supplemental Symbols and Pictographs"),	SupplementalSymbolsandPictographs,	sizeof(SupplementalSymbolsandPictographs) / sizeof(*SupplementalSymbolsandPictographs) },
+	{ 0x1FA00,	I18N_NOOP("Chess Symbols"),	ChessSymbols,	sizeof(ChessSymbols) / sizeof(*ChessSymbols) },
+	{ 0x1FA70,	I18N_NOOP("Symbols and Pictographs Extended-A"),	SymbolsandPictographsExtendedA,	sizeof(SymbolsandPictographsExtendedA) / sizeof(*SymbolsandPictographsExtendedA) },
+	{ 0x1FB00,	I18N_NOOP("Symbols for Legacy Computing"),	SymbolsforLegacyComputing,	sizeof(SymbolsforLegacyComputing) / sizeof(*SymbolsforLegacyComputing) },
+	{ 0x1FF80,	I18N_NOOP("Unassigned1"),	Unassigned,	sizeof(Unassigned) / sizeof(*Unassigned) },
+	{ 0x20000,	I18N_NOOP("CJK Unified Ideographs Extension B"),	CJKUnifiedIdeographsExtensionB,	sizeof(CJKUnifiedIdeographsExtensionB) / sizeof(*CJKUnifiedIdeographsExtensionB) },
+	{ 0x2A700,	I18N_NOOP("CJK Unified Ideographs Extension C"),	CJKUnifiedIdeographsExtensionC,	sizeof(CJKUnifiedIdeographsExtensionC) / sizeof(*CJKUnifiedIdeographsExtensionC) },
+	{ 0x2B740,	I18N_NOOP("CJK Unified Ideographs Extension D"),	CJKUnifiedIdeographsExtensionD,	sizeof(CJKUnifiedIdeographsExtensionD) / sizeof(*CJKUnifiedIdeographsExtensionD) },
+	{ 0x2B820,	I18N_NOOP("CJK Unified Ideographs Extension E"),	CJKUnifiedIdeographsExtensionE,	sizeof(CJKUnifiedIdeographsExtensionE) / sizeof(*CJKUnifiedIdeographsExtensionE) },
+	{ 0x2CEB0,	I18N_NOOP("CJK Unified Ideographs Extension F"),	CJKUnifiedIdeographsExtensionF,	sizeof(CJKUnifiedIdeographsExtensionF) / sizeof(*CJKUnifiedIdeographsExtensionF) },
+	{ 0x2EBF0,	I18N_NOOP("CJK Unified Ideographs Extension I"),	CJKUnifiedIdeographsExtensionI,	sizeof(CJKUnifiedIdeographsExtensionI) / sizeof(*CJKUnifiedIdeographsExtensionI) },
+	{ 0x2F800,	I18N_NOOP("CJK Compatibility Ideographs Supplement"),	CJKCompatibilityIdeographsSupplement,	sizeof(CJKCompatibilityIdeographsSupplement) / sizeof(*CJKCompatibilityIdeographsSupplement) },
+	{ 0x2FF80,	I18N_NOOP("Unassigned"),	Unassigned2,	sizeof(Unassigned2) / sizeof(*Unassigned2) },
+	{ 0x30000,	I18N_NOOP("CJK Unified Ideographs Extension G"),	CJKUnifiedIdeographsExtensionG,	sizeof(CJKUnifiedIdeographsExtensionG) / sizeof(*CJKUnifiedIdeographsExtensionG) },
+	{ 0x31350,	I18N_NOOP("CJK Unified Ideographs Extension H"),	CJKUnifiedIdeographsExtensionH,	sizeof(CJKUnifiedIdeographsExtensionH) / sizeof(*CJKUnifiedIdeographsExtensionH) },
+	{ 0x323B0,	I18N_NOOP("CJK Unified Ideographs Extension J"),	CJKUnifiedIdeographsExtensionJ,	sizeof(CJKUnifiedIdeographsExtensionJ) / sizeof(*CJKUnifiedIdeographsExtensionJ) },
+	{ 0x3FF80,	I18N_NOOP("Unassigned"),	Unassigned3,	sizeof(Unassigned3) / sizeof(*Unassigned3) },
+	{ 0x4FF80,	I18N_NOOP("Unassigned"),	Unassigned4,	sizeof(Unassigned4) / sizeof(*Unassigned4) },
+	{ 0x5FF80,	I18N_NOOP("Unassigned"),	Unassigned5,	sizeof(Unassigned5) / sizeof(*Unassigned5) },
+	{ 0x6FF80,	I18N_NOOP("Unassigned"),	Unassigned6,	sizeof(Unassigned6) / sizeof(*Unassigned6) },
+	{ 0x7FF80,	I18N_NOOP("Unassigned"),	Unassigned7,	sizeof(Unassigned7) / sizeof(*Unassigned7) },
+	{ 0x8FF80,	I18N_NOOP("Unassigned"),	Unassigned8,	sizeof(Unassigned8) / sizeof(*Unassigned8) },
+	{ 0x9FF80,	I18N_NOOP("Unassigned"),	Unassigned9,	sizeof(Unassigned9) / sizeof(*Unassigned9) },
+	{ 0xAFF80,	I18N_NOOP("Unassigned"),	Unassigned10,	sizeof(Unassigned10) / sizeof(*Unassigned10) },
+	{ 0xBFF80,	I18N_NOOP("Unassigned"),	Unassigned11,	sizeof(Unassigned11) / sizeof(*Unassigned11) },
+	{ 0xCFF80,	I18N_NOOP("Unassigned"),	Unassigned12,	sizeof(Unassigned12) / sizeof(*Unassigned12) },
+	{ 0xDFF80,	I18N_NOOP("Unassigned"),	Unassigned13,	sizeof(Unassigned13) / sizeof(*Unassigned13) },
+	{ 0xE0000,	I18N_NOOP("Tags"),	Tags,	sizeof(Tags) / sizeof(*Tags) },
+	{ 0xE0100,	I18N_NOOP("Variation Selectors Supplement"),	VariationSelectorsSupplement,	sizeof(VariationSelectorsSupplement) / sizeof(*VariationSelectorsSupplement) },
+	{ 0xEFF80,	I18N_NOOP("Unassigned"),	Unassigned14,	sizeof(Unassigned14) / sizeof(*Unassigned14) },
+	{ 0xFFF80,	I18N_NOOP("Supplementary Private Use Area-A"),	SupplementaryPrivateUseAreaA,	sizeof(SupplementaryPrivateUseAreaA) / sizeof(*SupplementaryPrivateUseAreaA) },
+	{ 0x10FF80,	I18N_NOOP("Supplementary Private Use Area-B"),	SupplementaryPrivateUseAreaB,	sizeof(SupplementaryPrivateUseAreaB) / sizeof(*SupplementaryPrivateUseAreaB) },
+};
+
+constexpr size_t categories_size = sizeof(categories) / sizeof(*categories);
+
+// Generated on Sun Apr  5 13:42:59 2026
diff --git a/tdeui/CMakeLists.txt b/tdeui/CMakeLists.txt
index 27a55ae21..57bd381ae 100644
--- a/tdeui/CMakeLists.txt
+++ b/tdeui/CMakeLists.txt
@@ -79,7 +79,6 @@ install( FILES
     kiconviewsearchline.h tdetoolbarlabelaction.h tdeshortcutdialog.h
   DESTINATION ${INCLUDE_INSTALL_DIR} )
 
-
 ##### other data ################################
 
 install( FILES
diff --git a/tdeui/kcharselect.cpp b/tdeui/kcharselect.cpp
index 2fd73e7d9..ce2bec2f3 100644
--- a/tdeui/kcharselect.cpp
+++ b/tdeui/kcharselect.cpp
@@ -42,6 +42,7 @@
 #include <kdialog.h>
 #include <klineedit.h>
 #include <tdelocale.h>
+#include <tdeunicodedata.h>
 
 class KCharSelectTableToolTip;
 class KCharSelectTable::KCharSelectTablePrivate
@@ -95,6 +96,16 @@ protected:
             return;
         }
 
+        TDEUnicodeData *unicodeData = TDEUnicodeData::instance();
+
+        const TDEUnicodeData::Category *category = unicodeData->findCategory(ch.unicode());
+        TQString categoryName = category ? i18n(category->name) : i18n("(unknown)");
+
+        const TDEUnicodeData::Subcategory *subcategory = category
+            ? unicodeData->findSubcategory(category, ch.unicode())
+            : nullptr;
+        TQString subcategoryName = subcategory ? i18n(subcategory->name) : i18n("(unknown)");
+
         TQRect r = cst->cellGeometry( row, col );
         r = TQRect( cst->contentsToViewport(r.topLeft()), r.size());
 
@@ -102,15 +113,18 @@ protected:
         TQString character = TQStyleSheet::escape(ch); // Character sometimes need to be escaped
 
         tip(r, i18n( "Character",
-                    "<qt><font size=\"+4\" face=\"%1\">%2</font>"
-                    "<br>Unicode code point: U+%3"
-                    "<br>(In decimal: %4)"
-                    "<br>(Character: %5)"
-                    "</qt>" ).arg( cst->fontName() )
-                             .arg( character )
-                             .arg( hex )
-                             .arg( ch.unicode() )
-                             .arg( character )
+            "<qt><table>"
+            "<tr><td colspan='2'><font size=\"+4\" face=\"%1\">%2</font></td></tr>"
+            "<tr><td>Category:</td><td><b>%3</b></td></tr>"
+            "<tr><td>Subcategory:</td><td><b>%4</b></td></tr>"
+            "<tr><td>Code point:</td><td><b>U+%5</b></td></tr>"
+            "<tr><td>Decimal:</td><td><b>%6</b></td></tr>"
+            "</table></qt>").arg( cst->fontName() )
+                            .arg( character )
+                            .arg( categoryName )
+                            .arg( subcategoryName )
+                            .arg( hex )
+                            .arg( ch.unicode() )
            );
     }
 private:
diff --git a/tdeui/unicode/update_unicode_data.pl b/tdeui/unicode/update_unicode_data.pl
new file mode 100755
index 000000000..260e00b53
--- /dev/null
+++ b/tdeui/unicode/update_unicode_data.pl
@@ -0,0 +1,205 @@
+#!/bin/env perl
+#
+# Copyright © 2026 Trinity Desktop Project <https://www.trinitydesktop.org/>
+#
+# This Perl script fetches the NamesList.txt file from the latest Unicode data
+# distribution, processes it and generates the `tdeunicodedata_categories.cpp`
+# file included by libtdecore's TDEUnicodeData for its category dock.
+#
+# Licensed under the terms of the GNU General Public License version 2 or later.
+#
+# This file is part of KCharSelect.
+#
+
+use strict;
+use warnings;
+use File::Fetch;
+
+my $src = "NamesList.txt";
+my $out = "tdeunicodedata_categories.cpp";
+
+# -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
+
+print "Downloading latest Unicode data...\n";
+
+my $uri = "https://www.unicode.org/Public/UCD/latest/ucd/$src";
+my $ff = File::Fetch->new(uri => $uri);
+$ff->fetch() or die $ff->error;
+
+my $timestamp = localtime();
+
+print "Data downloaded to $src\n";
+
+# -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
+
+open my $srcfile, '<', $src or die $!;
+
+# -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
+
+my $document_name = "The Unicode Standard";
+
+my @categories;
+
+# See RMK-0002 below
+my %id_counter;
+
+# See RMK-0003 below
+my $subcategory = undef;
+
+print "Processing Unicode data...\n";
+
+while (<$srcfile>)
+{
+    chomp;
+    my @cols = split "\t";
+
+    if ($cols[0] eq "@@@")
+    {
+        $document_name = $cols[1];
+    }
+
+    elsif ($cols[0] eq "@@") # category
+    {
+        my $uc   = $cols[1];
+        my $name = $cols[2];
+        $name =~ s/.*\((.*)\)/$1/;
+
+        # -- RMK-0001 ----------------------------------------------------------
+        # The id value is used below to produce a valid C++ name for the data
+        # structures holding the children of a category. The id is deduced from
+        # the category name, with some illegal chracters removed and a counter
+        # optionally appended to prevent multiple redefinitions of the same
+        # subcategory name (see RMK-0002 below).
+        my $id = $name;
+        $id =~ tr/ -//ds;
+
+        if (defined($id_counter{$id}))
+        {
+            # -- RMK-0002 ------------------------------------------------------
+            # We are here, so this means that there are at least 2 elements
+            # with the same name. This is currently the case with "Unassigned"
+            # subcategories. This means that we need to append the counter
+            # value to all the subcategories which would otherwise be sharing
+            # the same id and result in FTBFS. Apart from appending the counter
+            # value to all subsequent subcategories, we also append the "1"
+            # value to the first instance of this name which we have stored
+            # beforehand (see below).
+            my $first = $id_counter{$id}[1];
+            if (defined($first))
+            {
+                # $first is defined, and
+                print("Applying value counter for subcategory: " . $categories[$first][2] . "\n");
+                $categories[$first][1] .= "1";
+                $id_counter{$id}[1] = undef;
+            }
+            ++$id_counter{$id}[0];
+            $id .= $id_counter{$id}[0];
+        }
+        else
+        {
+            # We store the index of the first instance for future reference,
+            # in case we want to retroactively add a counter value (see
+            # RMK-0002 above).
+            $id_counter{$id} = [1, 0+@categories];
+        }
+
+        push @categories, [$uc, $name, $id, []];
+    }
+
+    elsif ($cols[0] eq "@") # subcategory
+    {
+        # -- RMK-0003 ----------------------------------------------------------
+        # Since we don't have a codepoint as part of a subcategory definition,
+        # we store the subcategory name in a variable and delay writing until
+        # the first actual codepoint is encountered (see below).
+        $subcategory = $cols[2];
+    }
+
+    elsif ($cols[0] =~ m/[0-9A-F]{4}/)
+    {
+        # Found code point, write the subcategory (see RMK-0003 above)
+        if ($subcategory)
+        {
+            my $uc = $cols[0];
+            push @{$categories[-1][3]}, [$uc, $subcategory];
+            undef $subcategory;
+        }
+    }
+}
+
+# -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
+
+close $srcfile;
+open my $outfile, '>', $out or die $!;
+
+print "Generating CPP code...\n";
+
+# -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
+
+# Write header
+print $outfile <<"END";
+// This is a data structure which contains all Unicode blocks/categories as defined by ${document_name}
+// Downloaded and adapted from ${uri}
+// --
+// THIS FILE WAS AUTOMATICALLY GENERATED.
+// Update this file using the `update_unicode_data.pl` script.
+
+#include "tdeunicodedata.h"
+
+#include <tdelocale.h>
+
+// Category/subcategory arrays are sorted by codepoint so they can be
+// searched with std::lower_bound/std::upper_bound. Each array is a
+// plain array (no sentinel); its size is embedded in the parent
+// Category struct (subcategories_size) or in categories_size.
+//
+// Names are wrapped in I18N_NOOP() to tag them for translation
+// extraction; the actual translation is performed at the call site
+// with i18n(name).
+
+END
+
+# Generate subcategory structs
+foreach my $category (@categories)
+{
+    my $category_id   = @{$category}[2];
+    my @subcategories = @{@{$category}[3]};
+
+    print $outfile qq!\nstatic const TDEUnicodeData::Subcategory ${category_id}[] = {\n!;
+
+    for my $subcategory (@subcategories)
+    {
+        my $uc   = sprintf "%04s", @{$subcategory}[0];
+        my $name = @{$subcategory}[1];
+
+        print $outfile qq!\t{ 0x${uc},\tI18N_NOOP("${name}") },\n!;
+    }
+    print $outfile qq!};\n!;
+}
+
+# Generate category structs
+print $outfile qq!\nconstexpr TDEUnicodeData::Category categories[] = {\n!;
+foreach my $category (@categories)
+{
+    my $uc   = sprintf "%04s", @{$category}[0];
+    my $name = @{$category}[1];
+    my $id   = @{$category}[2];
+
+    print $outfile qq!\t{ 0x${uc},\tI18N_NOOP("${name}"),\t${id},\tsizeof(${id}) / sizeof(*${id}) },\n!;
+}
+print $outfile qq!};\n!;
+
+print $outfile qq!\nconstexpr size_t categories_size = sizeof(categories) / sizeof(*categories);\n!;
+
+# Write footer
+print $outfile <<"END";
+
+// Generated on ${timestamp}
+END
+
+# -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
+
+close $outfile;
+unlink $src;
+
+print "Generated file $out\n";
-- 
cgit v1.2.3

