मुझे 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/पीडीओ के साथ एक ही डेटाबेस से कनेक्ट कर सकता हूं और कुछ भी विशेष किए बिना इस डेटा को प्रिंट कर सकता हूं, और यह ठीक दिखता है।
यह अजीब बात है, लेकिन 'सेट नाम utf8' को कॉल करना समस्या को और भी खराब बनाता है। तस्वीर के बाहर Django को एक पाइथन खोल में छोड़कर, यह उस चरित्र को \ xc3 \ xa2 \ xe2 \ x82 \ xac \ xe2 \ x80 \ x9c' बनाता है। तो अगर मैं 'सेट नाम लैटिन 1' कहता हूं, तो चरित्र '\ xe2 \ x80 \ x93' बन जाता है। PHP में, यह â € ¢ एक € ¢ एक € ¢ "से जाता है। इसलिए, इसे लैटिन 1 पर सेट करने से वास्तव में यह PHP में ठीक काम करता है। मुझे पूरा यकीन है कि वास्तव में कनेक्शन तैयार करने के लिए Django 'सेट नाम utf8' कहता है। – JAL
आह, ऐसा लगता है कि मुझे डेटा डालने से पहले 'सेट नाम' कॉल करने की आवश्यकता है। – JAL
डेटा को php में सम्मिलित करना, यानी। मैं आगे बढ़ूंगा और अपना जवाब स्वीकार करूंगा (हालांकि मुझे भविष्य के पाठकों के लिए ध्यान देना चाहिए, समाधान PHP कनेक्शन के लिए 'सेट नाम utf8'' को कॉल करना था, पाइथन एक नहीं) – JAL