2012-06-04 6 views
15

Diese Frage basiert auf einem Nebeneffekt von that one.Codierung/Dekodierung von Druckausgabe nicht möglich

Meine .py Dateien sind alle # -*- coding: utf-8 -*- Codierung definer in der ersten Zeile haben, wie mein api.py

Wie ich auf die damit verbundene Frage erwähnen, verwende ich HttpResponse die API-Dokumentation zurückzukehren. Da ich Codierung definiert durch:

ist
HttpResponse(cy_content, content_type='text/plain; charset=utf-8') 

Alles in Ordnung, und wenn ich meinen API-Service anrufen, gibt es keine Codierung Probleme außer die Zeichenfolge aus einem Wörterbuch von pprint gebildet

Da ich Türkisch bin mit Zeichen in einigen Werten in meinem dict, pprint wandelt sie in unichr Äquivalente, wie:

API_STATUS = { 
    1: 'müşteri', 
    2: 'some other status message' 
} 

my_str = 'Here is the documentation part that contains Turkish chars like işüğçö' 
my_str += pprint.pformat(API_STATUS, indent=4, width=1) 
return HttpRespopnse(my_str, content_type='text/plain; charset=utf-8') 

Und meine Klartextausgabe ist wie:

Here is the documentation part that contains Turkish chars like işüğçö 

{ 
    1: 'm\xc3\xbc\xc5\x9fteri', 
    2: 'some other status message' 
} 

Ich versuche pprint Ausgang zu entschlüsseln oder zu kodieren verschiedenen Kodierungen, ohne Erfolg ... Was ist die beste Praxis ist, dieses Problem zu überwinden

Antwort

35

pprintrepr die standardmäßig verwendet wird, können Sie durch zwingende PrettyPrinter.format dieses Problem umgehen:

# coding=utf8 

import pprint 

class MyPrettyPrinter(pprint.PrettyPrinter): 
    def format(self, object, context, maxlevels, level): 
     if isinstance(object, unicode): 
      return (object.encode('utf8'), True, False) 
     return pprint.PrettyPrinter.format(self, object, context, maxlevels, level) 


d = {'foo': u'işüğçö'} 

pprint.pprint(d)    # {'foo': u'i\u015f\xfc\u011f\xe7\xf6'} 
MyPrettyPrinter().pprint(d) # {'foo': işüğçö} 
+0

Danke eine Menge, funktioniert wie ein Charm (: – FallenAngel

+2

), wenn du, wie ich, versuchst, dies mit 'pformat' (anstelle von pprint) zu verwenden und die resultierende Zeichenkette an eine Template-Engine wie' jinja2' zu senden ein 'UnicodeDecodeError', den Sie lösen können, indem Sie (im Sinne dieser Antwort)' unicode (MyPrettyPrinter() .pformat (d), 'utf-8') 'anklicken. – fiatjaf

+1

Können Sie Ihren Ausdruck mit Format-Option umwandeln PyPI, es wird hilfreich sein. –

1

Sie sollten Unicode-Strings anstelle von 8-Bit-Einsen verwenden:

API_STATUS = { 
    1: u'müşteri', 
    2: u'some other status message' 
} 

my_str = u'Here is the documentation part that contains Turkish chars like işüğçö' 
my_str += pprint.pformat(API_STATUS, indent=4, width=1) 

Das Modul pprint wurde entwickelt, um alle möglichen verschachtelten Strukturen lesbar auszudrucken. Um dies zu tun, wird die Objektdarstellung gedruckt und dann in eine Zeichenkette umgewandelt, so dass Sie die Escape-Syntax erhalten, wenn Sie Unicode-Zeichenfolgen verwenden oder nicht. Aber wenn Sie in Ihrem Dokument Unicode verwenden, sollten Sie Unicode-Literale verwenden!

Wie auch immer, thg435 has given you a solution wie dieses Verhalten von Pformat zu ändern.

+0

Sind normale (nicht Unicode) Zeichenketten als Binärketten bekannt? Ich dachte, sie wären ASCII-Strings – jdi

+0

Ich versuchte das auch, ich versuchte auch django 'smart_str',' smart_unicode' und so andere Methoden ... Wenn ich Unicode-String wie 'u'müşteri' benutze, was ich bekomme ist' u'm \ xfc \ u015nteri'' – FallenAngel

+0

@FallenAngel - das ist die Darstellung für die Unicode-Zeichenkette, die von pformat generiert wird, sehe ich, dass Ihr Problem ein wenig anders ist als ich dachte ... Ich werde das nochmal überprüfen ... – mata

Verwandte Themen