从iPhone到Python/Django的表情符号

Dan*_*oss 5 python iphone django emoticons

我正在尝试保存iPhone应用程序中的评论,这些评论可能现在很可能包含表情符号.无论我做什么,我都无法将表情符号保存到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
Run Code Online (Sandbox Code Playgroud)

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

test_txt = u"Emoji - \U0001f5fc \U0001f60c \U0001f47b ...".encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

任何想法都会很棒.
我不能再坚持这个......

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

UPDATE 'table' SET 'body' = '', WHERE 'table'.'id' = 1 ; args=(u'\U0001f5fc')
Run Code Online (Sandbox Code Playgroud)

使用硬核,因为我可以传递值:

force_unicode(smart_str(value), encoding='utf-8', strings_only=False, errors='ignore')
Run Code Online (Sandbox Code Playgroud)

但错误仍然存​​在:

_mysql_exceptions.Warning: Incorrect string value: '\xF0\x9F\x97\xBC' for column 'body' at row 1
Run Code Online (Sandbox Code Playgroud)

完全丢了!

干杯,

小智 5

为MySQL服务器更改charset utf8mb4(稍后版本5.5.3)

my.ini(my.cnf)

[mysqld]
character_set_server = utf8mb4
collation-server = utf8mb4_unicode_ci
Run Code Online (Sandbox Code Playgroud)

或SQL查询

SET NAMES 'utf8mb4';
Run Code Online (Sandbox Code Playgroud)

另见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))
Run Code Online (Sandbox Code Playgroud)

谢谢.

另请参见 MySQL throws错误的字符串值错误