2013-07-21 16 views
5

Qual è il modo migliore per ottenere una rappresentazione canonica di un nome utente idempotente?Canonicalizzazione dei nomi utente

voglio evitare di avere lo stesso problema come Spotify: http://labs.spotify.com/2013/06/18/creative-usernames/

Sto cercando una buona biblioteca per fare questo in Python. Preferirei non fare quello che ha finito Spotify (eseguire due volte la canonicalizzazione per testare se è idempotente), e importare Twisted nel mio progetto è un po 'eccessivo, esiste una libreria autonoma per questo?

Utilizzare gli indirizzi di posta elettronica preferibilmente quando si tratta di nomi utente? In che modo i principali siti/aziende si occupano di questo?

+0

Avete bisogno di supportare nomi utente non ASCII? Se la risposta è sì, rinunciare e fare ciò che hanno fatto, è un problema non banale. In caso contrario, ''' .join ([c per c in orig_username.lower() se c in string.punctuation + string.ascii_lowercase + string.digits])'. – AdamKG

+0

Sì, ho bisogno di supportare non-ascii. –

+0

Bene, eccoti allora. Per quanto riguarda il modo in cui i principali giocatori lo gestiscono ... presumo che per la maggior parte non lo facciano. Quelli che probabilmente hanno speso tanto su di esso quanto lo hanno fatto spotify. Non conosco alcuna libreria autonoma, ma non sarei sorpreso se uno si aprisse ora, usando l'approccio dall'articolo spotify e semplicemente copiando il codice rilevante da Twisted (è il MIT). – AdamKG

risposta

1

Per prima cosa, leggere l'articolo di Wikipedia su Unicode equivalence. Spiega le avvertenze e quali metodi di normalizzazione ci sono per rappresentare una stringa Unicode nella sua forma canonica.

Quindi è possibile utilizzare il modulo integrato di Python unicodedata per eseguire la normalizzazione della stringa Unicode nel modulo di normalizzazione preferito.

Un esempio di codice:

>>> import unicodedata 
>>> unicodedata.normalize('NFKC', u'ffñⅨffi⁵KaÅéᴮᴵᴳᴮᴵᴿᴰ') 
'ffñIXffi5KaÅéBIGBIRD' 
>>> unicodedata.normalize('NFKC', u'ffñⅨffi⁵KaÅéᴮᴵᴳᴮᴵᴿᴰ').lower() 
'ffñixffi5kaåébigbird' 
0

Per chiunque la lettura di questo pochi mesi dopo:

Il modulo che utilizza Spotify non è poi così difficile da tirare fuori di Twisted senza un sacco di dipendenze (Twisted può essere rimosso completamente con quasi nessuno sforzo, è solo importato per scopi di controllo della versione). zope.interface è l'unica dipendenza rimasta indietro, anche se dovrebbe essere rimossa con un discreto sforzo.

Il cuore di tale modulo è unicodedata.normalize(), quindi se si desidera eseguire l'implementazione personale, è necessario iniziare. Ma come altri hanno già detto, fai attenzione, questa è un'area aperta a facili exploit.

EDIT: ho messo a nudo lo Zope e dipendenze contorte: https://gist.github.com/repole/7548478