我通过网络服务获取以下字词:André
从Python中,值看起来像:“Andr \ u00c3 \ u00a9”。然后使用json.loads
:
>>> import json
>>> json.loads('{"name":"Andr\\u00c3\\u00a9"}')
>>> {u'name': u'Andr\xc3\xa9'}
当我将上述内容存储在utf8 MySQL数据库中时,使用Django将数据存储如下:
SomeObject.objects.create(name=u'Andr\xc3\xa9')
从mysql shell查询name列或在网页中显示它给出:
André
网页显示在utf8:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
我的数据库是在utf8中配置的:
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
如何从Web服务中检索André这个词,将其正确存储在没有数据丢失的数据库中,并以原始形式显示在网页上?
答案 0 :(得分:6)
错误已经存在于传递给json.loads()的字符串中。 \ u00c3是“A tilde”,\ 00a9是版权符号。正确的é将是\ u00e9。
该字符串可能由发送方以UTF-8编码,并由接收方解码为ISO-8859-1。
例如,如果您运行以下Python脚本:
# -*- encoding: utf-8 -*-
import json
data = {'name': u'André'}
print('data: {0}'.format(repr(data)))
code = json.dumps(data)
print('code: {0}'.format(repr(code)))
conv = json.loads(code)
print('conv: {0}'.format(repr(conv)))
name = conv['name']
print(u'Name is {0}'.format(name))
输出应如下所示:
data: {'name': u'Andr\xe9'}
code: '{"name": "Andr\\u00e9"}'
conv: {u'name': u'Andr\xe9'}
Name is André
在Python 2.x中管理unicode有时会变得很麻烦。不幸的是,Django还不支持Python 3。