2013-07-21 13 views
5

Jaki jest najlepszy sposób uzyskania kanonicznej reprezentacji nazwy użytkownika, która jest idempotent?Kanonizacja nazw użytkowników

chcę uniknąć tego samego problemu jak Spotify: http://labs.spotify.com/2013/06/18/creative-usernames/

szukam dobrej biblioteki to zrobić w Pythonie. Wolałbym nie robić tego, co robił Spotify (dwukrotne przeprowadzenie kanonizacji, aby sprawdzić, czy jest idempotent), a importowanie Twisted do mojego projektu jest odrobinę przesadzone, czy istnieje osobna biblioteka do tego?

Czy zamiast używania nazw użytkowników preferowane byłoby używanie adresów e-mail? Jak radzą sobie z tym duże witryny/firmy?

+0

Czy trzeba obsługiwać nazwy użytkowników spoza ASCII? Jeśli odpowiedź brzmi "tak", poddaj się i rób to, co zrobili, jest to nietrywialny problem. Jeśli nie, to '. '(C dla c w orig_username.lower() jeśli c w string.punctuation + string.ascii_lowercase + string.digits])'. – AdamKG

+0

Tak, potrzebuję wsparcia non-ascii. –

+0

Cóż, proszę. Co do tego, jak radzą sobie z tym główni gracze ... Zakładam, że w większości przypadków tak się nie dzieje. Te, które prawdopodobnie spędzały na nim tyle samo wysiłku, co spotify. Nie znam żadnej samodzielnej biblioteki, ale nie byłbym zaskoczony, gdyby pojawił się teraz, używając podejścia z artykułu spotify i po prostu skopiował odpowiedni kod z zakręconego (to MIT). – AdamKG

Odpowiedz

1

Najpierw należy przeczytać artykuł Wikipedii na temat Unicode equivalence. Wyjaśnia on zastrzeżenia i metody normalizacji, które mają reprezentować ciąg znaków Unicode w jego kanonicznej postaci.

Następnie można użyć wbudowanego modułu Pythona unicodedata do normalizacji ciągu znaków Unicode do preferowanej formy normalizacji.

przykład kodu:

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

Dla każdego, kto czyta to kilka miesięcy później:

Moduł że Spotify wykorzystuje się wcale nie tak trudno wyciągnąć z Twisted bez całą masę zależnościami (Twisted można usunąć całkowicie przy niewielkim wysiłku, jest on importowany tylko w celu sprawdzania wersji). zope.interface to jedyna pozostała zależność, chociaż powinna być możliwa do usunięcia przy odrobinie wysiłku.

Sercem tego modułu jest unicodedata.normalize(), więc jeśli chcesz wdrożyć własną implementację, właśnie tam powinieneś zacząć. Ale jak powiedzieli inni, bądź ostrożny, jest to obszar otwarty na łatwe exploity.

EDIT: rozebrałem się z Zope i skręcone zależności: https://gist.github.com/repole/7548478

Powiązane problemy