2012-06-04 10 views
15

To pytanie jest oparte na skutku ubocznym that one.Nie można zakodować/odkodować danych wyjściowych pprint

Moi .py pliki są wszyscy mają # -*- coding: utf-8 -*- kodowania Definer na pierwszej linii, jak mój api.py

Jak wspomina na powiązane pytanie, używam HttpResponse aby powrócić do dokumentacji API. Odkąd zdefiniowano kodowania przez:

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

wszystko jest OK, a kiedy ja nazywam moją usługę API, nie ma problemów kodowania wyjątkiem ciąg utworzone ze słownika przez pprint

ponieważ używam Turkish znaków w niektórych wartości w moim dict, pprint konwertuje je do unichr odpowiedników, takich jak:

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

I moje wyjście jest jak zwykły tekst:

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

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

próbuję rozszyfrować lub wyjście zakodować pprint do różnych kodowań, ale bez powodzenia ... Co to jest najlepsze praktyki do przezwyciężenia tego problemu

Odpowiedz

35

pprint wydaje się używać repr domyślnie, można obejść ten problem poprzez nadpisanie 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

Dzięki dużo, działa jak czar (: – FallenAngel

+2

jeśli, jak ja, próbujesz użyć tego z 'pformat' (zamiast pprint) i wysłać wynikowy ciąg do silnika szablonowego, takiego jak' jinja2', da ci to a "UnicodeDecodeError", który możesz rozwiązać, wywołując (w warunkach tej odpowiedzi) 'unicode (MyPrettyPrinter(). pformat (d), 'utf-8')'. – fiatjaf

+1

Czy możesz owinąć twój Pprint z opcją ustawienia formatu do PyPI, to będzie pomocne. –

1

Należy użyć Unicode zamiast te 8-bitowe:

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) 

Moduł pprint jest przeznaczony do drukowania wszystkich możliwych rodzajów zagnieżdżonych konstrukcji w czytelny sposób. W tym celu wydrukuje reprezentację obiektów, a następnie przekształci ją w ciąg znaków, dzięki czemu otrzymasz składnię escape, w której użyjesz łańcuchów unicode, lub nie. Ale jeśli używasz unicodu w dokumencie, to naprawdę powinieneś używać literałów Unicode!

W każdym razie, thg435 has given you a solution jak zmienić to zachowanie pformat.

+0

są normalne (nie Unicode) struny znane jako ciągów binarnych? Myślałem, że są one stringami ASCII – jdi

+0

Próbowałem tego też, próbowałem również django 'smart_str',' smart_unicode' i soe innych metod ... Kiedy używam ciągów Unicode takich jak 'u'müşteri', to co otrzymuję to' u'm \ xfc \ u015fteri''pl – FallenAngel

+0

@FallenAngel - to jest reprezentacja ciągu unicode, który jest generowany przez pformat, widzę, że twój problem jest trochę inny niż myślałem ... Sprawdzę to jeszcze raz ... – mata

Powiązane problemy