代码之家  ›  专栏  ›  技术社区  ›  Thierry Lam

如何将来自Web服务的重音字符存储到数据库中?

  •  4
  • Thierry Lam  · 技术社区  · 14 年前

    我有一个通过Web服务获取的单词: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查询名称列或在网页中显示名称列,可以得到: 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_,将其正确存储在数据库中而不丢失数据,并以其原始形式显示在网页上?

    1 回复  |  直到 14 年前
        1
  •  6
  •   Bernd Petersohn    14 年前

    错误已经存在于传递给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还不支持Python3。