Имя в Юникоде из символа Char

#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 или где-нибудь еще, если бы оно не занимало кучу памяти.