Django 在电子邮件字段中接受中文伪字母

Django accepting Chinese pseudo letters in email fields

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

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 错误吗?在 Python 中检测此类字母的最佳方法是什么?或者更好的是,Django 是否有一个标志以禁止 validate_email?

中的此类字母

更新:与此同时,我发现电子邮件地址中可能允许使用此类字符,但是对它们的支持一般,而且它们造成了很多麻烦.每个定义甚至允许使用真正的 Chinese/Japanese/Korean 字符和变音符号。所以,从技术上讲,它看起来不像是 Django 的错误,尽管目前非常不方便。

根据经验,用于输入汉字的 IME 很容易切换到 "full width" 模式并导致输入全角拉丁字符。您可以使用 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