我正在寻找一个以Char作为输入的函数,并给出该代码点(::Char->String
)的unicode名称,但我无法在Hoogle上找到任何结果。我假设没有内置(如果有,请让我知道),所以我想知道写这个函数及其反函数(::String->Maybe Char
)的最佳方法是什么。
我知道您必须阅读UnicodeData.txt或类似文件,但我不知道最佳/最快的功能是什么。
答案 0 :(得分:4)
getCharacterName :: Char -> String
答案 1 :(得分:1)
首先,感谢@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或其他地方。