2011-02-18 11 views
36

मैं HTML रिपोर्ट बनाने के लिए पायथन 2.6 और Jinja2 का उपयोग कर रहा हूं। मैं टेम्पलेट को उनके द्वारा कई परिणामों और टेम्पलेट लूप प्रदान करता हूं और एचटीएमएल टेबलपायथन - 'ascii' कोडेक बाइट डीकोड नहीं कर सकता

टेम्पलेट.रेन्डर को कॉल करते समय, अचानक मुझे यह त्रुटि मिलनी शुरू हो गई है।

<td>{{result.result_str}}</td> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128) 

अजीब बात है, भले ही मैं हर परिणाम के लिए "abc" की तरह एक सरल ASCII स्ट्रिंग के लिए result.result_str निर्धारित करते हैं, मैं अभी भी यह त्रुटि देख रहा हूँ, है। मैं Jinja2 और पायथन के लिए नया हूं और मूल कारणों को पाने के लिए समस्या की जांच के बारे में किसी भी विचार की सराहना करता हूं।

उत्तर

19

यदि आपको "एबीसी" जैसी स्ट्रिंग के साथ कोई त्रुटि मिलती है, तो शायद गैर-ASCII वर्ण कहीं और है। शायद टेम्पलेट स्रोत में?

किसी भी मामले में, इस तरह की समस्याओं से बचने के लिए अपने आवेदन में यूनिकोड स्ट्रिंग का उपयोग करें। यदि आपका डेटा स्रोत आपको बाइट स्ट्रिंग प्रदान करता है, तो यूटीएफ -8 में स्ट्रिंग एन्कोड किए जाने पर आपको byte_string.decode('utf-8') के साथ यूनिकोड स्ट्रिंग मिलती है। यदि आपका स्रोत एक फ़ाइल है, तो कोडेक्स मॉड्यूल में StreamReader कक्षा का उपयोग करें।

आप यूनिकोड तार और नियमित रूप से तार के बीच अंतर के बारे में अनिश्चित हैं, तो इस पढ़ें: http://www.joelonsoftware.com/articles/Unicode.html

+0

मैंने गैर असीसी के लिए टेम्पलेट की जांच की, विम में मैंने "सेट isprint =" चलाया, लेकिन यह कुछ भी ascii नहीं दिखाया। – shane

+0

और कोई अन्य चर नहीं है, कि टेम्पलेट आपके पोस्ट में दिखाए गए लाइन के बाद प्रस्तुत करने का प्रयास करेगा, जिसमें स्ट्रिंग हो सकती है और एन्कोड किया जा सकता है? यदि नहीं, तो क्या आप अपने टेम्पलेट को कम से कम कम कर सकते हैं जो त्रुटि को पुन: उत्पन्न करेगा? –

+0

अच्छा विचार। मैं सिर्फ परिणाम_स्ट्रेट को प्रदर्शित करने की कोशिश करूंगा और यह देखने के लिए कुछ और नहीं कि मुझे अभी भी यह मिल रहा है या नहीं। – shane

0

ASCII 7-बिट कोड है। मूल्य 0xC4 7 बिट्स में संग्रहीत नहीं किया जा सकता है। इसलिए, आप उस डेटा के लिए गलत एन्कोडिंग का उपयोग कर रहे हैं।

+1

मैं समझता हूं कि त्रुटि का क्या अर्थ है। मैं कुछ पॉइंटर्स को देख रहा हूं कि मैं इसे क्यों प्राप्त कर रहा हूं। – shane

+0

@ शेन: क्योंकि आप '0xC4' का उपयोग कर रहे हैं। इस चरित्र को खोजें। इसे हटा दो। –

+2

@ शेन: शायद यह ध्यान देने योग्य है कि 0xc4 यू + 0100 और यू + 013 एफ के बीच [यूटीएफ 8-एन्कोडेड वर्णों का पहला बाइट है (http://www.utf8-chartable.de/unicode-utf8-table.pl? शुरू = 256 और unicodeinhtml = हेक्स)। –

39

से http://jinja.pocoo.org/docs/api/#unicode

Jinja2 यूनिकोड उपयोग कर रहा है आंतरिक रूप से जिसका अर्थ है आप यूनिकोड के लिए वस्तुओं पारित करने के लिए है कि रेंडर फ़ंक्शन या बाइटस्ट्रिंग्स जिनमें केवल ASCII वर्ण होते हैं।

तो जहां भी आप result.result_str सेट करते हैं, आपको इसे यूनिकोड बनाना होगा, उदा।

result.result_str = unicode(my_string_variable, "utf8") 

(यदि आपका बाइट्स UTF8 गया इनकोडिंग यूनिकोड)

या

result.result_str = u"my string" 
+1

धन्यवाद बहुत उपयोगी। – shane

+0

आपने मुझे अभी बचाया, धन्यवाद। –

+0

इस उत्तर ने मुझे स्वीकार्य से अधिक मदद की। मैं स्वीकार किए गए उत्तर में सलाह से सहमत हो सकता हूं - अगर मैं एक महीने का समय ले सकता हूं और अपने 100k एसएलओसी वेबएप को अपनी सीमाओं पर स्ट्रिंग्स को यूनिकोड में सही रूप से परिवर्तित करने के लिए ठीक कर सकता हूं और केवल आंतरिक रूप से यूनिकोड के साथ काम करता हूं तो यह शानदार होगा! - लेकिन मैं डॉलर की वजह से उस सलाह का पालन नहीं कर सकता। यह जानकर कि जिन्जा 2 यूनिकोड का उपयोग कर आंतरिक रूप से मुझे पहचानने में मदद करता है कि मुझे किस बिंदु पर एन्कोडिंग समस्याएं थीं, और उत्पादन बग को हल करने के लिए एक फिक्स लिखें। धन्यवाद दोस्तों! –

3

सरल तार UTF-8 वर्ण बाइट्स हो सकती है, लेकिन वे प्रकार यूनिकोड के नहीं हैं। इसे "डीकोड" द्वारा तय किया जा सकता है जो स्ट्र को यूनिकोड में परिवर्तित करता है। पाइथन 2.5.5 में काम करता है।

my_string_variable.decode ("UTF8")

69

कोशिश में जोड़ने के लिए:

import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

यह मेरी समस्या नहीं है, अच्छी किस्मत तय की।

+0

यह थ्रेड में सबसे अच्छा जवाब है, बहुत परेशानी बचाता है। – AlexLordThorsen

+0

पुनः लोड() के साथ चाल क्या है? क्या यह जादूगर है? (ध्यान दें: यह काम करता है लेकिन मुझे समझ में नहीं आता) –

+0

मुझे वास्तव में समझ में नहीं आता कि यह क्यों काम करता है, लेकिन ऐसा करता है। धन्यवाद – bgusach

-1

या फिर आप अपने कंसोल में

export LANG='en_US.UTF-8' 

ऐसा कर सकते हैं जहां स्क्रिप्ट चलाने।

7

बस जो फ़ाइलें HTML में Jinja2 से उत्पादन की बचत होती है कोड का एक टुकड़ा में एक ही समस्या का सामना करना पड़ा:

with open(path, 'wb') as fh: 
    fh.write(template.render(...)) 

यह Jinja2 दोष आसान है, हालांकि वास्तविक समस्या पायथन के open() के रूप में कौन सा संस्करण के 2.7 नहीं करता है यूटीएफ -8 का समर्थन नहीं करते हैं। फिक्स उतना सरल है जितना:

import codecs 
with codecs.open(path, 'wb', 'utf-8') as fh: 
    fh.write(template.render(...)) 
+0

बहुत बहुत धन्यवाद !!! यह पाइथन 3.5 के साथ, Jinja2 के साथ समस्या हल करता है – Tobal

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

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