我最近注意到我在数据库中来自用户的一些条目包含错误编码的字符串,例如明确表示ó
什么时候。ó
它来自其他未正确编码的网站的复制粘贴,这是我无法控制的。我发现我可以添加此验证器来捕获此类情况并引发异常 - 这是一个带有附加模型的示例:
from django.db import models
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ValidationError
import ftfy
def validate_ftfy(value):
value_ftfy = ftfy.ftfy(value)
if value_ftfy != value:
raise ValidationError(
_('Potential UTF-8 encoding error: %(value)r'
' decoded to %(value_ftfy)r.'),
params={'value': value, 'value_ftfy': value_ftfy}
)
class Message(models.Model):
content = models.CharField(max_length=1000, validators=[validate_ftfy])
def save(self, *args, **kwargs):
self.full_clean()
return super(Message, self).save(*args, **kwargs)
问题是,既然我发现了它,我认为在我的任何 CharField、TextField 等实例中都没有必要跳过它。有没有办法将此验证器插入所有数据类型,以便如果任何非二进制文件具有无效的 UTF-8,我可以指望它不会进入数据库?