【发布时间】:2010-05-06 06:26:19
【问题描述】:
我通过网络服务获取了以下单词: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é,将其正确存储在数据库中而不会丢失数据,并以原始形式将其显示在网页上?
【问题讨论】:
-
到目前为止,我认为这里没有问题。您从 Python 中看到的是字符串“André”的 Unicode 表示。每个字符存储在两个字节中。当您将其存储在 MySQL 中时,数据库引擎会即时自动将其转换为 UTF-8 编码。在 UTF-8 中,有些字符仅使用 1 个字节存储,而有些字符使用多个字节存储,但这里没有数据丢失,可以从 UTF-8 编码表示中随时获取原始字符串。
-
虽然与您的技术堆栈不是 100% 相同,但请查看 stackoverflow.com/questions/279170/utf-8-all-the-way-through,了解如何通过所有层无损处理 utf-8。
-
@Tamas:错误;看
u'Andr\xc3\xa9'; e-acute 占用 4 个字节;见@Bernd 的回答