Frage

Ich versuche Mako eine Schnur mit Unicode-Zeichen zu bekommen machen:

tempLook=TemplateLookup(..., default_filters=[], input_encoding='utf8',output_encoding='utf-8', encoding_errors='replace')
...
print sys.stdout.encoding
uname=cherrypy.session['userName']
print uname
kwargs['_toshow']=uname
...
return tempLook.get_template(page).render(**kwargs)

Die zugehörige Vorlagendatei:

...${_toshow}...

Und der Ausgang ist:

UTF-8
Deşghfkskhü
...
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 1: ordinal not in range(128)

Ich glaube nicht, dass es irgendein Problem mit dem String selbst, da ich es prima, nur drucken kann.

Altough I (viel) mit input/output_encoding und default_filters Parameter gespielt haben, es beschwert sich immer über nicht in der Lage sein zu dekodieren / kodieren mit ascii-Codec.

So entschied ich mich das Beispiel auf der Dokumentation , und die folgenden Arbeiten die „beste“:

input_encoding='utf-8', output_encoding='utf-8'
#(note : it still raised an error without output_encoding, despite tutorial not implying it) 

Mit

${u"voix m’a réveillé."} 

Und das Ergebnis Wesen

voix mâ�a réveillé

Ich verstehe einfach nicht, warum funktioniert das nicht. „Magic kodiert Kommentar“ s arbeiten entweder nicht. Alle Dateien werden verschlüsselt mit UTF-8.

Ich habe ohne Erfolg verbrachte Stunden, bin ich etwas fehlt?

Update:

Ich habe eine einfachere Frage ist nun:

Nun, da alle Variablen sind Unicode, wie kann ich Mako bekommen zu Unicode-Strings zu machen, ohne etwas zu bewerben? einen leeren Filter / render_unicode Passing () nicht hilft.

War es hilfreich?

Lösung

Ja, UTF-8! = Unicode.

UTF-8 ist eine specifc String-Codierung, wie sind ASCII und ISO 8859-1. Versuchen Sie folgendes:

Für jedes Eingabestring macht einen inputstring.decode('utf-8') (oder was auch immer Eingang kodieren Sie erhalten). Für jede Ausgabe-String tun, um eine outputstring.encode('utf-8') (oder was auch immer Ausgang kodieren Sie möchten). Für jeden internen Gebrauch nehmen Unicode-Strings ('this is a normal string'.decode('utf-8') == u'this is a normal string')

'foo' ein String ist, u'foo' ist ein Unicode-String, die „haben“ keine Codierung (nicht decodiert werden kann). SO will jederzeit Python eine Codierung einer normalen Zeichenfolge, es zuerst versucht, „decode“ es, die zu „kodieren“, es zu ändern. Und der Standard ist „ascii“, die häufiger ausfällt als nicht: -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top