Как хранить акцентированные символы, поступающие из веб-службы, в базу данных? - PullRequest
4 голосов
/ 05 мая 2010

У меня есть следующее слово, которое я получаю через веб-сервис: Андре

В Python значение выглядит так: "Andr \ u00c3 \ u00a9". Затем ввод декодируется с использованием json.loads:

>>> import json
>>> json.loads('{"name":"Andr\\u00c3\\u00a9"}')
>>> {u'name': u'Andr\xc3\xa9'}

Когда я сохраняю вышеупомянутое в базе данных MySQL utf8, данные сохраняются, как показано ниже, используя Django:

SomeObject.objects.create(name=u'Andr\xc3\xa9')

Запрос столбца имени из оболочки MySQL или отображение его на веб-странице дает: 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)

Как я могу извлечь слово Андре из веб-службы, правильно сохранить его в базе данных без потери данных и отобразить на веб-странице в первоначальном виде?

1 Ответ

6 голосов
/ 06 мая 2010

Ошибка уже находится в строке, которую вы передаете json.loads (). \ u00c3 - "Тильда", а \ 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 может иногда создавать неудобства. К сожалению, Django пока не поддерживает Python 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...