diff --git a/Changelog.md b/Changelog.md
new file mode 100644
--- /dev/null
+++ b/Changelog.md
@@ -0,0 +1,5 @@
+# Changelog
+
+## 0.1.0 (June 2022)
+
+- Initial release
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,249 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work.
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+-------------------------------------------------------------------------------
+This distribution includes portions of code from the "unicode-transforms"
+package (https://github.com/composewell/unicode-transforms/) which is
+available under BSD-3-Clause license as described below.
+-------------------------------------------------------------------------------
+
+Copyright (c) 2016, Harendra Kumar
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+may be used to endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------------------
+This distribution includes portions of code from the "unicode-transforms"
+package (https://github.com/composewell/unicode-transforms/)
+which included portions of code from the "prose"
+(https://github.com/llelf/prose) package available under BSD-3-Clause
+license as described below.
+-------------------------------------------------------------------------------
+
+Copyright (c) 2014–2015, Antonio Nikishaev
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Antonio Nikishaev nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,35 @@
+# README
+
+`unicode-data-names` provides Haskell APIs to efficiently access the Unicode
+character names and aliases from the
+[Unicode character database](https://www.unicode.org/ucd/).
+
+The Haskell data structures are generated programmatically from the
+Unicode character database (UCD) files. The latest Unicode version
+supported by this library is
+[`14.0.0`](https://www.unicode.org/versions/Unicode14.0.0/).
+
+Please see the
+[Haddock documentation](https://hackage.haskell.org/package/unicode-data-names)
+for reference documentation.
+
+## Comparing with Python
+
+In order to check Unicode implementation in Haskell, we compare the results obtained
+with Python.
+
+__Warning:__ A Python version with the _exact same Unicode version_ is required.
+
+```bash
+cabal run -f "export-all-chars" -v0 export-all-chars > ./test/all_chars.csv
+python3 ./test/check.py -v ./test/all_chars.csv
+```
+
+## Licensing
+
+`unicode-data-names` is an [open source](https://github.com/composewell/unicode-data)
+project available under a liberal [Apache-2.0 license](LICENSE).
+
+## Contributing
+
+As an open project we welcome contributions.
diff --git a/bench/Main.hs b/bench/Main.hs
new file mode 100644
--- /dev/null
+++ b/bench/Main.hs
@@ -0,0 +1,60 @@
+{-# LANGUAGE ExistentialQuantification #-}
+
+import Control.DeepSeq (NFData, deepseq)
+import Data.Ix (Ix(..))
+import Test.Tasty.Bench (Benchmark, bgroup, bcompare, bench, nf, defaultMain)
+
+import qualified Unicode.Char.General.Names as Names
+import qualified Unicode.Internal.Char.UnicodeData.DerivedName as DerivedName
+import qualified Unicode.Internal.Char.UnicodeData.NameAliases as NameAliases
+
+-- | A unit benchmark
+data Bench = forall a. (NFData a) => Bench
+  { _title :: !String  -- ^ Name
+  , _func :: Char -> a -- ^ Function to benchmark
+  }
+
+main :: IO ()
+main = defaultMain
+    [ bgroup "Unicode.Char.General.Names"
+        -- Character classification
+        [ bgroup' "name"
+            [ Bench "CString" DerivedName.name
+            , Bench "String"  Names.name
+            ]
+        , bgroup' "correctedName"
+            [ Bench "String"  Names.correctedName
+            ]
+        , bgroup' "nameOrAlias"
+            [ Bench "String"  Names.name
+            ]
+        , bgroup' "nameAliasesByType"
+            [ Bench "CString"
+                (\c -> (`NameAliases.nameAliasesByType` c) <$> [minBound..maxBound])
+            , Bench "String"
+                (\c -> (`Names.nameAliasesByType` c) <$> [minBound..maxBound])
+            ]
+        , bgroup' "nameAliasesWithTypes"
+            [ Bench "CString" (show . NameAliases.nameAliasesWithTypes)
+            , Bench "String"  (show . Names.nameAliasesWithTypes)
+            ]
+        ]
+    ]
+  where
+    bgroup' groupTitle bs = bgroup groupTitle
+        [ benchNF' groupTitle title f
+        | Bench title f <- bs
+        ]
+
+    -- [NOTE] Works if groupTitle uniquely identifies the benchmark group.
+    benchNF' groupTitle title = case title of
+        "CString" -> benchNF title
+        _         ->
+            bcompare ("$NF == \"CString\" && $(NF-1) == \"" ++ groupTitle ++ "\"")
+          . benchNF title
+
+    benchNF :: forall a. (NFData a) => String -> (Char -> a) -> Benchmark
+    benchNF t f = bench t $ nf (fold_ f) (minBound, maxBound)
+
+    fold_ :: forall a. (NFData a) => (Char -> a) -> (Char, Char) -> ()
+    fold_ f = foldr (deepseq . f) () . range
diff --git a/lib/Unicode/Char/General/Names.hs b/lib/Unicode/Char/General/Names.hs
new file mode 100644
--- /dev/null
+++ b/lib/Unicode/Char/General/Names.hs
@@ -0,0 +1,90 @@
+-- |
+-- Module      : Unicode.Char.General.Names
+-- Copyright   : (c) 2022 Composewell Technologies and Contributors
+-- License     : Apache-2.0
+-- Maintainer  : streamly@composewell.com
+-- Stability   : experimental
+--
+-- Unicode character names and name aliases.
+-- See Unicode standard 14.0.0, section 4.8.
+--
+-- @since 0.1.0
+
+module Unicode.Char.General.Names
+    ( -- * Name
+      name
+    , nameOrAlias
+    , correctedName
+      -- * Name Aliases
+    , NameAliases.NameAliasType(..)
+    , nameAliases
+    , nameAliasesByType
+    , nameAliasesWithTypes
+    ) where
+
+import Control.Applicative ((<|>))
+import Data.Maybe (listToMaybe)
+import Foreign.C.String (CString, peekCAString)
+import System.IO.Unsafe (unsafePerformIO)
+
+import qualified Unicode.Internal.Char.UnicodeData.DerivedName as DerivedName
+import qualified Unicode.Internal.Char.UnicodeData.NameAliases as NameAliases
+
+-- | Name of a character, if defined.
+--
+-- @since 0.1.0
+{-# INLINE name #-}
+name :: Char -> Maybe String
+name = fmap unpack . DerivedName.name
+
+-- | Returns /corrected/ name of a character (see 'NameAliases.Correction'),
+-- if defined, otherwise returns its original 'name' if defined.
+--
+-- @since 0.1.0
+{-# INLINE correctedName #-}
+correctedName :: Char -> Maybe String
+correctedName c =
+    listToMaybe (nameAliasesByType NameAliases.Correction c) <|> name c
+
+-- | Returns a character’s 'name' if defined,
+-- otherwise returns its first name alias if defined.
+--
+-- @since 0.1.0
+nameOrAlias :: Char -> Maybe String
+nameOrAlias c = name c <|> case NameAliases.nameAliasesWithTypes c of
+    (_, n:_):_ -> Just (unpack n)
+    _          -> Nothing
+
+-- | All name aliases of a character, if defined.
+-- The names are listed in the original order of the UCD.
+--
+-- See 'nameAliasesWithTypes' for the detailed list by alias type.
+--
+-- @since 0.1.0
+{-# INLINE nameAliases #-}
+nameAliases :: Char -> [String]
+nameAliases = fmap unpack . NameAliases.nameAliases
+
+-- | Name aliases of a character for a specific name alias type.
+--
+-- @since 0.1.0
+{-# INLINE nameAliasesByType #-}
+nameAliasesByType :: NameAliases.NameAliasType -> Char -> [String]
+nameAliasesByType t = fmap unpack . NameAliases.nameAliasesByType t
+
+-- | Detailed character names aliases.
+-- The names are listed in the original order of the UCD.
+--
+-- See 'nameAliases' if the alias type is not required.
+--
+-- @since 0.1.0
+{-# INLINE nameAliasesWithTypes #-}
+nameAliasesWithTypes :: Char -> [(NameAliases.NameAliasType, [String])]
+nameAliasesWithTypes
+  = fmap (fmap (fmap unpack))
+  . NameAliases.nameAliasesWithTypes
+
+-- Note: names are ASCII. See Unicode Standard 14.0.0, section 4.8.
+{-# INLINE unpack #-}
+unpack :: CString -> String
+unpack = unsafePerformIO . peekCAString
diff --git a/lib/Unicode/Internal/Char/UnicodeData/DerivedName.hs b/lib/Unicode/Internal/Char/UnicodeData/DerivedName.hs
new file mode 100644
# file too large to diff: lib/Unicode/Internal/Char/UnicodeData/DerivedName.hs
diff --git a/lib/Unicode/Internal/Char/UnicodeData/NameAliases.hs b/lib/Unicode/Internal/Char/UnicodeData/NameAliases.hs
new file mode 100644
--- /dev/null
+++ b/lib/Unicode/Internal/Char/UnicodeData/NameAliases.hs
@@ -0,0 +1,443 @@
+-- autogenerated from https://www.unicode.org/Public/14.0.0/ucd/NameAliases.txt
+-- |
+-- Module      : Unicode.Internal.Char.UnicodeData.NameAliases
+-- Copyright   : (c) 2022 Composewell Technologies and Contributors
+-- License     : Apache-2.0
+-- Maintainer  : streamly@composewell.com
+-- Stability   : experimental
+
+{-# OPTIONS_HADDOCK hide #-}
+
+module Unicode.Internal.Char.UnicodeData.NameAliases
+(NameAliasType(..), nameAliases, nameAliasesByType, nameAliasesWithTypes)
+where
+
+import Data.Ix (Ix)
+import Data.Maybe (fromMaybe)
+import Foreign.C.String (CString)
+import GHC.Exts (Ptr(..))
+
+-- | Type of name alias. See Unicode Standard 14.0.0, section 4.8.
+--
+-- @since 0.1.0
+data NameAliasType
+    = Correction
+    -- ^ Corrections for serious problems in the character names.
+    | Control
+    -- ^ ISO&#xa0;6429 names for @C0@ and @C1@ control functions, and other
+    --   commonly occurring names for control codes.
+    | Alternate
+    -- ^ A few widely used alternate names for format characters.
+    | Figment
+    -- ^ Several documented labels for @C1@ control code points which
+    --   were never actually approved in any standard.
+    | Abbreviation
+    -- ^ Commonly occurring abbreviations (or acronyms) for control codes,
+    --   format characters, spaces, and variation selectors.
+    deriving (Enum, Bounded, Eq, Ord, Ix, Show)
+
+-- | All name aliases of a character.
+-- The names are listed in the original order of the UCD.
+--
+-- See 'nameAliasesWithTypes' for the detailed list by alias type.
+--
+-- @since 0.1.0
+{-# INLINE nameAliases #-}
+nameAliases :: Char -> [CString]
+nameAliases = mconcat . fmap snd . nameAliasesWithTypes
+
+-- | Name aliases of a character for a specific name alias type.
+--
+-- @since 0.1.0
+{-# INLINE nameAliasesByType #-}
+nameAliasesByType :: NameAliasType -> Char -> [CString]
+nameAliasesByType t = fromMaybe mempty . lookup t . nameAliasesWithTypes
+
+-- | Detailed character names aliases.
+-- The names are listed in the original order of the UCD.
+--
+-- See 'nameAliases' if the alias type is not required.
+--
+-- @since 0.1.0
+nameAliasesWithTypes :: Char -> [(NameAliasType, [CString])]
+nameAliasesWithTypes = \case
+  '\x0000' -> [(Control,[Ptr "NULL\0"#]),(Abbreviation,[Ptr "NUL\0"#])]
+  '\x0001' -> [(Control,[Ptr "START OF HEADING\0"#]),(Abbreviation,[Ptr "SOH\0"#])]
+  '\x0002' -> [(Control,[Ptr "START OF TEXT\0"#]),(Abbreviation,[Ptr "STX\0"#])]
+  '\x0003' -> [(Control,[Ptr "END OF TEXT\0"#]),(Abbreviation,[Ptr "ETX\0"#])]
+  '\x0004' -> [(Control,[Ptr "END OF TRANSMISSION\0"#]),(Abbreviation,[Ptr "EOT\0"#])]
+  '\x0005' -> [(Control,[Ptr "ENQUIRY\0"#]),(Abbreviation,[Ptr "ENQ\0"#])]
+  '\x0006' -> [(Control,[Ptr "ACKNOWLEDGE\0"#]),(Abbreviation,[Ptr "ACK\0"#])]
+  '\x0007' -> [(Control,[Ptr "ALERT\0"#]),(Abbreviation,[Ptr "BEL\0"#])]
+  '\x0008' -> [(Control,[Ptr "BACKSPACE\0"#]),(Abbreviation,[Ptr "BS\0"#])]
+  '\x0009' -> [(Control,[Ptr "CHARACTER TABULATION\0"#,Ptr "HORIZONTAL TABULATION\0"#]),(Abbreviation,[Ptr "HT\0"#,Ptr "TAB\0"#])]
+  '\x000a' -> [(Control,[Ptr "LINE FEED\0"#,Ptr "NEW LINE\0"#,Ptr "END OF LINE\0"#]),(Abbreviation,[Ptr "LF\0"#,Ptr "NL\0"#,Ptr "EOL\0"#])]
+  '\x000b' -> [(Control,[Ptr "LINE TABULATION\0"#,Ptr "VERTICAL TABULATION\0"#]),(Abbreviation,[Ptr "VT\0"#])]
+  '\x000c' -> [(Control,[Ptr "FORM FEED\0"#]),(Abbreviation,[Ptr "FF\0"#])]
+  '\x000d' -> [(Control,[Ptr "CARRIAGE RETURN\0"#]),(Abbreviation,[Ptr "CR\0"#])]
+  '\x000e' -> [(Control,[Ptr "SHIFT OUT\0"#,Ptr "LOCKING-SHIFT ONE\0"#]),(Abbreviation,[Ptr "SO\0"#])]
+  '\x000f' -> [(Control,[Ptr "SHIFT IN\0"#,Ptr "LOCKING-SHIFT ZERO\0"#]),(Abbreviation,[Ptr "SI\0"#])]
+  '\x0010' -> [(Control,[Ptr "DATA LINK ESCAPE\0"#]),(Abbreviation,[Ptr "DLE\0"#])]
+  '\x0011' -> [(Control,[Ptr "DEVICE CONTROL ONE\0"#]),(Abbreviation,[Ptr "DC1\0"#])]
+  '\x0012' -> [(Control,[Ptr "DEVICE CONTROL TWO\0"#]),(Abbreviation,[Ptr "DC2\0"#])]
+  '\x0013' -> [(Control,[Ptr "DEVICE CONTROL THREE\0"#]),(Abbreviation,[Ptr "DC3\0"#])]
+  '\x0014' -> [(Control,[Ptr "DEVICE CONTROL FOUR\0"#]),(Abbreviation,[Ptr "DC4\0"#])]
+  '\x0015' -> [(Control,[Ptr "NEGATIVE ACKNOWLEDGE\0"#]),(Abbreviation,[Ptr "NAK\0"#])]
+  '\x0016' -> [(Control,[Ptr "SYNCHRONOUS IDLE\0"#]),(Abbreviation,[Ptr "SYN\0"#])]
+  '\x0017' -> [(Control,[Ptr "END OF TRANSMISSION BLOCK\0"#]),(Abbreviation,[Ptr "ETB\0"#])]
+  '\x0018' -> [(Control,[Ptr "CANCEL\0"#]),(Abbreviation,[Ptr "CAN\0"#])]
+  '\x0019' -> [(Control,[Ptr "END OF MEDIUM\0"#]),(Abbreviation,[Ptr "EOM\0"#])]
+  '\x001a' -> [(Control,[Ptr "SUBSTITUTE\0"#]),(Abbreviation,[Ptr "SUB\0"#])]
+  '\x001b' -> [(Control,[Ptr "ESCAPE\0"#]),(Abbreviation,[Ptr "ESC\0"#])]
+  '\x001c' -> [(Control,[Ptr "INFORMATION SEPARATOR FOUR\0"#,Ptr "FILE SEPARATOR\0"#]),(Abbreviation,[Ptr "FS\0"#])]
+  '\x001d' -> [(Control,[Ptr "INFORMATION SEPARATOR THREE\0"#,Ptr "GROUP SEPARATOR\0"#]),(Abbreviation,[Ptr "GS\0"#])]
+  '\x001e' -> [(Control,[Ptr "INFORMATION SEPARATOR TWO\0"#,Ptr "RECORD SEPARATOR\0"#]),(Abbreviation,[Ptr "RS\0"#])]
+  '\x001f' -> [(Control,[Ptr "INFORMATION SEPARATOR ONE\0"#,Ptr "UNIT SEPARATOR\0"#]),(Abbreviation,[Ptr "US\0"#])]
+  '\x0020' -> [(Abbreviation,[Ptr "SP\0"#])]
+  '\x007f' -> [(Control,[Ptr "DELETE\0"#]),(Abbreviation,[Ptr "DEL\0"#])]
+  '\x0080' -> [(Figment,[Ptr "PADDING CHARACTER\0"#]),(Abbreviation,[Ptr "PAD\0"#])]
+  '\x0081' -> [(Figment,[Ptr "HIGH OCTET PRESET\0"#]),(Abbreviation,[Ptr "HOP\0"#])]
+  '\x0082' -> [(Control,[Ptr "BREAK PERMITTED HERE\0"#]),(Abbreviation,[Ptr "BPH\0"#])]
+  '\x0083' -> [(Control,[Ptr "NO BREAK HERE\0"#]),(Abbreviation,[Ptr "NBH\0"#])]
+  '\x0084' -> [(Control,[Ptr "INDEX\0"#]),(Abbreviation,[Ptr "IND\0"#])]
+  '\x0085' -> [(Control,[Ptr "NEXT LINE\0"#]),(Abbreviation,[Ptr "NEL\0"#])]
+  '\x0086' -> [(Control,[Ptr "START OF SELECTED AREA\0"#]),(Abbreviation,[Ptr "SSA\0"#])]
+  '\x0087' -> [(Control,[Ptr "END OF SELECTED AREA\0"#]),(Abbreviation,[Ptr "ESA\0"#])]
+  '\x0088' -> [(Control,[Ptr "CHARACTER TABULATION SET\0"#,Ptr "HORIZONTAL TABULATION SET\0"#]),(Abbreviation,[Ptr "HTS\0"#])]
+  '\x0089' -> [(Control,[Ptr "CHARACTER TABULATION WITH JUSTIFICATION\0"#,Ptr "HORIZONTAL TABULATION WITH JUSTIFICATION\0"#]),(Abbreviation,[Ptr "HTJ\0"#])]
+  '\x008a' -> [(Control,[Ptr "LINE TABULATION SET\0"#,Ptr "VERTICAL TABULATION SET\0"#]),(Abbreviation,[Ptr "VTS\0"#])]
+  '\x008b' -> [(Control,[Ptr "PARTIAL LINE FORWARD\0"#,Ptr "PARTIAL LINE DOWN\0"#]),(Abbreviation,[Ptr "PLD\0"#])]
+  '\x008c' -> [(Control,[Ptr "PARTIAL LINE BACKWARD\0"#,Ptr "PARTIAL LINE UP\0"#]),(Abbreviation,[Ptr "PLU\0"#])]
+  '\x008d' -> [(Control,[Ptr "REVERSE LINE FEED\0"#,Ptr "REVERSE INDEX\0"#]),(Abbreviation,[Ptr "RI\0"#])]
+  '\x008e' -> [(Control,[Ptr "SINGLE SHIFT TWO\0"#,Ptr "SINGLE-SHIFT-2\0"#]),(Abbreviation,[Ptr "SS2\0"#])]
+  '\x008f' -> [(Control,[Ptr "SINGLE SHIFT THREE\0"#,Ptr "SINGLE-SHIFT-3\0"#]),(Abbreviation,[Ptr "SS3\0"#])]
+  '\x0090' -> [(Control,[Ptr "DEVICE CONTROL STRING\0"#]),(Abbreviation,[Ptr "DCS\0"#])]
+  '\x0091' -> [(Control,[Ptr "PRIVATE USE ONE\0"#,Ptr "PRIVATE USE-1\0"#]),(Abbreviation,[Ptr "PU1\0"#])]
+  '\x0092' -> [(Control,[Ptr "PRIVATE USE TWO\0"#,Ptr "PRIVATE USE-2\0"#]),(Abbreviation,[Ptr "PU2\0"#])]
+  '\x0093' -> [(Control,[Ptr "SET TRANSMIT STATE\0"#]),(Abbreviation,[Ptr "STS\0"#])]
+  '\x0094' -> [(Control,[Ptr "CANCEL CHARACTER\0"#]),(Abbreviation,[Ptr "CCH\0"#])]
+  '\x0095' -> [(Control,[Ptr "MESSAGE WAITING\0"#]),(Abbreviation,[Ptr "MW\0"#])]
+  '\x0096' -> [(Control,[Ptr "START OF GUARDED AREA\0"#,Ptr "START OF PROTECTED AREA\0"#]),(Abbreviation,[Ptr "SPA\0"#])]
+  '\x0097' -> [(Control,[Ptr "END OF GUARDED AREA\0"#,Ptr "END OF PROTECTED AREA\0"#]),(Abbreviation,[Ptr "EPA\0"#])]
+  '\x0098' -> [(Control,[Ptr "START OF STRING\0"#]),(Abbreviation,[Ptr "SOS\0"#])]
+  '\x0099' -> [(Figment,[Ptr "SINGLE GRAPHIC CHARACTER INTRODUCER\0"#]),(Abbreviation,[Ptr "SGC\0"#])]
+  '\x009a' -> [(Control,[Ptr "SINGLE CHARACTER INTRODUCER\0"#]),(Abbreviation,[Ptr "SCI\0"#])]
+  '\x009b' -> [(Control,[Ptr "CONTROL SEQUENCE INTRODUCER\0"#]),(Abbreviation,[Ptr "CSI\0"#])]
+  '\x009c' -> [(Control,[Ptr "STRING TERMINATOR\0"#]),(Abbreviation,[Ptr "ST\0"#])]
+  '\x009d' -> [(Control,[Ptr "OPERATING SYSTEM COMMAND\0"#]),(Abbreviation,[Ptr "OSC\0"#])]
+  '\x009e' -> [(Control,[Ptr "PRIVACY MESSAGE\0"#]),(Abbreviation,[Ptr "PM\0"#])]
+  '\x009f' -> [(Control,[Ptr "APPLICATION PROGRAM COMMAND\0"#]),(Abbreviation,[Ptr "APC\0"#])]
+  '\x00a0' -> [(Abbreviation,[Ptr "NBSP\0"#])]
+  '\x00ad' -> [(Abbreviation,[Ptr "SHY\0"#])]
+  '\x01a2' -> [(Correction,[Ptr "LATIN CAPITAL LETTER GHA\0"#])]
+  '\x01a3' -> [(Correction,[Ptr "LATIN SMALL LETTER GHA\0"#])]
+  '\x034f' -> [(Abbreviation,[Ptr "CGJ\0"#])]
+  '\x061c' -> [(Abbreviation,[Ptr "ALM\0"#])]
+  '\x0709' -> [(Correction,[Ptr "SYRIAC SUBLINEAR COLON SKEWED LEFT\0"#])]
+  '\x0cde' -> [(Correction,[Ptr "KANNADA LETTER LLLA\0"#])]
+  '\x0e9d' -> [(Correction,[Ptr "LAO LETTER FO FON\0"#])]
+  '\x0e9f' -> [(Correction,[Ptr "LAO LETTER FO FAY\0"#])]
+  '\x0ea3' -> [(Correction,[Ptr "LAO LETTER RO\0"#])]
+  '\x0ea5' -> [(Correction,[Ptr "LAO LETTER LO\0"#])]
+  '\x0fd0' -> [(Correction,[Ptr "TIBETAN MARK BKA- SHOG GI MGO RGYAN\0"#])]
+  '\x11ec' -> [(Correction,[Ptr "HANGUL JONGSEONG YESIEUNG-KIYEOK\0"#])]
+  '\x11ed' -> [(Correction,[Ptr "HANGUL JONGSEONG YESIEUNG-SSANGKIYEOK\0"#])]
+  '\x11ee' -> [(Correction,[Ptr "HANGUL JONGSEONG SSANGYESIEUNG\0"#])]
+  '\x11ef' -> [(Correction,[Ptr "HANGUL JONGSEONG YESIEUNG-KHIEUKH\0"#])]
+  '\x180b' -> [(Abbreviation,[Ptr "FVS1\0"#])]
+  '\x180c' -> [(Abbreviation,[Ptr "FVS2\0"#])]
+  '\x180d' -> [(Abbreviation,[Ptr "FVS3\0"#])]
+  '\x180e' -> [(Abbreviation,[Ptr "MVS\0"#])]
+  '\x180f' -> [(Abbreviation,[Ptr "FVS4\0"#])]
+  '\x200b' -> [(Abbreviation,[Ptr "ZWSP\0"#])]
+  '\x200c' -> [(Abbreviation,[Ptr "ZWNJ\0"#])]
+  '\x200d' -> [(Abbreviation,[Ptr "ZWJ\0"#])]
+  '\x200e' -> [(Abbreviation,[Ptr "LRM\0"#])]
+  '\x200f' -> [(Abbreviation,[Ptr "RLM\0"#])]
+  '\x202a' -> [(Abbreviation,[Ptr "LRE\0"#])]
+  '\x202b' -> [(Abbreviation,[Ptr "RLE\0"#])]
+  '\x202c' -> [(Abbreviation,[Ptr "PDF\0"#])]
+  '\x202d' -> [(Abbreviation,[Ptr "LRO\0"#])]
+  '\x202e' -> [(Abbreviation,[Ptr "RLO\0"#])]
+  '\x202f' -> [(Abbreviation,[Ptr "NNBSP\0"#])]
+  '\x205f' -> [(Abbreviation,[Ptr "MMSP\0"#])]
+  '\x2060' -> [(Abbreviation,[Ptr "WJ\0"#])]
+  '\x2066' -> [(Abbreviation,[Ptr "LRI\0"#])]
+  '\x2067' -> [(Abbreviation,[Ptr "RLI\0"#])]
+  '\x2068' -> [(Abbreviation,[Ptr "FSI\0"#])]
+  '\x2069' -> [(Abbreviation,[Ptr "PDI\0"#])]
+  '\x2118' -> [(Correction,[Ptr "WEIERSTRASS ELLIPTIC FUNCTION\0"#])]
+  '\x2448' -> [(Correction,[Ptr "MICR ON US SYMBOL\0"#])]
+  '\x2449' -> [(Correction,[Ptr "MICR DASH SYMBOL\0"#])]
+  '\x2b7a' -> [(Correction,[Ptr "LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE\0"#])]
+  '\x2b7c' -> [(Correction,[Ptr "RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE\0"#])]
+  '\xa015' -> [(Correction,[Ptr "YI SYLLABLE ITERATION MARK\0"#])]
+  '\xaa6e' -> [(Correction,[Ptr "MYANMAR LETTER KHAMTI LLA\0"#])]
+  '\xfe00' -> [(Abbreviation,[Ptr "VS1\0"#])]
+  '\xfe01' -> [(Abbreviation,[Ptr "VS2\0"#])]
+  '\xfe02' -> [(Abbreviation,[Ptr "VS3\0"#])]
+  '\xfe03' -> [(Abbreviation,[Ptr "VS4\0"#])]
+  '\xfe04' -> [(Abbreviation,[Ptr "VS5\0"#])]
+  '\xfe05' -> [(Abbreviation,[Ptr "VS6\0"#])]
+  '\xfe06' -> [(Abbreviation,[Ptr "VS7\0"#])]
+  '\xfe07' -> [(Abbreviation,[Ptr "VS8\0"#])]
+  '\xfe08' -> [(Abbreviation,[Ptr "VS9\0"#])]
+  '\xfe09' -> [(Abbreviation,[Ptr "VS10\0"#])]
+  '\xfe0a' -> [(Abbreviation,[Ptr "VS11\0"#])]
+  '\xfe0b' -> [(Abbreviation,[Ptr "VS12\0"#])]
+  '\xfe0c' -> [(Abbreviation,[Ptr "VS13\0"#])]
+  '\xfe0d' -> [(Abbreviation,[Ptr "VS14\0"#])]
+  '\xfe0e' -> [(Abbreviation,[Ptr "VS15\0"#])]
+  '\xfe0f' -> [(Abbreviation,[Ptr "VS16\0"#])]
+  '\xfe18' -> [(Correction,[Ptr "PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET\0"#])]
+  '\xfeff' -> [(Alternate,[Ptr "BYTE ORDER MARK\0"#]),(Abbreviation,[Ptr "BOM\0"#,Ptr "ZWNBSP\0"#])]
+  '\x122d4' -> [(Correction,[Ptr "CUNEIFORM SIGN NU11 TENU\0"#])]
+  '\x122d5' -> [(Correction,[Ptr "CUNEIFORM SIGN NU11 OVER NU11 BUR OVER BUR\0"#])]
+  '\x16e56' -> [(Correction,[Ptr "MEDEFAIDRIN CAPITAL LETTER H\0"#])]
+  '\x16e57' -> [(Correction,[Ptr "MEDEFAIDRIN CAPITAL LETTER NG\0"#])]
+  '\x16e76' -> [(Correction,[Ptr "MEDEFAIDRIN SMALL LETTER H\0"#])]
+  '\x16e77' -> [(Correction,[Ptr "MEDEFAIDRIN SMALL LETTER NG\0"#])]
+  '\x1b001' -> [(Correction,[Ptr "HENTAIGANA LETTER E-1\0"#])]
+  '\x1d0c5' -> [(Correction,[Ptr "BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS\0"#])]
+  '\xe0100' -> [(Abbreviation,[Ptr "VS17\0"#])]
+  '\xe0101' -> [(Abbreviation,[Ptr "VS18\0"#])]
+  '\xe0102' -> [(Abbreviation,[Ptr "VS19\0"#])]
+  '\xe0103' -> [(Abbreviation,[Ptr "VS20\0"#])]
+  '\xe0104' -> [(Abbreviation,[Ptr "VS21\0"#])]
+  '\xe0105' -> [(Abbreviation,[Ptr "VS22\0"#])]
+  '\xe0106' -> [(Abbreviation,[Ptr "VS23\0"#])]
+  '\xe0107' -> [(Abbreviation,[Ptr "VS24\0"#])]
+  '\xe0108' -> [(Abbreviation,[Ptr "VS25\0"#])]
+  '\xe0109' -> [(Abbreviation,[Ptr "VS26\0"#])]
+  '\xe010a' -> [(Abbreviation,[Ptr "VS27\0"#])]
+  '\xe010b' -> [(Abbreviation,[Ptr "VS28\0"#])]
+  '\xe010c' -> [(Abbreviation,[Ptr "VS29\0"#])]
+  '\xe010d' -> [(Abbreviation,[Ptr "VS30\0"#])]
+  '\xe010e' -> [(Abbreviation,[Ptr "VS31\0"#])]
+  '\xe010f' -> [(Abbreviation,[Ptr "VS32\0"#])]
+  '\xe0110' -> [(Abbreviation,[Ptr "VS33\0"#])]
+  '\xe0111' -> [(Abbreviation,[Ptr "VS34\0"#])]
+  '\xe0112' -> [(Abbreviation,[Ptr "VS35\0"#])]
+  '\xe0113' -> [(Abbreviation,[Ptr "VS36\0"#])]
+  '\xe0114' -> [(Abbreviation,[Ptr "VS37\0"#])]
+  '\xe0115' -> [(Abbreviation,[Ptr "VS38\0"#])]
+  '\xe0116' -> [(Abbreviation,[Ptr "VS39\0"#])]
+  '\xe0117' -> [(Abbreviation,[Ptr "VS40\0"#])]
+  '\xe0118' -> [(Abbreviation,[Ptr "VS41\0"#])]
+  '\xe0119' -> [(Abbreviation,[Ptr "VS42\0"#])]
+  '\xe011a' -> [(Abbreviation,[Ptr "VS43\0"#])]
+  '\xe011b' -> [(Abbreviation,[Ptr "VS44\0"#])]
+  '\xe011c' -> [(Abbreviation,[Ptr "VS45\0"#])]
+  '\xe011d' -> [(Abbreviation,[Ptr "VS46\0"#])]
+  '\xe011e' -> [(Abbreviation,[Ptr "VS47\0"#])]
+  '\xe011f' -> [(Abbreviation,[Ptr "VS48\0"#])]
+  '\xe0120' -> [(Abbreviation,[Ptr "VS49\0"#])]
+  '\xe0121' -> [(Abbreviation,[Ptr "VS50\0"#])]
+  '\xe0122' -> [(Abbreviation,[Ptr "VS51\0"#])]
+  '\xe0123' -> [(Abbreviation,[Ptr "VS52\0"#])]
+  '\xe0124' -> [(Abbreviation,[Ptr "VS53\0"#])]
+  '\xe0125' -> [(Abbreviation,[Ptr "VS54\0"#])]
+  '\xe0126' -> [(Abbreviation,[Ptr "VS55\0"#])]
+  '\xe0127' -> [(Abbreviation,[Ptr "VS56\0"#])]
+  '\xe0128' -> [(Abbreviation,[Ptr "VS57\0"#])]
+  '\xe0129' -> [(Abbreviation,[Ptr "VS58\0"#])]
+  '\xe012a' -> [(Abbreviation,[Ptr "VS59\0"#])]
+  '\xe012b' -> [(Abbreviation,[Ptr "VS60\0"#])]
+  '\xe012c' -> [(Abbreviation,[Ptr "VS61\0"#])]
+  '\xe012d' -> [(Abbreviation,[Ptr "VS62\0"#])]
+  '\xe012e' -> [(Abbreviation,[Ptr "VS63\0"#])]
+  '\xe012f' -> [(Abbreviation,[Ptr "VS64\0"#])]
+  '\xe0130' -> [(Abbreviation,[Ptr "VS65\0"#])]
+  '\xe0131' -> [(Abbreviation,[Ptr "VS66\0"#])]
+  '\xe0132' -> [(Abbreviation,[Ptr "VS67\0"#])]
+  '\xe0133' -> [(Abbreviation,[Ptr "VS68\0"#])]
+  '\xe0134' -> [(Abbreviation,[Ptr "VS69\0"#])]
+  '\xe0135' -> [(Abbreviation,[Ptr "VS70\0"#])]
+  '\xe0136' -> [(Abbreviation,[Ptr "VS71\0"#])]
+  '\xe0137' -> [(Abbreviation,[Ptr "VS72\0"#])]
+  '\xe0138' -> [(Abbreviation,[Ptr "VS73\0"#])]
+  '\xe0139' -> [(Abbreviation,[Ptr "VS74\0"#])]
+  '\xe013a' -> [(Abbreviation,[Ptr "VS75\0"#])]
+  '\xe013b' -> [(Abbreviation,[Ptr "VS76\0"#])]
+  '\xe013c' -> [(Abbreviation,[Ptr "VS77\0"#])]
+  '\xe013d' -> [(Abbreviation,[Ptr "VS78\0"#])]
+  '\xe013e' -> [(Abbreviation,[Ptr "VS79\0"#])]
+  '\xe013f' -> [(Abbreviation,[Ptr "VS80\0"#])]
+  '\xe0140' -> [(Abbreviation,[Ptr "VS81\0"#])]
+  '\xe0141' -> [(Abbreviation,[Ptr "VS82\0"#])]
+  '\xe0142' -> [(Abbreviation,[Ptr "VS83\0"#])]
+  '\xe0143' -> [(Abbreviation,[Ptr "VS84\0"#])]
+  '\xe0144' -> [(Abbreviation,[Ptr "VS85\0"#])]
+  '\xe0145' -> [(Abbreviation,[Ptr "VS86\0"#])]
+  '\xe0146' -> [(Abbreviation,[Ptr "VS87\0"#])]
+  '\xe0147' -> [(Abbreviation,[Ptr "VS88\0"#])]
+  '\xe0148' -> [(Abbreviation,[Ptr "VS89\0"#])]
+  '\xe0149' -> [(Abbreviation,[Ptr "VS90\0"#])]
+  '\xe014a' -> [(Abbreviation,[Ptr "VS91\0"#])]
+  '\xe014b' -> [(Abbreviation,[Ptr "VS92\0"#])]
+  '\xe014c' -> [(Abbreviation,[Ptr "VS93\0"#])]
+  '\xe014d' -> [(Abbreviation,[Ptr "VS94\0"#])]
+  '\xe014e' -> [(Abbreviation,[Ptr "VS95\0"#])]
+  '\xe014f' -> [(Abbreviation,[Ptr "VS96\0"#])]
+  '\xe0150' -> [(Abbreviation,[Ptr "VS97\0"#])]
+  '\xe0151' -> [(Abbreviation,[Ptr "VS98\0"#])]
+  '\xe0152' -> [(Abbreviation,[Ptr "VS99\0"#])]
+  '\xe0153' -> [(Abbreviation,[Ptr "VS100\0"#])]
+  '\xe0154' -> [(Abbreviation,[Ptr "VS101\0"#])]
+  '\xe0155' -> [(Abbreviation,[Ptr "VS102\0"#])]
+  '\xe0156' -> [(Abbreviation,[Ptr "VS103\0"#])]
+  '\xe0157' -> [(Abbreviation,[Ptr "VS104\0"#])]
+  '\xe0158' -> [(Abbreviation,[Ptr "VS105\0"#])]
+  '\xe0159' -> [(Abbreviation,[Ptr "VS106\0"#])]
+  '\xe015a' -> [(Abbreviation,[Ptr "VS107\0"#])]
+  '\xe015b' -> [(Abbreviation,[Ptr "VS108\0"#])]
+  '\xe015c' -> [(Abbreviation,[Ptr "VS109\0"#])]
+  '\xe015d' -> [(Abbreviation,[Ptr "VS110\0"#])]
+  '\xe015e' -> [(Abbreviation,[Ptr "VS111\0"#])]
+  '\xe015f' -> [(Abbreviation,[Ptr "VS112\0"#])]
+  '\xe0160' -> [(Abbreviation,[Ptr "VS113\0"#])]
+  '\xe0161' -> [(Abbreviation,[Ptr "VS114\0"#])]
+  '\xe0162' -> [(Abbreviation,[Ptr "VS115\0"#])]
+  '\xe0163' -> [(Abbreviation,[Ptr "VS116\0"#])]
+  '\xe0164' -> [(Abbreviation,[Ptr "VS117\0"#])]
+  '\xe0165' -> [(Abbreviation,[Ptr "VS118\0"#])]
+  '\xe0166' -> [(Abbreviation,[Ptr "VS119\0"#])]
+  '\xe0167' -> [(Abbreviation,[Ptr "VS120\0"#])]
+  '\xe0168' -> [(Abbreviation,[Ptr "VS121\0"#])]
+  '\xe0169' -> [(Abbreviation,[Ptr "VS122\0"#])]
+  '\xe016a' -> [(Abbreviation,[Ptr "VS123\0"#])]
+  '\xe016b' -> [(Abbreviation,[Ptr "VS124\0"#])]
+  '\xe016c' -> [(Abbreviation,[Ptr "VS125\0"#])]
+  '\xe016d' -> [(Abbreviation,[Ptr "VS126\0"#])]
+  '\xe016e' -> [(Abbreviation,[Ptr "VS127\0"#])]
+  '\xe016f' -> [(Abbreviation,[Ptr "VS128\0"#])]
+  '\xe0170' -> [(Abbreviation,[Ptr "VS129\0"#])]
+  '\xe0171' -> [(Abbreviation,[Ptr "VS130\0"#])]
+  '\xe0172' -> [(Abbreviation,[Ptr "VS131\0"#])]
+  '\xe0173' -> [(Abbreviation,[Ptr "VS132\0"#])]
+  '\xe0174' -> [(Abbreviation,[Ptr "VS133\0"#])]
+  '\xe0175' -> [(Abbreviation,[Ptr "VS134\0"#])]
+  '\xe0176' -> [(Abbreviation,[Ptr "VS135\0"#])]
+  '\xe0177' -> [(Abbreviation,[Ptr "VS136\0"#])]
+  '\xe0178' -> [(Abbreviation,[Ptr "VS137\0"#])]
+  '\xe0179' -> [(Abbreviation,[Ptr "VS138\0"#])]
+  '\xe017a' -> [(Abbreviation,[Ptr "VS139\0"#])]
+  '\xe017b' -> [(Abbreviation,[Ptr "VS140\0"#])]
+  '\xe017c' -> [(Abbreviation,[Ptr "VS141\0"#])]
+  '\xe017d' -> [(Abbreviation,[Ptr "VS142\0"#])]
+  '\xe017e' -> [(Abbreviation,[Ptr "VS143\0"#])]
+  '\xe017f' -> [(Abbreviation,[Ptr "VS144\0"#])]
+  '\xe0180' -> [(Abbreviation,[Ptr "VS145\0"#])]
+  '\xe0181' -> [(Abbreviation,[Ptr "VS146\0"#])]
+  '\xe0182' -> [(Abbreviation,[Ptr "VS147\0"#])]
+  '\xe0183' -> [(Abbreviation,[Ptr "VS148\0"#])]
+  '\xe0184' -> [(Abbreviation,[Ptr "VS149\0"#])]
+  '\xe0185' -> [(Abbreviation,[Ptr "VS150\0"#])]
+  '\xe0186' -> [(Abbreviation,[Ptr "VS151\0"#])]
+  '\xe0187' -> [(Abbreviation,[Ptr "VS152\0"#])]
+  '\xe0188' -> [(Abbreviation,[Ptr "VS153\0"#])]
+  '\xe0189' -> [(Abbreviation,[Ptr "VS154\0"#])]
+  '\xe018a' -> [(Abbreviation,[Ptr "VS155\0"#])]
+  '\xe018b' -> [(Abbreviation,[Ptr "VS156\0"#])]
+  '\xe018c' -> [(Abbreviation,[Ptr "VS157\0"#])]
+  '\xe018d' -> [(Abbreviation,[Ptr "VS158\0"#])]
+  '\xe018e' -> [(Abbreviation,[Ptr "VS159\0"#])]
+  '\xe018f' -> [(Abbreviation,[Ptr "VS160\0"#])]
+  '\xe0190' -> [(Abbreviation,[Ptr "VS161\0"#])]
+  '\xe0191' -> [(Abbreviation,[Ptr "VS162\0"#])]
+  '\xe0192' -> [(Abbreviation,[Ptr "VS163\0"#])]
+  '\xe0193' -> [(Abbreviation,[Ptr "VS164\0"#])]
+  '\xe0194' -> [(Abbreviation,[Ptr "VS165\0"#])]
+  '\xe0195' -> [(Abbreviation,[Ptr "VS166\0"#])]
+  '\xe0196' -> [(Abbreviation,[Ptr "VS167\0"#])]
+  '\xe0197' -> [(Abbreviation,[Ptr "VS168\0"#])]
+  '\xe0198' -> [(Abbreviation,[Ptr "VS169\0"#])]
+  '\xe0199' -> [(Abbreviation,[Ptr "VS170\0"#])]
+  '\xe019a' -> [(Abbreviation,[Ptr "VS171\0"#])]
+  '\xe019b' -> [(Abbreviation,[Ptr "VS172\0"#])]
+  '\xe019c' -> [(Abbreviation,[Ptr "VS173\0"#])]
+  '\xe019d' -> [(Abbreviation,[Ptr "VS174\0"#])]
+  '\xe019e' -> [(Abbreviation,[Ptr "VS175\0"#])]
+  '\xe019f' -> [(Abbreviation,[Ptr "VS176\0"#])]
+  '\xe01a0' -> [(Abbreviation,[Ptr "VS177\0"#])]
+  '\xe01a1' -> [(Abbreviation,[Ptr "VS178\0"#])]
+  '\xe01a2' -> [(Abbreviation,[Ptr "VS179\0"#])]
+  '\xe01a3' -> [(Abbreviation,[Ptr "VS180\0"#])]
+  '\xe01a4' -> [(Abbreviation,[Ptr "VS181\0"#])]
+  '\xe01a5' -> [(Abbreviation,[Ptr "VS182\0"#])]
+  '\xe01a6' -> [(Abbreviation,[Ptr "VS183\0"#])]
+  '\xe01a7' -> [(Abbreviation,[Ptr "VS184\0"#])]
+  '\xe01a8' -> [(Abbreviation,[Ptr "VS185\0"#])]
+  '\xe01a9' -> [(Abbreviation,[Ptr "VS186\0"#])]
+  '\xe01aa' -> [(Abbreviation,[Ptr "VS187\0"#])]
+  '\xe01ab' -> [(Abbreviation,[Ptr "VS188\0"#])]
+  '\xe01ac' -> [(Abbreviation,[Ptr "VS189\0"#])]
+  '\xe01ad' -> [(Abbreviation,[Ptr "VS190\0"#])]
+  '\xe01ae' -> [(Abbreviation,[Ptr "VS191\0"#])]
+  '\xe01af' -> [(Abbreviation,[Ptr "VS192\0"#])]
+  '\xe01b0' -> [(Abbreviation,[Ptr "VS193\0"#])]
+  '\xe01b1' -> [(Abbreviation,[Ptr "VS194\0"#])]
+  '\xe01b2' -> [(Abbreviation,[Ptr "VS195\0"#])]
+  '\xe01b3' -> [(Abbreviation,[Ptr "VS196\0"#])]
+  '\xe01b4' -> [(Abbreviation,[Ptr "VS197\0"#])]
+  '\xe01b5' -> [(Abbreviation,[Ptr "VS198\0"#])]
+  '\xe01b6' -> [(Abbreviation,[Ptr "VS199\0"#])]
+  '\xe01b7' -> [(Abbreviation,[Ptr "VS200\0"#])]
+  '\xe01b8' -> [(Abbreviation,[Ptr "VS201\0"#])]
+  '\xe01b9' -> [(Abbreviation,[Ptr "VS202\0"#])]
+  '\xe01ba' -> [(Abbreviation,[Ptr "VS203\0"#])]
+  '\xe01bb' -> [(Abbreviation,[Ptr "VS204\0"#])]
+  '\xe01bc' -> [(Abbreviation,[Ptr "VS205\0"#])]
+  '\xe01bd' -> [(Abbreviation,[Ptr "VS206\0"#])]
+  '\xe01be' -> [(Abbreviation,[Ptr "VS207\0"#])]
+  '\xe01bf' -> [(Abbreviation,[Ptr "VS208\0"#])]
+  '\xe01c0' -> [(Abbreviation,[Ptr "VS209\0"#])]
+  '\xe01c1' -> [(Abbreviation,[Ptr "VS210\0"#])]
+  '\xe01c2' -> [(Abbreviation,[Ptr "VS211\0"#])]
+  '\xe01c3' -> [(Abbreviation,[Ptr "VS212\0"#])]
+  '\xe01c4' -> [(Abbreviation,[Ptr "VS213\0"#])]
+  '\xe01c5' -> [(Abbreviation,[Ptr "VS214\0"#])]
+  '\xe01c6' -> [(Abbreviation,[Ptr "VS215\0"#])]
+  '\xe01c7' -> [(Abbreviation,[Ptr "VS216\0"#])]
+  '\xe01c8' -> [(Abbreviation,[Ptr "VS217\0"#])]
+  '\xe01c9' -> [(Abbreviation,[Ptr "VS218\0"#])]
+  '\xe01ca' -> [(Abbreviation,[Ptr "VS219\0"#])]
+  '\xe01cb' -> [(Abbreviation,[Ptr "VS220\0"#])]
+  '\xe01cc' -> [(Abbreviation,[Ptr "VS221\0"#])]
+  '\xe01cd' -> [(Abbreviation,[Ptr "VS222\0"#])]
+  '\xe01ce' -> [(Abbreviation,[Ptr "VS223\0"#])]
+  '\xe01cf' -> [(Abbreviation,[Ptr "VS224\0"#])]
+  '\xe01d0' -> [(Abbreviation,[Ptr "VS225\0"#])]
+  '\xe01d1' -> [(Abbreviation,[Ptr "VS226\0"#])]
+  '\xe01d2' -> [(Abbreviation,[Ptr "VS227\0"#])]
+  '\xe01d3' -> [(Abbreviation,[Ptr "VS228\0"#])]
+  '\xe01d4' -> [(Abbreviation,[Ptr "VS229\0"#])]
+  '\xe01d5' -> [(Abbreviation,[Ptr "VS230\0"#])]
+  '\xe01d6' -> [(Abbreviation,[Ptr "VS231\0"#])]
+  '\xe01d7' -> [(Abbreviation,[Ptr "VS232\0"#])]
+  '\xe01d8' -> [(Abbreviation,[Ptr "VS233\0"#])]
+  '\xe01d9' -> [(Abbreviation,[Ptr "VS234\0"#])]
+  '\xe01da' -> [(Abbreviation,[Ptr "VS235\0"#])]
+  '\xe01db' -> [(Abbreviation,[Ptr "VS236\0"#])]
+  '\xe01dc' -> [(Abbreviation,[Ptr "VS237\0"#])]
+  '\xe01dd' -> [(Abbreviation,[Ptr "VS238\0"#])]
+  '\xe01de' -> [(Abbreviation,[Ptr "VS239\0"#])]
+  '\xe01df' -> [(Abbreviation,[Ptr "VS240\0"#])]
+  '\xe01e0' -> [(Abbreviation,[Ptr "VS241\0"#])]
+  '\xe01e1' -> [(Abbreviation,[Ptr "VS242\0"#])]
+  '\xe01e2' -> [(Abbreviation,[Ptr "VS243\0"#])]
+  '\xe01e3' -> [(Abbreviation,[Ptr "VS244\0"#])]
+  '\xe01e4' -> [(Abbreviation,[Ptr "VS245\0"#])]
+  '\xe01e5' -> [(Abbreviation,[Ptr "VS246\0"#])]
+  '\xe01e6' -> [(Abbreviation,[Ptr "VS247\0"#])]
+  '\xe01e7' -> [(Abbreviation,[Ptr "VS248\0"#])]
+  '\xe01e8' -> [(Abbreviation,[Ptr "VS249\0"#])]
+  '\xe01e9' -> [(Abbreviation,[Ptr "VS250\0"#])]
+  '\xe01ea' -> [(Abbreviation,[Ptr "VS251\0"#])]
+  '\xe01eb' -> [(Abbreviation,[Ptr "VS252\0"#])]
+  '\xe01ec' -> [(Abbreviation,[Ptr "VS253\0"#])]
+  '\xe01ed' -> [(Abbreviation,[Ptr "VS254\0"#])]
+  '\xe01ee' -> [(Abbreviation,[Ptr "VS255\0"#])]
+  '\xe01ef' -> [(Abbreviation,[Ptr "VS256\0"#])]
+
+  _ -> mempty
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,1 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
diff --git a/test/Unicode/Char/General/NamesSpec.hs b/test/Unicode/Char/General/NamesSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Unicode/Char/General/NamesSpec.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE BlockArguments #-}
+
+module Unicode.Char.General.NamesSpec
+  ( spec
+  ) where
+
+import Unicode.Char.General
+import Unicode.Char.General.Names
+import Data.Foldable (traverse_)
+import Test.Hspec
+
+spec :: Spec
+spec = do
+    it "name: Test some characters" do
+        name minBound  `shouldBe` Nothing
+        name 'A'       `shouldBe` Just "LATIN CAPITAL LETTER A"
+        name '\x0080'  `shouldBe` Nothing
+        name '\x009f'  `shouldBe` Nothing
+        -- Name with correction
+        name '\x01A2'  `shouldBe` Just "LATIN CAPITAL LETTER OI"
+        name '\x2200'  `shouldBe` Just "FOR ALL"
+        -- Name generated using pattern (example from UCD file)
+        name '\x4e12'  `shouldBe` Just "CJK UNIFIED IDEOGRAPH-4E12"
+        name '\xfeff'  `shouldBe` Just "ZERO WIDTH NO-BREAK SPACE"
+        name '\xffff'  `shouldBe` Nothing
+        -- Name with correction
+        name '\x1D0C5' `shouldBe` Just "BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS"
+        name '\x1f41d' `shouldBe` Just "HONEYBEE"
+        -- Name generated using pattern (example from UCD file)
+        name '\x2f89f' `shouldBe` Just "CJK COMPATIBILITY IDEOGRAPH-2F89F"
+        -- Last name defined, as of Unicode 14.0.0
+        name '\xe01ef' `shouldBe` Just "VARIATION SELECTOR-256"
+        name maxBound  `shouldBe` Nothing
+    it "correctedName: Test some characters" do
+        correctedName minBound  `shouldBe` Nothing
+        correctedName 'A'       `shouldBe` Just "LATIN CAPITAL LETTER A"
+        correctedName '\x0080'  `shouldBe` Nothing
+        correctedName '\x009f'  `shouldBe` Nothing
+        -- Name with correction
+        correctedName '\x01A2'  `shouldBe` Just "LATIN CAPITAL LETTER GHA"
+        correctedName '\x2200'  `shouldBe` Just "FOR ALL"
+        -- Name generated using pattern (example from UCD file)
+        correctedName '\x4e12'  `shouldBe` Just "CJK UNIFIED IDEOGRAPH-4E12"
+        correctedName '\xfeff'  `shouldBe` Just "ZERO WIDTH NO-BREAK SPACE"
+        correctedName '\xffff'  `shouldBe` Nothing
+        -- Name with correction
+        correctedName '\x1D0C5' `shouldBe` Just "BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS"
+        correctedName '\x1f41d' `shouldBe` Just "HONEYBEE"
+        -- Name generated using pattern (example from UCD file)
+        correctedName '\x2f89f' `shouldBe` Just "CJK COMPATIBILITY IDEOGRAPH-2F89F"
+        -- Last name defined, as of Unicode 14.0.0
+        correctedName '\xe01ef' `shouldBe` Just "VARIATION SELECTOR-256"
+        correctedName maxBound  `shouldBe` Nothing
+    it "nameOrAlias: Test some characters" do
+        nameOrAlias minBound  `shouldBe` Just "NULL"
+        nameOrAlias 'A'       `shouldBe` Just "LATIN CAPITAL LETTER A"
+        nameOrAlias '\x0080'  `shouldBe` Just "PADDING CHARACTER"
+        nameOrAlias '\x009f'  `shouldBe` Just "APPLICATION PROGRAM COMMAND"
+        -- Name with correction
+        nameOrAlias '\x01A2'  `shouldBe` Just "LATIN CAPITAL LETTER OI"
+        nameOrAlias '\x2200'  `shouldBe` Just "FOR ALL"
+        -- Name generated using pattern (example from UCD file)
+        nameOrAlias '\x4e12'  `shouldBe` Just "CJK UNIFIED IDEOGRAPH-4E12"
+        nameOrAlias '\xfeff'  `shouldBe` Just "ZERO WIDTH NO-BREAK SPACE"
+        nameOrAlias '\xffff'  `shouldBe` Nothing
+        -- Name with correction
+        nameOrAlias '\x1D0C5' `shouldBe` Just "BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS"
+        nameOrAlias '\x1f41d' `shouldBe` Just "HONEYBEE"
+        -- Name generated using pattern (example from UCD file)
+        nameOrAlias '\x2f89f' `shouldBe` Just "CJK COMPATIBILITY IDEOGRAPH-2F89F"
+        -- Last name defined, as of Unicode 14.0.0
+        nameOrAlias '\xe01ef' `shouldBe` Just "VARIATION SELECTOR-256"
+        nameOrAlias maxBound  `shouldBe` Nothing
+    it "Every defined character has at least a name or an alias" do
+        let checkName c = case nameOrAlias c of
+                        Just _  -> True
+                        Nothing -> case generalCategory c of
+                            Surrogate   -> True
+                            PrivateUse  -> True
+                            NotAssigned -> True
+                            _           -> False
+        traverse_ (`shouldSatisfy` checkName)
+            [minBound..maxBound]
diff --git a/test/export_all_chars.hs b/test/export_all_chars.hs
new file mode 100644
--- /dev/null
+++ b/test/export_all_chars.hs
@@ -0,0 +1,42 @@
+{-# LANGUAGE BlockArguments #-}
+
+-------------------------------------------------------------------------------
+-- |
+-- Description: Export all characters and their properties to a CSV file.
+--
+-- This is intended to compare Haskell results to other languages.
+-------------------------------------------------------------------------------
+
+module Main where
+
+import Data.Char
+import Data.Foldable
+import Data.Version
+import Unicode.Char (unicodeVersion)
+import Numeric
+
+import qualified Unicode.Char.General.Names as UNames
+
+main :: IO ()
+main = do
+  -- First line is Unicode version
+  putStrLn (showVersion unicodeVersion)
+  -- Second line is CSV header
+  putStrLn header
+  -- Then all the supported characters
+  traverse_ addEntry [minBound..maxBound]
+
+-- | File header
+header :: String
+header = "Char,Name"
+
+-- | Convert a character to its (short) hexadecimal Unicode codepoint.
+mkCodePointHex :: Char -> String
+mkCodePointHex c = showHex (ord c) mempty
+
+-- | Make a CSV entry for a char.
+addEntry :: Char -> IO ()
+addEntry c = do
+  putStr (mkCodePointHex c)
+  putChar ','
+  putStrLn (show (UNames.name c))
diff --git a/unicode-data-names.cabal b/unicode-data-names.cabal
new file mode 100644
--- /dev/null
+++ b/unicode-data-names.cabal
@@ -0,0 +1,130 @@
+cabal-version:       2.2
+name:                unicode-data-names
+version:             0.1.0
+synopsis:            Unicode characters names and aliases
+description:
+  @unicode-data-names@ provides Haskell APIs to access the Unicode
+  character /names and aliases/ from the
+  <https://www.unicode.org/ucd/ Unicode character database> (UCD).
+  .
+  The Haskell data structures are generated programmatically from the UCD.
+  The latest Unicode version supported by this library is
+  @<https://www.unicode.org/versions/Unicode14.0.0/ 14.0.0>@.
+homepage:            http://github.com/composewell/unicode-data
+bug-reports:         https://github.com/composewell/unicode-data/issues
+license:             Apache-2.0
+license-file:        LICENSE
+author:              Composewell Technologies and Contributors
+maintainer:          dev@wismill.eu
+copyright:           2022 Composewell Technologies and Contributors
+category:            Data,Text,Unicode
+stability:           Experimental
+build-type:          Simple
+tested-with:         GHC==8.0.2
+                   , GHC==8.2.2
+                   , GHC==8.4.4
+                   , GHC==8.6.5
+                   , GHC==8.8.4
+                   , GHC==8.10.7
+                   , GHC==9.0.1
+                   , GHC==9.2.1
+
+extra-source-files:
+    Changelog.md
+    README.md
+
+source-repository head
+  type: git
+  location: https://github.com/composewell/unicode-data
+
+flag export-all-chars
+  description: Build the export-all-chars executable
+  manual: True
+  default: False
+
+common default-extensions
+  default-extensions:
+      BangPatterns
+      DeriveGeneric
+      MagicHash
+      RecordWildCards
+      ScopedTypeVariables
+      TupleSections
+      FlexibleContexts
+      LambdaCase
+
+      -- Experimental, may lead to issues
+      DeriveAnyClass
+      TemplateHaskell
+      UnboxedTuples
+
+common compile-options
+  ghc-options: -Wall
+               -fwarn-identities
+               -fwarn-incomplete-record-updates
+               -fwarn-incomplete-uni-patterns
+               -fwarn-tabs
+  default-language: Haskell2010
+
+library
+  import: default-extensions, compile-options
+  default-language: Haskell2010
+  exposed-modules:
+      -- The module structure is derived from
+      -- https://www.unicode.org/reports/tr44/#Property_Index_Table
+      Unicode.Char.General.Names
+
+      -- Generated files
+      -- This module structure is largely based on the UCD file names from which
+      -- the properties are generated.
+      Unicode.Internal.Char.UnicodeData.DerivedName
+      Unicode.Internal.Char.UnicodeData.NameAliases
+
+  hs-source-dirs: lib
+  build-depends:
+      base             >= 4.7   && < 4.17
+
+test-suite test
+  import: default-extensions, compile-options
+  type: exitcode-stdio-1.0
+  main-is: Main.hs
+  hs-source-dirs:
+      test
+  other-modules:
+      Unicode.Char.General.NamesSpec
+  build-depends:
+      base             >= 4.7   && < 4.17
+    , hspec            >= 2.0   && < 2.10
+    , unicode-data
+    , unicode-data-names
+  build-tool-depends:
+      hspec-discover:hspec-discover >= 2.0 && < 2.10
+  default-language: Haskell2010
+
+executable export-all-chars
+  import: default-extensions, compile-options
+  default-language: Haskell2010
+  ghc-options: -O2
+  hs-source-dirs: test
+  main-is: export_all_chars.hs
+  if flag(export-all-chars)
+    buildable: True
+    build-depends:
+        base
+      , unicode-data
+      , unicode-data-names
+  else
+    buildable: False
+
+benchmark bench
+  import: default-extensions, compile-options
+  type: exitcode-stdio-1.0
+  hs-source-dirs: bench
+  main-is: Main.hs
+  build-depends:
+    base        >= 4.7   && < 4.17,
+    deepseq     >= 1.1   && < 1.5,
+    tasty-bench >= 0.2.5 && < 0.4,
+    tasty       >= 1.4.1,
+    unicode-data-names
+  ghc-options: -O2 -fdicts-strict -rtsopts
