关于可打印的UTF8字符(用于用户名)是否存在共识?

时间:2016-11-22 21:02:49

标签: python regex unicode utf-8 special-characters

在我的聊天应用TalkTalkTalk中,对于用户名,我只允许使用字母数字字符(A-Z,a-z,0-9):

username = re.sub(r'\W+', '', username)        # regex to keep alphanumeric only

这有点过于严格,因为UTF8字符在很多情况下都很有用(名字使用另一个字母而不是latin等)。现在我想允许其他字母表中的这些有用的UTF8字符,甚至是❤☀☆☂☻♞☯☭things。 (为什么不呢?)

但我不想要:

  • 所有类型的空格,各种换行符(


  • 看起来像空的零宽度字符的恶意字符:http://unicode-table.com/fr/200D/

  • 等。更常见的是,每个字符都可以使userA<malicious_char>看起来像真userA

哪些是可打印的UTF8字符?(用于用户名)

如何使用正则表达式过滤它们,例如在Python中?

注意:这个问题是关于找到一个正则表达式来过滤它们,所以它不是一些链接问题的重复。

1 个答案:

答案 0 :(得分:2)

您可以在正则表达式中使用标记re.UNICODE和unicode,\ u200b在技术上不是定义为空格

python 2.7和3

import re
username = u'My \u200bNick \u2602 \u263b \u200c '
white_chars = ['\s', u'\u200b',u'\u200c']     #etc
regex_str = '[' + ''.join(white_chars) + ']'
regex = re.compile(regex_str, flags=re.UNICODE)
regex.sub("", username )
print ( regex.sub("", username ) )

你得到了

u'MyNick\u2602\u263b'
MyNick☂☻