来自Char的Unicode名称

时间:2014-07-05 15:59:27

标签: haskell unicode

我正在寻找一个以Char作为输入的函数,并给出该代码点(::Char->String)的unicode名称,但我无法在Hoogle上找到任何结果。我假设没有内置(如果有,请让我知道),所以我想知道写这个函数及其反函数(::String->Maybe Char)的最佳方法是什么。

我知道您必须阅读UnicodeData.txt或类似文件,但我不知道最佳/最快的功能是什么。

2 个答案:

答案 0 :(得分:4)

unicode-names package包含函数

getCharacterName :: Char -> String

答案 1 :(得分:1)

首先,感谢@TwanVanLaarhoven提供了一个很好的答案。但我确实需要一个与getCharacterName相反的函数 我最初想要的是一个读取文件而不是硬编码的函数,但我最终意识到这需要不安全的IO操作。
我决定将UnicodeData.txt复制到记事本++并使用以下正则表达式替换:

module UnicodeNames (characterToName,nameToCharacter) where

粘贴UnicodeData.txt

替换为:^([\dA-F]+);([^<;>]+).*$|^([\dA-F]+);(?:[^;]*;){9}([^<;>]+).*$

characterToName '\\x$1$3' = "$2$4"

追加characterToName _ = ""

再次粘贴

替换(再次):^([\dA-F]+);([^<;>]+).*$|^([\dA-F]+);(?:[^;]*;){9}([^<;>]+).*$

nameToCharacter "$2$4" = Just '\\x$1$3'

追加nameToCharacter _ = Nothing

不用替换^.*<.*$来删除额外的行。

该文件将非常长并且需要永远编译:-)除了具有反函数之外,此方法还具有通过使用unicode 1.0名称提供比unicode-names包更多名称的优点。此文件中的两个函数依赖于模式匹配来充当从char到string的字典,反之亦然。如果它没有使用大量内存,我会把我的解决方案放在PasteBin或其他地方。