2014-07-05 2 views
3

Je cherche une fonction qui prend un Char comme entrée et donne le nom unicode de ce point de code (::Char->String), mais je n'ai trouvé aucun résultat sur Hoogle. Je suppose qu'il n'y a pas de builtin (S'il y a, s'il vous plaît faites le moi savoir) et donc je me demande quelle est la meilleure façon d'écrire cette fonction et son inverse (::String->Maybe Char).Unicode nom de Char

Je sais que vous devriez lire UnicodeData.txt ou un document similaire, mais je ne sais pas quelle serait la meilleure fonction/la plus rapide.

Répondre

4

Le unicode-names package contient la fonction

getCharacterName :: Char -> String 
+0

Merci, c'est génial! Comment écrivez-vous la fonction inverse, cependant? (':: String -> Maybe Char') – Zaq

+0

@Zaq Retourne chaque élément de' theList' ici: http://hackage.haskell.org/package/unicode-names-3.2.0.0/docs/src/Data-Char -Properties-NamesData.html # getCharacterName et écrire une fonction similaire (peut-être cela devrait être ajouté à la lib) –

1

Tout d'abord, grâce à @TwanVanLaarhoven qui ont fourni une excellente réponse. J'ai cependant besoin d'une fonction qui fait l'inverse de getCharacterName.
Ce que je voulais à l'origine était une fonction qui lirait le fichier et ne l'aurait pas codé en dur, mais j'ai finalement réalisé que cela nécessiterait des opérations d'E/S dangereuses.
Ce que j'ai décidé de faire était de copier UnicodeData.txt dans notepad ++ et utiliser les remplacements regex suivants:

écrire module UnicodeNames (characterToName,nameToCharacter) where

pâte UnicodeData.txt

remplacer: ^([\dA-F]+);([^<;>]+).*$|^([\dA-F]+);(?:[^;]*;){9}([^<;>]+).*$

avec ceci: characterToName '\\x$1$3' = "$2$4"

annexe characterToName _ = ""

pâte à nouveau

remplacer ce (nouveau): ^([\dA-F]+);([^<;>]+).*$|^([\dA-F]+);(?:[^;]*;){9}([^<;>]+).*$

avec ceci: nameToCharacter "$2$4" = Just '\\x$1$3'

append nameToCharacter _ = Nothing

remplacer ^.*<.*$ avec rien à supprimer les lignes supplémentaires. Le fichier sera incroyablement long et prendra une éternité à être compilé :-) En plus d'avoir une fonction inverse, cette méthode a l'avantage de fournir plus de noms que le paquetage unicode-names en utilisant aussi les noms unicode 1.0. Les deux fonctions dans ce fichier s'appuient sur la correspondance de modèle pour agir comme un dictionnaire de char à chaîne et vice-versa. Je mettrais ma solution sur PasteBin ou ailleurs si elle n'utilisait pas une tonne de mémoire.

Questions connexes