有一组字母(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错误,虽然目前非常不方便。
答案 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