4 Stimmen

Wie speichert man akzentuierte Zeichen, die von einem Webdienst kommen, in einer Datenbank?

Ich habe das folgende Wort, das ich über einen Webdienst abrufe: André

In Python sieht der Wert wie folgt aus: "Andr \u00c3\u00a9 ". Die Eingabe wird dann dekodiert mit json.loads :

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

Wenn ich die oben genannten in einer utf8 MySQL-Datenbank speichern, werden die Daten wie die folgenden mit Django gespeichert:

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

Die Abfrage der Namensspalte von einer mysql-Shell aus oder die Anzeige auf einer Webseite ergibt: André

Die Webseite wird in utf8 angezeigt:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Meine Datenbank ist in utf8 konfiguriert:

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)

Wie kann ich das Wort André von einem Webdienst abrufen, es ordnungsgemäß und ohne Datenverlust in einer Datenbank speichern und es auf einer Webseite in seiner ursprünglichen Form anzeigen?

6voto

Bernd Petersohn Punkte 2164

Der Fehler ist bereits in der Zeichenkette enthalten, die Sie an json.loads() übergeben. \u00c3 ist "Eine Tilde" und \00a9 ist das Copyright-Zeichen. Korrekt für é wäre \u00e9.

Wahrscheinlich wurde die Zeichenkette vom Absender in UTF-8 kodiert und vom Empfänger als ISO-8859-1 dekodiert.

Wenn Sie zum Beispiel das folgende Python-Skript ausführen:

# -*- 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))

Die Ausgabe sollte wie folgt aussehen:

data: {'name': u'Andr\xe9'}
code: '{"name": "Andr\\u00e9"}'
conv: {u'name': u'Andr\xe9'}
Name is André

Die Verwaltung von Unicode in Python 2.x kann manchmal zu einem Ärgernis werden. Leider unterstützt Django noch nicht Python 3.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X