我正在寻找一个将Char作为输入并给出该代码点的Unicode名称(::Char->String
)的函数,但在Hoogle上找不到任何结果。我假定没有内建函数(如果有的话,请告诉我),所以我想知道写这个函数和它的反函数的最好方法是什么(::String->Maybe Char
)。来自Char的Unicode名称
我知道你必须阅读UnicodeData.txt或类似的文件,但我不知道最佳/最快的功能是什么。
我正在寻找一个将Char作为输入并给出该代码点的Unicode名称(::Char->String
)的函数,但在Hoogle上找不到任何结果。我假定没有内建函数(如果有的话,请告诉我),所以我想知道写这个函数和它的反函数的最好方法是什么(::String->Maybe Char
)。来自Char的Unicode名称
我知道你必须阅读UnicodeData.txt或类似的文件,但我不知道最佳/最快的功能是什么。
getCharacterName :: Char -> String
首先,感谢@TwanVanLaarhoven谁提供了一个极好的答案。然而,我确实需要一个与getCharacterName
相反的功能。
我最初想要的是一个函数,它会读取文件并且没有硬编码,但我最终意识到这需要不安全的IO操作。
我决定做的是UnicodeData.txt复制到记事本+ +和使用下面的正则表达式替换:
写module UnicodeNames (characterToName,nameToCharacter) where
替换此:^([\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或其他地方。
谢谢,这太棒了!但是,你会如何编写反函数? (':: String - > Maybe Char') – Zaq
@Zaq翻转'theList'中的每个元素:http://hackage.haskell.org/package/unicode-names-3.2.0.0/docs/src/Data-Char -Properties-NamesData.html#getCharacterName并写入一个类似的函数(也许这应该被添加到lib中) –