2014-07-05 45 views
3

我正在寻找一个将Char作为输入并给出该代码点的Unicode名称(::Char->String)的函数,但在Hoogle上找不到任何结果。我假定没有内建函数(如果有的话,请告诉我),所以我想知道写这个函数和它的反函数的最好方法是什么(::String->Maybe Char)。来自Char的Unicode名称

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

回答

4

unicode-names package包含函数

getCharacterName :: Char -> String 
+0

谢谢,这太棒了!但是,你会如何编写反函数? (':: String - > Maybe Char') – Zaq

+0

@Zaq翻转'theList'中的每个元素:http://hackage.haskell.org/package/unicode-names-3.2.0.0/docs/src/Data-Char -Properties-NamesData.html#getCharacterName并写入一个类似的函数(也许这应该被添加到lib中) –

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或其他地方。