2009-10-06 7 views
3

Je crée un service qui pourrait être «international» sur les marchés non anglophones. Je ne veux pas restreindre un nom d'utilisateur à la plage de caractères ASCII, mais je voudrais autoriser un utilisateur à spécifier son nom d'utilisateur "naturel". OK, utilisez UNICODE (et dites UTF-8 comme encodage de mon nom d'utilisateur).Comment autoriser un sous-ensemble de points de code UNICODE dans la validation d'entrée?

Mais! Je ne veux pas que les utilisateurs créent des noms d'utilisateur "non-nom" qui contiennent des points de code "symbole". Par exemple, je ne veux pas autoriser un nom d'utilisateur comme √√√√√√øøøøø.

Existe-t-il une liste de points de code "symbolique" pour UNICODE que je peux vérifier (peut-être avec une regex) pour accepter/rejeter un nom d'utilisateur donné?

Merci!

Répondre

4

Unicode a plusieurs categories, de sorte que vous pouvez facilement exclure des symboles. Comment exactement faire cela dépend de la langue que vous utilisez. Certains frameworks regex ont cette fonctionnalité intégrée, d'autres non.

+0

Ah, je ne savais pas à ce sujet! C'est parfait. Merci. – z8000

+1

Je suppose que pour mes besoins, je vais laisser codepoints dans aucune de ces catégories: [Ll] Lettre \t, Minuscules [Lm] \t Lettre, Modificateur [Lo] Lettre \t, Autres [Lt] \t Lettre, casse de titre [Lu] \t Lettre, majuscule – z8000

+0

Eh bien, par exemple, Perl supporte une pseudo-catégorie pour l'expression régulière appelée * IsWord *, qui est définie comme: Ll + Lu + Lt + Lo + Nd –

0

En Python (par Input validation of free-form Unicode text in Python):

def only_letters(s): 
    """ 
    Returns True if the input text consists of letters and ideographs only, False otherwise. 
    """ 
    for c in s: 
     cat = unicodedata.category(c) 
     # Ll=lowercase, Lu=uppercase, Lo=ideographs 
     if cat not in ('Ll','Lu','Lo'): 
      return False 
    return True 

> only_letters('Bzdrężyło') 
True 
> only_letters('He7lo') # we don't allow digits here 
False 
Questions connexes