2015-06-04 6 views
14

मैं देशों की सूची के लिए django_countries मॉड्यूल का उपयोग कर रहा हूं, समस्या यह है कि 'Åland Islands' और 'Saint Barthélemy' जैसे विशेष वर्ण वाले कुछ देश हैं।django देश एन्कोडिंग सही नाम नहीं दे रहा है

मैं देश का नाम प्राप्त करने के लिए इस विधि बोल रहा हूँ:

country_label = fields.Country(form.cleaned_data.get('country')[0:2]).name 

मुझे पता है कि country_label Django utils के आलसी अनुवाद प्रॉक्सी वस्तु है, लेकिन यह सही नाम नहीं बल्कि न जताए यह 'Ã…land Islands' देता है। कृपया इसके लिए कोई सुझाव?

उत्तर

0

कोशिश:

from __future__ import unicode_literals #Place as first import. 

और/या

country_label = fields.Country(form.cleaned_data.get('country')[0:2]).name.encode('latin1').decode('utf8') 
+0

दोनों समाधान काम नहीं करते हैं। दूसरा एक अपवाद देता है। ' – Maverick

4

Django भंडार unicode स्ट्रिंग का उपयोग कोड अंक और आगे की प्रक्रिया के लिए यूनिकोड के रूप में स्ट्रिंग को पहचानती है। यूटीएफ -8 चार 8-बिट बाइट्स एन्कोडिंग का उपयोग करता है, इसलिए unicode स्ट्रिंग जिसका उपयोग Django द्वारा किया जा रहा है, किसी बिंदु पर कोड बिंदु नोटेशन से इसके यूटीएफ -8 नोटेशन में डीकोड या व्याख्या की जानी चाहिए। आलैंड द्वीप समूह के मामले में, ऐसा होने वाला प्रतीत होता है कि यह यूटीएफ -8 बाइट एन्कोडिंग ले रहा है और इसे स्ट्रिंग को परिवर्तित करने के लिए कोड पॉइंट के रूप में व्याख्या करता है।

स्ट्रिंग django_countries रिटर्न u'\xc5land Islands' है जहां \xc5 Å का यूटीएफ कोड पॉइंट नोटेशन है। यूटीएफ -8 बाइट नोटेशन में \xc5\xc3\x85 बन जाता है जहां प्रत्येक नंबर \xc3 और \x85 एक 8-बिट बाइट है। देखें: http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=xc5&mode=hex

या आप उपयोग कर सकते हैं country_label = fields.Country (form.cleaned_data.get ('देश') [0: 2])। Name.encode ('utf-8') u'\xc5land Islands' से लिए जाने के लिए '\xc3\x85land Islands'

आप तो प्रत्येक बाइट लेते हैं और उन्हें कोड अंक के रूप में उपयोग करते हैं, आप इसे आप इन पात्रों दे देंगे देखेंगे: Ã… देखें: http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=xc3&mode=hex और: http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=x85&mode=hex

देखें कोड के HTML अंकन के साथ टुकड़ा ये पात्र

<div id="test">&#xC3;&#x85;&#xC5;</div>

तो मेरा अनुमान है कि आप आप आवेदन में 2 अलग एनकोडिंग की है। एक तरीका यह u'\xc5land Islands'u'\xc3\x85land Islands' करने से प्राप्त करने के लिए UTF-8 में एक utf-8 पर्यावरण एनकोड जो '\xc3\x85' को u'\xc5' बदल जाएगा और उसके बाद iso-8859 से unicode को डिकोड जो u'\xc3\x85land Islands' देना होगा में होगा। लेकिन चूंकि यह आपके द्वारा प्रदान किए जा रहे कोड में नहीं है, इसलिए मुझे लगता है कि यह country_label सेट करने के पल के बीच कहीं और हो रहा है और जिस समय आपका आउटपुट ठीक से प्रदर्शित नहीं होता है। या तो स्वचालित रूप से एन्कोडिंग सेटिंग्स के कारण, या किसी स्पष्ट असाइनमेंट के माध्यम से कहीं भी।

पहले संपादन:

, एप्लिकेशन आपके लिए एन्कोडिंग सेट करने के लिए अपने टेम्पलेट की अपनी py फ़ाइल और <meta charset="UTF-8"> के शीर्ष पर # -*- coding: utf-8 -*- जोड़ें। और एक django.utils.functional से यूनिकोड स्ट्रिंग प्राप्त करने के लिए। प्रॉक्सी ऑब्जेक्ट आप unicode() पर कॉल कर सकते हैं।

country_label = unicode(fields.Country(form.cleaned_data.get('country')[0:2]).name) 

दूसरा संपादित:

एक अन्य यह पता लगाने की है, जहां समस्या force_bytes (https://docs.djangoproject.com/en/1.8/ref/utils/#module-django.utils.encoding) का उपयोग किया जाएगा जिस तरह से इस तरह:

from django.utils.encoding import force_bytes 
country_label = fields.Country(form.cleaned_data.get('country')[0:2]).name 
forced_country_label = force_bytes(country_label, encoding='utf-8', strings_only=False, errors='strict') 

लेकिन आप के बाद से इस तरह सफलता के बिना पहले से ही कई रूपांतरणों की कोशिश की है, शायद समस्या अधिक जटिल है। क्या आप अपना संस्करण django_countries, Python और अपनी django ऐप भाषा सेटिंग्स साझा कर सकते हैं? आप जो भी कर सकते हैं वह सीधे आपके djano_countries पैकेज (जो आपकी पायथन निर्देशिका में होना चाहिए) में देखें, फ़ाइल data.py ढूंढें और यह देखने के लिए इसे खोलें कि यह कैसा दिखता है। शायद डेटा खुद दूषित हो गया है।

+0

अमान्य निरंतरता बाइट मैं' country_label = fields.Country (form.cleaned_data.get ('देश' का प्रयोग किया: दूसरा विकल्प में मैं 'मिल UnicodeDecodeError UnicodeDecodeError: 'UTF8' कोडेक स्थिति 0 में बाइट 0xc5 डिकोड नहीं कर सकते हैं) [0: 2])। Name.encode ('utf-8') कोड में लेकिन फिर भी इसे 'Ã ... भूमि 'के रूप में प्रस्तुत किया गया। मैं टेम्पलेट प्राप्त करने के लिए रेंडर विधि का उपयोग कर रहा हूँ। – Maverick

+0

संपादित देखें, मुझे लगता है कि देश_लाबेल सीधे संदर्भ में जाता है और प्रस्तुत किए जाने से पहले डीबी में सहेजा नहीं जाता है? –

+0

@mad_programmer क्या होता है यदि आप 'यूनिकोड()' को एन्कोडिंग तर्क पास करते हैं, तो इस तरह: 'यूनिकोड (फ़ील्ड। काउंटी (...)। नाम,' यूटीएफ -8 ')'? – xyres

0

बस इस सप्ताह मुझे एक समान एन्कोडिंग त्रुटि का सामना करना पड़ा। मेरा मानना ​​है कि समस्या यह है क्योंकि मशीन एन्कोडिंग पाइथन पर एक के साथ अलग है। इसे अपने .bashrc या .zshrc में जोड़ने का प्रयास करें।

export LC_ALL=en_US.UTF-8 
export LANG=en_US.UTF-8 

फिर, एक नया टर्मिनल खोलें और फिर Django ऐप चलाएं।

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