#haskell #unicode
#haskell #юникод
Вопрос:
Я ищу функцию, которая принимает символ в качестве входных данных и выдает имя в юникоде этой кодовой точки ( ::Char->String
), но я не смог найти никаких результатов в Hoogle. Я предполагаю, что встроенного компонента нет (если есть, пожалуйста, дайте мне знать), и поэтому мне интересно, каков наилучший способ написать эту функцию и ее инверсию ( ::String->Maybe Char
).
Я знаю, что вам пришлось бы прочитать UnicodeData.txt или аналогичный документ, но я не знаю, какой была бы лучшая / самая быстрая функция.
Ответ №1:
Пакет unicode-names содержит функцию
getCharacterName :: Char -> String
Комментарии:
1. Спасибо, это здорово! Как бы вы написали обратную функцию? (
::String -> Maybe Char
)2. @Zaq Переверните каждый элемент
theList
здесь: hackage.haskell.org/package/unicode-names-3.2.0.0/docs/src /… и напишите аналогичную функцию (возможно, это следует добавить в библиотеку)
Ответ №2:
Прежде всего, спасибо @TwanVanLaarhoven, который предоставил отличный ответ. Однако мне нужна была функция, которая выполняла обратное getCharacterName
.
Изначально я хотел функцию, которая считывала бы файл и не имела бы его жестко запрограммированного кода, но в конце концов я понял, что для этого потребуются небезопасные операции ввода-вывода.
Что я решил сделать, так это скопировать UnicodeData.txt в notepad и используйте следующие замены регулярных выражений:
написать 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-names, за счет использования имен в юникоде 1.0. Две функции в этом файле полагаются на сопоставление с шаблоном, чтобы действовать как словарь от символа к строке и наоборот. Я бы разместил свое решение на PasteBin или где-нибудь еще, если бы оно не занимало кучу памяти.