从 iPhone 到 Python/Django 的表情符号

Posted

技术标签:

【中文标题】从 iPhone 到 Python/Django 的表情符号【英文标题】:Emoticons from iPhone to Python/Django 【发布时间】:2012-05-10 15:33:31 【问题描述】:

我正在尝试从 iPhone 应用程序中保存 cmets,该应用程序可能并且现在最有可能包含表情符号。无论我做什么,我都无法将表情符号保存到 mysql 数据库中……不断出现 Unicode 错误。

Python 2.6.5 Django 1.2.1 MySQL 数据库(表和行设置为 utf8 字符集) 将数据保存到 VARCHAR(255) 字段

我一直收到的错误是:

Incorrect string value: '\xF0\x9F\x97\xBC \xF0...' for column 'body' at row 1

我传入数据库的字符串是:

test_txt = u"Emoji - \U0001f5fc \U0001f60c \U0001f47b ...".encode('utf-8')

更新:这是我正在使用的模型:

class ItemComment(db.Model):
  item = db.ForeignKey(Item)
  user = db.ForeignKey(Profile)
  body = db.CharField(max_length=255, blank=True, null=True)

  active = db.BooleanField(default=True)
  date_added = db.DateTimeField(auto_now_add=True)

  def __unicode__(self):
    return "%s" % (self.item)

奇怪的是,如果我尝试将其传递给我在 MySQL 而不是 Django models.py 中创建的字段,它可以正常工作。但是,一旦我在 Django 模型中注册了该字段,它就会死掉。有没有其他方法可以存储这些?

任何想法都会很棒。 我不能再坚持下去了......

更新 2:使用以下 UPDATE 语句在终端中跟踪它(注意 U0001f5fc)

UPDATE 'table' SET 'body' = '????', WHERE 'table'.'id' = 1 ; args=(u'\U0001f5fc')

尽我所能传递价值:

force_unicode(smart_str(value), encoding='utf-8', strings_only=False, errors='ignore')

但错误仍然抛出:

_mysql_exceptions.Warning: Incorrect string value: '\xF0\x9F\x97\xBC' for column 'body' at row 1

完全输了!!!

干杯,

【问题讨论】:

你能提供你的模型吗? @bossylobster,干杯,刚刚将模型添加到上面的副本中。 查看***.com/questions/2108824/…,因为你说它在 MySQL 中运行良好,我怀疑这会希望,但值得一试。 @bossylobster,不知道为什么,因为它似乎对其他人有所帮助。但我收到完全相同的错误。从外观上看,DB一直设置为utf8。不过还是谢谢... 你在设置db为utf8后创建表了吗?我相信至少使用 postgres,编码更改仅适用于新表 【参考方案1】:

为 MySQL 服务器更改字符集 utf8mb4(5.5.3 以后的版本)

my.ini (my.cnf)

[mysqld]
character_set_server = utf8mb4
collation-server = utf8mb4_unicode_ci

或 SQL 查询

SET NAMES 'utf8mb4';

另见http://dev.mysql.com/doc/refman/5.5/en/charset-connection.html

或删除角色来执行此操作。

蟒蛇

import re
# emoji_text is unicode
no_emoji_text = re.sub('[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]', '', str(emoji_text))

谢谢。

另请参阅 MySQL throws Incorrect string value error

【讨论】:

这也是我使用的解决方案。如果这可能有帮助,我写了一篇文章,试图解释我遇到的问题,这些问题是相似的:pjambet.github.io/blog/emojis-and-mysql【参考方案2】:

我使用 Django 1.11 并关注 setting.py 并且创建 sql 可以很好地存储表情符号,

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'db_user',
        'PASSWORD': 'your_password',
        'OPTIONS': 'charset': 'utf8mb4',   # note here!!!
    

sql 来自this 答案,

CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

【讨论】:

以上是关于从 iPhone 到 Python/Django 的表情符号的主要内容,如果未能解决你的问题,请参考以下文章

Python - Django:使用 HttpResponse 流式传输视频/mp4 文件

如何将变量从 python Django 传递到 HTML 模板

如何将 jquery datepicker 从模板传递到 python Django 中查看?

用户从图像列表中选择的 Python/Django 表单

Python / Django 中的 REST API

Python3 Django -> HTML 到 PDF