当前位置: 首页 > 面试题库 >

如何过滤输入中的表情符号字符,以便保存在<5.5版的MySQL中?

公冶兴文
2023-03-14
问题内容

我有一个Django应用程序,该应用程序从Twitter的API获取推文数据并将其保存在MySQL数据库中。据我所知(我仍然在关注字符编码的重点),我到处都在使用UTF-8,包括MySQL编码和排序规则,除了在推文中包含
Emoji 字符(我理解)外,它都可以正常工作使用四字节编码。尝试保存它们会从Django产生以下警告:

/home/biggleszx/.virtualenvs/myvirtualenv/lib/python2.6/site-
packages/django/db/backends/mysql/base.py:86:警告:错误的字符串值:’\ xF0 \ x9F \ x98 \
xAD I …’在第1行的’text’列返回self.cursor.execute(query,args)

我使用的是MySQL5.1,因此除非升级到5.5,否则我不希望使用utf8mb4(我宁愿不这样做)(从我读过的文章来看,Django对Django的支持还不具备生产准备能力,尽管这可能不再准确)。我还看到人们建议在受影响的列上使用BLOB而不是TEXT,我也宁愿不这样做,因为我认为这样做会损害性能。

我的问题是,假设我不太担心100%保留推文内容,是否有办法过滤掉所有Emoji字符并将其替换为非多字节字符,例如尊贵的字符WHITE MEDIUM SMALL SQUARE (U+25FD)?我认为这是在当前设置下保存数据最简单的方法,尽管如果我错过了另一个明显的解决方案,我也很乐意听到!

仅供参考,我在Ubuntu 10.04.4 LTS上使用库存Python
2.6.5。sys.maxunicode是1114111,所以它是UCS-4版本。

谢谢阅读。


问题答案:

感谢Martijn Pieters,解决方案来自于正则表达式的世界,特别是以下代码(基于他对上面第一个链接的回答):

import re
try:
    # UCS-4
    highpoints = re.compile(u'[\U00010000-\U0010ffff]')
except re.error:
    # UCS-2
    highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
# mytext = u'<some string containing 4-byte chars>'
mytext = highpoints.sub(u'\u25FD', mytext)

我要替换的字符是WHITE MEDIUM SMALL SQUARE (U+25FD)FYI,但可以是任何字符。

对于像我这样不熟悉UCS的用户来说,这是一个用于Unicode转换的系统,并且给定的Python构建将包括对UCS-2或UCS-4变体的支持,每种变体在字符支持上都有不同的上限。

加上此代码,字符串似乎可以在MySQL 5.1中永久保存。

希望这对其他情况相同的人有所帮助!



 类似资料:
  • 问题内容: 我正在使用mysql 5.5.10,它的character_sets是 我将utf8mb4从utf8更改为iOS5的表情符号。它们由4字节代码表示。 但是当我插入3个笑脸表情符号时,“ ???” 在mysql中。 它们是3F 3F 3F(十六进制)。 我可以很好地存储iOS4的表情符号,但不能存储iOS5的表情符号。 如何存储iOS5的表情符号? 请帮我。 问题答案: 4字节Unico

  • 最近,由于浏览器支持的数据质量问题,我遇到了一个bug,我正在寻找一个安全规则,用于应用字符串转义而不需要双重大小,除非需要。 UTF-8字节序列“E2-80-A8”(U 2028,行分隔符),在Unicode数据库中是完全有效的字符。但是,该序列表示一个行分隔符(是,除“0A”外)。 而且糟糕的是,很多浏览器(包括Chrome、Firefox、Safari我没有测试其他的),无法处理一个JSON

  • 问题内容: 我想用Java初始化一个String,但是该字符串需要包含引号;例如:。我试着做: 但这不起作用。如何”在字符串中包含? 问题答案: 在Java中,你可以使用:

  • 我正在编写一个程序,我希望将用户输入作为字符/符号(@,+,$,-),并使用if语句测试它以了解它是否是一个特定的符号,所以我使用了下面的代码,但它不起作用

  • 我想在我的mysql数据库中存储表情符号(android或iphone),我尝试了很多教程和帖子,比如: 如何在MySQL中插入utf-8 mb4字符(ios5中的emoji)? http://andy-carter.com/blog/saving-emoticons-unicode-from-twitter-to-a-mysql-database character_set_client:utf

  • 我正在制作一个程序,它从用户那里获取一个字符串并用分隔符逐字分隔它,它几乎完成了。但是,在第一个完整循环之后,来自用户的下一个输入不会通过最后一个while循环。 下面是我要说的代码片段: 我想我需要在单词increment和print行周围再循环一次,并在输入中使用continue序列。hasNext()循环,因为这就是我使用int来运行类似程序的方式,但我不确定这将如何处理字符串。 有什么建议

  • 我想在数据库中保存表情符号 但插入数据库时出错 错误:ER\U截断\U字段的\U值\U错误:字符串值不正确:'\xF0\x9F\x98\x9B\xF0\x9F…'对于第1行的“文本”列 碰撞我用utf8mb4_unicode_ci聊天集utf8mb4引擎Innodb 另外我在连接文件中使用了这个

  • 问题内容: 我想在eclipse 中的文件中输入字符串,该字符串包含字符,并且我不能毫无错误地将其添加到xml文件中!我什至试图按角色逃避: 或将其包含在以下内容之间: 但没有一个有效。最后,在这里的善良用户的帮助下,我发现这是在xml中输入此类字符的正确方法: 但是现在当我在代码中获得此资源时: 并将其设置为TextView,它将显示在屏幕上!如何通过代码获取原始字符?我应该做一些与HTML相关