我正在尋找一個將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中) –