Django在电子邮件领域接受中文伪信

时间:2017-08-23 16:14:41

标签: django validation email unicode chinese-locale

有一组字母(A-Za-z),中国用户有时输入我们期望的ascii字母 - 但这些字母实际上是用Unicode定义的特殊字符。请查看此示例电子邮件地址:

"1."

当然,我们可以阅读地址。但是,这种电子邮件地址在各种情况下都会造成很多麻烦。典型的电子邮件服务器似乎无法处理此类字符。这是一个Django错误吗?在Python中检测此类字母的最佳方法是什么?或者甚至更好,为了在from django.core.validators import validate_email email = u'dummy@raysfirst.com' try: validate_email(email) except ValidationError as e: print "oops! wrong email" else: print "hooray! email is valid" 禁止这样的字母,Django有一面旗帜吗?

更新:与此同时,我发现电子邮件地址中可能允许使用此类字符,但对它们的支持是如此,并且它们会造成很多麻烦。根据定义,即使是真正的中文/日文/韩文字符以及变音符号也是允许的。所以,从技术上讲,它看起来不像是一个Django错误,虽然目前非常不方便。

1 个答案:

答案 0 :(得分:0)

根据经验,用于输入中文字符的IME很容易切换到“全宽”模式,并导致输入全角拉丁字符。您可以使用str.translate将它们恢复为非全宽,但正如您所指出的,全角字符可能有效:

#coding:utf8
import unicodedata as ud

# Build a translation table of fullwidth to non-fullwidth characters.
table = {}
for i in range(65536):
    try:
        name = ud.name(chr(i))
        if name.startswith('FULLWIDTH '):
            other = ud.lookup(name[10:])
            table[i] = ord(other)
    except ValueError:
        pass

email = u'dummy@raysfirst.com'
print(email)
print(email.translate(table))

输出:

dummy@raysfirst.com
dummy@raysfirst.com