可能重复: How to filter (or replace) unicode characters that would take more than 3 bytes in UTF-8?
背景:
我正在使用MySQL 5.1中的Django,我在使用4字节UTF-8字符时遇到了问题,在我的web应用程序中造成致命错误。
我使用a script将数据库中的所有表和列转换为UTF-8,这解决了大多数unicode问题,但4字节unicode字符仍然存在问题。作为noted elsewhere,MySQL 5.1不支持长度超过3个字节的UTF-8字符.
每当我输入一个4字节的unicode字符(例如)在我的Django网站上的ModelForm中,表单验证,然后引发一个类似于以下情况的异常:
Incorrect string value: '\xF0\x9F\x80\x90' for column 'first_name' at row 1我的问题:
使用MySQL 5.1数据库的Django web应用程序中,避免4字节UTF-8字符造成致命错误的合理方法是什么?
我考虑过:
request.POST QueryDict并替换/删除所有无效的UTF8字符替换无效字符的示例中间件(受this SO question启发):
import re
class MySQLUnicodeFixingMiddleware(object):
INVALID_UTF8_RE = re.compile(u'[^\u0000-\uD7FF\uE000-\uFFFF]', re.UNICODE)
def process_request(self, request):
"""Replace 4-byte unicode characters by REPLACEMENT CHARACTER"""
request.POST = request.POST.copy()
for key, values in request.POST.iterlists():
request.POST.setlist(key,
[self.INVALID_UTF8_RE.sub(u'\uFFFD', v) for v in values])发布于 2013-01-17 11:09:45
您有升级mysql的选项吗?如果这样做,您可以升级并将编码设置为utf8mb4。
假设您没有这个选项,我为您看到以下选项:
1)添加java脚本/前端验证,以防止除1,2或3字节unicode字符以外的任何内容的输入,
( 2)在模型中添加一个清理函数,以去除任何4字节unicode字符的数据(这将是您的选项2或3)。
同时,您的用户实际上使用的是4字节字符。如果您的应用程序中有使用它们的业务案例,您可以使用该功能并请求升级。
https://stackoverflow.com/questions/13114813
复制相似问题