2012-03-27 8 views
2

Ich habe letztes Jahr eine Django-Site erstellt, die sowohl ein Dashboard als auch eine API für einen Client verwendet.django + unicode constant errors

Sie fügen gelegentlich Unicode-Informationen (normalerweise über eine Microsoft-Tastatur und ein einfaches Anführungszeichen!) In die Datenbank ein.

Es ist gut, diese eine Instanz für alles zu ändern, aber was immer wieder ist ich so etwas wie dieser Fehler, wenn ein neuer Charakter wird hinzugefügt, dass ich nicht „umgewandelt“ habe:

UnicodeDecodeError bei/xx/xxxxx/api/xxx.json

'ascii' Codec kann nicht Byte 0xEB in Position 0 dekodieren: ordinal nicht in Reichweite (128)

Das Problem ist eigentlich, dass ich in der Lage sein müssen, konvertieren dieser Unicode (aus dem Modell) in HTML.

# if a char breaks the system, replace it here (duplicate line) 
text = unicode(str(text).replace('\xa3', '£')) 

Ich dupliziere diese Zeile hier, aber es bricht nur anders.

Meine Haare zerreißen, weil ich kenne das ist geradlinig und ich mache etwas bemerkenswert albern irgendwo.

Haben Sie woanders gesucht und festgestellt, dass, während mein Problem nicht neu ist, ich die Antwort nicht anderswo finden kann.

+0

Hier ist eine gute Einführung in die Behebung von Unicode-Schmerzen: http://bit.ly/unipain –

Antwort

0

Ich nehme an, dass text Unicode ist (was eine sichere Annahme zu sein scheint, wie \xa3 ist der Unicode für die £ Zeichen).

Ich bin mir nicht sicher, warum Sie es überhaupt kodieren müssen, da der Text bei der Ausgabe in der Vorlage in utf-8 konvertiert wird, und alle Browser können das perfekt anzeigen. Es ist wahrscheinlich ein weiterer Punkt weiter unten, wo etwas (wahrscheinlich Ihr Code, leider) ASCII annimmt, und die implizite Konvertierung bricht Dinge.

In diesem Fall könnten Sie dies nur tun:

text = text.encode('ascii', 'xmlcharrefreplace') 

, die die Nicht-ASCII-Zeichen in HTML/XML-Entitäten wie £ umwandelt.

+0

heh ... habe versucht so viele Möglichkeiten um diese ... setzen Sie diese Zeile vor den ganzen Rest des Codes, und es scheint zu funktionieren! Whoop! Vielen Dank – padajo

0

Sagen Sie dem JSON-Decoder, dass er die JSON-Datei als Unicode dekodieren soll. Bei der Verwendung des json Modul direkt, kann dies mit diesem Code erfolgen:

über einige andere Module (django, ...)
json.JSONDecoder(encoding='utf8').decode(
    json.JSONEncoder(encoding='utf8').encode('blä')) 

Wenn die JSON-Decodierung erfolgt vielleicht können Sie die Informationen über diese anderen Modul gehen in das JSON-Zeug.