2013-07-21 28 views
5

Cách tốt nhất để có được một đại diện kinh điển của một tên người dùng đó là idempotent là gì?Canonicalisation của tên người dùng

Tôi muốn tránh gặp vấn đề tương tự như Spotify: http://labs.spotify.com/2013/06/18/creative-usernames/

Tôi đang tìm kiếm một thư viện tốt để làm điều này trong Python. Tôi không muốn làm những gì Spotify đã làm (chạy canonicalisation hai lần để kiểm tra nếu nó là idempotent), và nhập khẩu Twisted vào dự án của tôi là một tad overkill, là có một thư viện độc lập cho điều này?

Thay vào đó, việc sử dụng địa chỉ email có được ưu tiên khi nói đến tên người dùng không? Làm thế nào để các trang web/công ty lớn đối phó với điều này?

+0

Bạn có cần hỗ trợ tên người dùng không phải ascii không? Nếu câu trả lời là có, hãy từ bỏ và làm những gì họ đã làm, đó là một vấn đề nan giải. Nếu không, ''' .join ([c cho c trong orig_username.lower() nếu c trong string.punctuation + string.ascii_lowercase + string.digits])'. – AdamKG

+0

Có, tôi cần hỗ trợ không phải ascii. –

+0

Vâng, có bạn đi sau đó. Đối với cách các cầu thủ lớn xử lý nó ... Tôi cho rằng phần lớn họ không làm. Những người có thể dành nhiều nỗ lực vào nó như spotify đã làm. Tôi không biết bất kỳ thư viện độc lập nào, nhưng sẽ không ngạc nhiên nếu một trong những hiện lên, sử dụng cách tiếp cận từ bài báo nổi bật và chỉ sao chép mã có liên quan từ xoắn (đó là MIT). – AdamKG

Trả lời

1

Trước tiên, bạn nên đọc bài viết của Wikipedia trên Unicode equivalence. Nó giải thích sự cẩn thận và các phương pháp chuẩn hóa nào để biểu diễn một chuỗi Unicode ở dạng kinh điển của nó.

Sau đó, bạn có thể sử dụng mô đun được tích hợp sẵn của Python unicodedata để thực hiện bình thường hóa chuỗi Unicode thành biểu mẫu bình thường được ưu tiên của bạn.

Một mã ví dụ:

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

Đối với bất cứ ai đọc sách này một vài tháng sau đó:

Các module mà Spotify sử dụng không quá khó để rút khỏi Twisted mà không có một bó toàn bộ phụ thuộc (Xoắn có thể được loại bỏ hoàn toàn với gần như không có nỗ lực, nó chỉ được nhập khẩu cho các mục đích kiểm tra phiên bản). zope.interface là phụ thuộc duy nhất còn lại phía sau, mặc dù nó nên được tháo rời với một chút khá nỗ lực.

Trung tâm của mô-đun đó là unicodedata.normalize(), vì vậy nếu bạn muốn triển khai thực hiện của chính mình, đó là nơi bạn nên bắt đầu. Nhưng như những người khác đã nói, hãy cẩn thận, đây là một khu vực mở để dễ dàng khai thác.

EDIT: Tôi đã loại bỏ phụ thuộc vào zope và xoắn: https://gist.github.com/repole/7548478

Các vấn đề liên quan