2012-06-04 15 views
15

यह प्रश्न that one के दुष्प्रभाव पर आधारित है।पीप्रिंट आउटपुट को एन्कोड/डीकोड करने में असमर्थ

मेरे .py फ़ाइलें मैं HttpResponse का उपयोग API दस्तावेज़ वापस जाने के लिए, सभी पहली पंक्ति पर # -*- coding: utf-8 -*- एन्कोडिंग definer है, मेरी api.py

जैसे मैं संबंधित सवाल पर उल्लेख के रूप में कर रहे हैं। जब से मैं द्वारा एन्कोडिंग परिभाषित:

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

सब कुछ ठीक है, और जब मैं अपने एपीआई सेवा को कॉल, वहाँ को छोड़कर कोई एन्कोडिंग समस्याओं स्ट्रिंग pprint

द्वारा एक शब्दकोश से गठित जब से मैं तुर्की का उपयोग कर रहा हैं मेरी dict में कुछ मूल्यों में वर्ण, pprint, unichr समकक्ष करने के लिए उन्हें धर्मान्तरित की तरह:

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

और मेरे सादा पाठ उत्पादन की तरह है:

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

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

मैं डिकोड करने के लिए या विभिन्न एन्कोडिंग को एनकोड pprint उत्पादन, कोई सफलता के साथ प्रयास करें ... क्या सबसे अच्छा अभ्यास इस समस्या

उत्तर

35

pprint डिफ़ॉल्ट रूप से repr उपयोग करने के लिए प्रकट होता है, तो आप 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

धन्यवाद बहुत कुछ, एक आकर्षण की तरह काम करता है (: – FallenAngel

+2

अगर, मेरे जैसे, आप इसे 'pformat' (pprint के बजाए) के साथ उपयोग करने की कोशिश कर रहे हैं और परिणामी स्ट्रिंग को एक टेम्पलेटिंग इंजन जैसे' जिंज 2 'में भेज दें, यह आपको देगा एक 'यूनिकोडडेकोड एरर', जिसे आप कॉल करके हल कर सकते हैं (इस उत्तर की शर्तों में) 'यूनिकोड (माईप्रेटी प्रिंटर()। pformat (डी),' utf-8 ') ' – fiatjaf

+1

क्या आप अपने पीप्रिंट को प्रारूप सेट विकल्प के साथ लपेट सकते हैं पीईपीआई, यह सहायक होगा। –

1

आप 8 बिट की बजाय यूनिकोड तार का उपयोग करना चाहिए पर काबू पाने के लिए है:

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) 

pprint मॉड्यूल को सभी संभावित प्रकार की घोंसले वाली संरचना को एक पठनीय तरीके से मुद्रित करने के लिए डिज़ाइन किया गया है। ऐसा करने के लिए यह वस्तुओं के प्रतिनिधित्व को मुद्रित करेगा बल्कि इसे एक स्ट्रिंग में परिवर्तित करेगा, ताकि आप भागने के सिंटैक्स पहिये के साथ समाप्त हो जाएं, आप यूनिकोड तारों का उपयोग करते हैं या नहीं। लेकिन यदि आप अपने दस्तावेज़ में यूनिकोड का उपयोग कर रहे हैं, तो आपको वास्तव में यूनिकोड अक्षर का उपयोग करना चाहिए!

वैसे भी, thg435 has given you a solution pformat के इस व्यवहार को कैसे बदला जाए।

+0

सामान्य हैं (गैर यूनिकोड) द्विआधारी तार के रूप में जाना तार? मैंने सोचा कि वे एसीआई स्ट्रिंग्स – jdi

+0

थे, मैंने कोशिश की, मैंने डीजेंगो के 'smart_str',' smart_unicode' और अन्य तरीकों से भी कोशिश की ... जब मैं यूनिकोड स्ट्रिंग का उपयोग करता हूं जैसे 'u'müşteri', जो मुझे मिलता है वह है' \ xfc \ u015fteri'' – FallenAngel

+0

@FallenAngel - यह यूनिकोड स्ट्रिंग का प्रतिनिधित्व है जो पॉर्मेट द्वारा उत्पन्न होता है, मुझे लगता है कि आपकी समस्या थोड़ा अलग है तो मैंने सोचा ... मैं इसे फिर से देखूंगा ... – mata

संबंधित मुद्दे