2010-06-04 17 views
6

मुझे Django में यूटीएफ -8 के रूप में एक ndash चरित्र को संग्रहित और आउटपुट करने में समस्या हो रही है।क्या Django डबल यूनिकोड (utf-8?) स्ट्रिंग एन्कोडिंग है?

मुझे एक एपीआई से डेटा मिल रहा है। डेटा के कच्चे रूप में, के रूप में, लिया गया है और एक पाठ संपादक में देखी दी इकाई के समान हो सकता है:

"I love this detergent \u2013 it is so inspiring." 

(\ u2013 & ndash है; एक html इकाई के रूप में)।

यदि मुझे यह सीधे एक एपीआई से मिलता है और इसे Django में प्रदर्शित करता है, कोई समस्या नहीं है। यह मेरे ब्राउज़र में एक लंबे डैश के रूप में प्रदर्शित करता है। मैंने देखा कि मुझे "ascii 'कोडेक चरित्र को एन्कोड नहीं कर सकता है, इससे बचने के लिए मुझे decode('utf-8') करना है" अगर मैं अपने दृश्य में उस पाठ के साथ कुछ संचालन करने का प्रयास करता हूं तो त्रुटि। Django डीबग टूलबार के अनुसार, पाठ टेम्पलेट पर जा रहा है, "मुझे यह डिटर्जेंट पसंद है \" यह बहुत प्रेरणादायक है। "

जब MySQL करने के लिए जमा हो जाती है और एक ही देख सकते हैं और टेम्पलेट के माध्यम से उत्पादन के लिए पढ़ने के लिए, तथापि, यह ऊपर की तरह

"I love this detergent – it is so inspiring" 

मेरे MySQL तालिका DEFAULT CHARSET=utf8 पर सेट है की तलाश में समाप्त होता है।

अब, जब मैं MySQL के माध्यम से डेटाबेस से डेटा को पढ़ने के लिए एक टर्मिनल UTF-8 के लिए सेट में पर नजर रखने, इसे

"I love this detergent – it is so inspiring" 

रूप में दिखाता है -

जब (सही एक ndash से पता चलता) मैं एक अजगर खोल में mysqldb उपयोग करते हैं, इस लाइन

"I love this detergent \xe2\x80\x93 it is so inspiring" 

(यह सही UTF-8 एक ndash के लिए है) है 0

हालांकि, अगर मैं python manage.py shell चलाने के लिए, और उसके बाद

In [1]: import myproject.myapp.models ThatTable 
In [2]: msg=ThatTable.objects.all().filter(thefield__contains='detergent') 
In [3]: msg 
Out[4]: [{'thefield': 'I love this detergent \xc3\xa2\xe2\x82\xac\xe2\x80\x9c it is so inspiring'}] 

यह मेरे लिए प्रतीत होता है कि Django \xe2\x80\x93 ले लिया है तीन अलग-अलग पात्रों मतलब करने के लिए, और UTF-8 के रूप में यह इनकोडिंग \xc3\xa2\xe2\x82\xac\xe2\x80\x9c में। यह एक € "के रूप में प्रदर्शित होता है क्योंकि \ xe2 प्रतीत होता है, \ x80 प्रतीत होता है, आदि। मैंने जांच की है और यह यह टेम्पलेट पर भी कैसे भेजा जा रहा है।

यदि आप पाइथन में लंबे अनुक्रम को डीकोड करते हैं, हालांकि decode('utf-8') के साथ, परिणाम \xe2\u20ac\u201c है जो ब्राउज़र में भी प्रदान करता है। इसे फिर से डीकोड करने की कोशिश कर एक यूनिकोडडेकोड एरर उत्पन्न करता है।

मैंने Django suggestions for Unicode का पालन किया है, जहां तक ​​मुझे पता है (कॉन्फ़िगर किया गया MySQL)।

किसी भी सुझाव पर जो मैंने गलत कॉन्फ़िगर किया हो?

परिशिष्ट ऐसा लगता है यह एक ही मुद्दा अन्य क्षेत्रों या सिस्टम के रूप में अच्छी तरह से में काटी गई है।, के रूप में, जबकि \ xc3 \ xa2 \ XE2 \ x82 \ XAC \ XE2 \ x80 \ x9c, मैं http://pastie.org/908443.txt एक में पाया के लिए खोज स्क्रिप्ट 'खराब यूटीएफ 8 इकाइयों की मरम्मत' करने के लिए, एक आरएसएस आरएसएस आयात प्लग में भी पाया गया। यह इस अनुक्रम को – के साथ बदल देता है। मैं इसे सही तरीके से हल करना चाहता हूं, यद्यपि!

ओह, और मैं Django 1.2 और पायथन 2.6.5 का उपयोग कर रहा हूं।

मैं PHP/पीडीओ के साथ एक ही डेटाबेस से कनेक्ट कर सकता हूं और कुछ भी विशेष किए बिना इस डेटा को प्रिंट कर सकता हूं, और यह ठीक दिखता है।

उत्तर

1

यह डबल-एन्कोडिंग के मामले की तरह प्रतीत होता है; मुझे पाइथन के साथ बहुत अधिक अनुभव नहीं है, लेकिन http://tahpot.blogspot.com/2005/06/mysql-and-python-and-unicode.html

पर मुझे सलाह के अनुसार MySQL कनेक्शन सेटिंग्स को समायोजित करने का प्रयास करें जो मैं अनुमान लगा रहा हूं वह यह है कि कनेक्शन लैटिन 1 है, इसलिए MySQL स्ट्रिंग को फिर से एन्कोड करने का प्रयास करता है यूटीएफ -8 क्षेत्र में भंडारण। वहाँ कोड, विशेष रूप से इस बिट:

संपादित करें: init_command = 'सेट नाम UTF8': अजगर के साथ जब एक डेटाबेस कनेक्शन निम्नलिखित फ्लैग जोड़ने की स्थापना।

इसके अलावा सेट MySQL के my.cnf में निम्नलिखित: डिफ़ॉल्ट-चरित्र-सेट = UTF8

शायद तुम क्या चाहते है।

+0

यह अजीब बात है, लेकिन 'सेट नाम utf8' को कॉल करना समस्या को और भी खराब बनाता है। तस्वीर के बाहर Django को एक पाइथन खोल में छोड़कर, यह उस चरित्र को \ xc3 \ xa2 \ xe2 \ x82 \ xac \ xe2 \ x80 \ x9c' बनाता है। तो अगर मैं 'सेट नाम लैटिन 1' कहता हूं, तो चरित्र '\ xe2 \ x80 \ x93' बन जाता है। PHP में, यह â € ¢ एक € ¢ एक € ¢ "से जाता है। इसलिए, इसे लैटिन 1 पर सेट करने से वास्तव में यह PHP में ठीक काम करता है। मुझे पूरा यकीन है कि वास्तव में कनेक्शन तैयार करने के लिए Django 'सेट नाम utf8' कहता है। – JAL

+1

आह, ऐसा लगता है कि मुझे डेटा डालने से पहले 'सेट नाम' कॉल करने की आवश्यकता है। – JAL

+0

डेटा को php में सम्मिलित करना, यानी। मैं आगे बढ़ूंगा और अपना जवाब स्वीकार करूंगा (हालांकि मुझे भविष्य के पाठकों के लिए ध्यान देना चाहिए, समाधान PHP कनेक्शन के लिए 'सेट नाम utf8'' को कॉल करना था, पाइथन एक नहीं) – JAL

0

मैंने अपने PHP डेटा सम्मिलन अनुक्रम में set names utf8 जोड़ा, और अब एक पाइथन खोल में भयभीत ndash \ x96 के रूप में दिखाई देता है। Django के माध्यम से पढ़ने और आउटपुट जब यह सही ढंग से प्रस्तुत करता है।

इस बारे में एक असामान्य स्थिति यह है कि मैं PHP के माध्यम से डेटा डाल रहा हूं। Django set names utf8 स्वचालित रूप से जारी करता है, इसलिए यदि मैं Django के माध्यम से डेटा डालने और पढ़ने में सक्षम था, तो यह समस्या प्रकट नहीं होती। PHP लैटिन 1 के डिफ़ॉल्ट का उपयोग कर रहा था, मुझे लगता है कि

एक दिलचस्प नोट के रूप में, इससे पहले कि मैं PHP से डेटा पढ़ सकता था और यह सामान्य रूप से ब्राउज़र में दिखाई देता था, अब ndash है जब तक कि मैं डेटा पढ़ने से पहले set names पर कॉल नहीं करता ।

तो, अब यह काम कर रहा है और मुझे उम्मीद है कि मुझे कभी भी समझना नहीं होगा कि जो भी पहले हो रहा था!

+0

हां, यह आपके साथ एक समस्या होगी पुराना डेटा यदि आप अपने डीबी को थोड़ी देर के लिए ऑफ़लाइन ले सकते हैं, तो आप लैटिन 1 पर वापस आने वाले कॉलम बदल सकते हैं; फिर, उन्हें blobs के लिए सेट; फिर, उन्हें वापस utf8 पर सेट करें। यह पुराने डबल-एन्कोडेड स्ट्रिंग को ठीक करना चाहिए। – phsource

+0

शुक्र है कि मैंने इसे विकास चरण में पकड़ा है, इसलिए मेरे पास सब कुछ जांचने के लिए टेबल को छोड़ने, छंटनी और फिर से बनाने के लिए आनंददायक लचीलापन है। यह बाकी साइट के लिए आसान हो सकता है, हालांकि ... मुझे नहीं पता कि हमारे पास अन्य डेटा है जो गलत-एन्कोडेड है। टिप के लिए धन्यवाद कि यह कैसे करें। – JAL

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