我有一个Django应用程序,它从Twitter的API获取tweet数据并将其保存在MySQL数据库中.据我所知(我仍然围绕着字符编码的细节)我在任何地方都使用UTF-8,包括MySQL编码和校对,除了当推文包含表情符号字符时,它工作正常,我理解使用四字节编码.试图保存它们会产生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)
我正在使用MySQL 5.1,所以使用utf8mb4不是一个选项,除非我升级到5.5,我还不愿意(也是从我读过的,Django对此的支持还没有完全适合生产,虽然这可能不再准确).我也看到人们建议在受影响的列上使用BLOB而不是TEXT,我也不愿意这样做,因为我认为它会损害性能.
我的问题是,假设我对100%保留推文内容不太感兴趣,是否有一种方法可以过滤掉所有表情符号字符并用非多字节字符替换它们,例如古老的字符WHITE MEDIUM SMALL SQUARE (U+25FD)
?我认为这是在我当前设置下保存数据的最简单方法,但如果我错过了另一个明显的解决方案,我很乐意听到它!
仅供参考,我在Ubuntu 10.04.4 LTS上使用了Python 2.6.5.sys.maxunicode
是1114111,所以这是一个UCS-4版本.
谢谢阅读.
请看以下内容:
/home/kinka/workspace/py/tutorial/tutorial/pipelines.py:33: Warning: Incorrect string
value: '\xF0\x9F\x91\x8A\xF0\x9F...' for column 't_content' at row 1
n = self.cursor.execute(self.sql, (item['topic'], item['url'], item['content']))
Run Code Online (Sandbox Code Playgroud)
字符串'\xF0\x9F\x91\x8A
,实际上是一个4字节的unicode : u'\U0001f62a'
. mysql的字符集是utf-8但是插入4字节的unicode会截断插入的字符串.我搜索了这个问题,发现5.5.3下的mysql不支持4字节unicode,不幸的是我的是5.5.224.我不想升级mysql服务器,所以我只想过滤python中的4字节unicode,我尝试使用正则表达式但失败了.那么,有什么帮助吗?
我试图从unicode tweet文本中删除表情符号,并使用python 2.7打印出结果
myre = re.compile(u'[\u1F300-\u1F5FF\u1F600-\u1F64F\u1F680-\u1F6FF\u2600-\u26FF\u2700-\u27BF]+',re.UNICODE)
print myre.sub('', text)
Run Code Online (Sandbox Code Playgroud)
但似乎几乎所有的字符都从文本中删除.我从其他帖子中查了几个答案,不幸的是,这些都没有在这里工作.我在re.compile()中做错了吗?
这是一个删除所有字符的示例输出:
“ ' //./” ! # # # …
Run Code Online (Sandbox Code Playgroud) 我正在尝试处理的一些UTF-8文本有这个可爱的4字节字符:\ xF0\x9F\x98\xA5
根据这个网站,它是"失望但放心的脸":http://apps.timwhitlock.info/emoji/tables/unicode
在我看来,Python将其视为两个独立的角色.
这是我的测试代码:
mystring = '\xF0\x9F\x98\xA5'.decode('utf-8')
print len(mystring)
print mystring
print len(mystring.encode('utf-8'))
for c in mystring:
print c
Run Code Online (Sandbox Code Playgroud)
当我打印mystring时,我得到一张可爱的脸.但是当我打印出mystring的长度时,我得到2.
顺便说一句,我试图解决这个问题的原因是我需要在字符串中处理4个字节的字符,这样我就可以推送到5.5之前的MySQL数据库(它只能处理3个字节的UTF-8).
我很感激为什么Python似乎将其识别为两个字符,以及如何检测UTF-8字符串中的4字节字符.
谢谢.
我有一个json {u'nickname':u'\U0001f638\U0001f638\u5bb6\u52c7'}
.保存 nickname
到db时,它会引发:
DatabaseError: (1366, "Incorrect string value: '\\xF0\\x9F\\x98\\xB8\\xF0\\x9F..
.' for column 'nickname' at row 1")
Run Code Online (Sandbox Code Playgroud)
我认为\U0001f638\U0001f638
是问题,它们是某种图像代码.但是如何检测这样的字符串并将其删除?