2012-06-04 9 views
15

Questa domanda è basata su un effetto collaterale di that one.Impossibile codificare/decodificare l'output pprint

miei file .py sono tutti hanno # -*- coding: utf-8 -*- codifica definitore sulla prima linea, come la mia api.py

Come detto sul relativo domanda, io uso HttpResponse per restituire la documentazione delle API. Dal momento che ho definito la codifica da:

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

tutto è ok, e quando chiamo il mio servizio API, non ci sono problemi di codifica, tranne la stringa formata da un dizionario per pprint

Dal momento che sto usando turco personaggi di alcuni valori nel mio dizionario, pprint li converte in unichr equivalenti, come:

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') 

E la mia uscita di testo normale è come:

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

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

cerco di decodificare o codificare l'uscita pprint a differenti codifiche, senza successo ... Qual è la prassi migliore per superare questo problema

risposta

35

pprint sembra utilizzare repr per impostazione predefinita, è possibile aggirare questo sovrascrivendo PrettyPrinter.format:

# 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

Grazie molto, funziona come un incantesimo (: – FallenAngel

+2

se, come me, stai cercando di usarlo con 'pformat' (invece di pprint) e manda la stringa risultante a un motore di template come' jinja2', ti darà un 'UnicodeDecodeError', che puoi risolvere chiamando (nei termini di questa risposta)' unicode (MyPrettyPrinter(). pformat (d), 'utf-8') '. – fiatjaf

+1

Puoi avvolgere il tuo pprint con l'opzione set format su PyPI, sarà utile. –

1

Si consiglia di utilizzare stringhe Unicode invece di quelli a 8 bit:

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) 

Il modulo pprint è progettato per stampare tutto il possibile tipo di struttura nidificata in modo leggibile. Per fare ciò stamperà la rappresentazione degli oggetti piuttosto che convertirla in una stringa, così finirai con la sintassi di escape che usi stringhe unicode o meno. Ma se stai usando unicode nel tuo documento, allora dovresti davvero usare letterali unicode!

In ogni caso, thg435 has given you a solution come modificare questo comportamento di pformat.

+0

sono normali (non Unicode) stringhe note come stringhe binarie? Ho pensato che fossero corde asciutte – jdi

+0

ho provato anche quello, ho anche provato 'smart_str' di django,' smart_unicode' e altri metodi ... di django ... Quando uso la stringa unicode come 'u'müşteri', quello che ottengo è' u'm \ xfc \ u015fteri'' – FallenAngel

+0

@FallenAngel - questa è la rappresentazione per la stringa unicode generata da pformat, vedo che il tuo problema è un po 'diverso da quello che pensavo ... lo controllerò di nuovo ... – mata

Problemi correlati