2008-08-22 17 views
28

मैं Django tutorial में इस मार्ग से अधिक ठोकर खाई:पाइथन/Django में यूनिकोड बनाम यूटीएफ -8 भ्रम?

Django मॉडल एक डिफ़ॉल्ट str() विधि कि यूनिकोड() कॉल करता है और एक UTF-8 bytestring लिए परिणाम धर्मान्तरित है। इसका मतलब है कि यूनिकोड (पी) यूनिकोड स्ट्रिंग लौटाएगा, और स्ट्र (पी) यूटीएफ -8 के रूप में एन्कोड किए गए अक्षरों के साथ एक सामान्य स्ट्रिंग लौटाएगा।

अब, मैं उलझन में हूं क्योंकि afaik यूनिकोड कोई विशेष प्रतिनिधित्व नहीं है, तो पाइथन में "यूनिकोड स्ट्रिंग" क्या है? क्या इसका मतलब यूसीएस -2 है? Googling this "Python Unicode Tutorial" बदल गया जो साहसपूर्वक

यूनिकोड दो-बाइट एन्कोडिंग है जो दुनिया की सभी सामान्य लेखन प्रणालियों को शामिल करता है।

जो सादा गलत है, या यह क्या है? मैं चरित्र सेट और एन्कोडिंग मुद्दों से कई बार उलझन में हूं, लेकिन यहां मुझे पूरा यकीन है कि जो दस्तावेज मैं पढ़ रहा हूं वह उलझन में है। क्या किसी को पता है कि पाइथन में क्या चल रहा है जब यह मुझे "यूनिकोड स्ट्रिंग" देता है?

UTF-16 के रूप में

उत्तर

47

पायथन में "यूनिकोड स्ट्रिंग" क्या है? क्या इसका मतलब यूसीएस -2 है?

पायथन में यूनिकोड तार आंतरिक रूप से या तो जमा हो जाती है यूसीएस -2 (फिक्स्ड लंबाई 16-बिट प्रतिनिधित्व, UTF-16 के रूप में लगभग एक ही है) या यूसीएस-4/UTF-32 (फिक्स्ड लंबाई 32-बिट के रूप में प्रतिनिधित्व)। यह संकलन-समय विकल्प है; विंडोज़ पर यह हमेशा यूटीएफ -16 होता है जबकि कई लिनक्स वितरण ने पायथन के अपने संस्करणों के लिए यूटीएफ -32 ('विस्तृत मोड') सेट किया है।

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

सादा गलत, या यह है?

हाँ, यह काफी गलत है। निष्पक्ष होने के लिए मुझे लगता है कि ट्यूटोरियल पुराना है; यदि संभवतः यूनिकोड 3.1 नहीं है (संस्करण जो मूल बहुभाषी विमान के बाहर वर्ण प्रस्तुत करता है) तो यह संभवतः विस्तृत यूनिकोड स्ट्रिंग्स को पूर्व-दिनांकित करता है।

"यूनिकोड" शब्द का उपयोग करने के विंडोज़ की आदत से विशेष रूप से यूटीएफ -16LE एन्कोडिंग का उपयोग करने की भ्रष्टाचार का एक अतिरिक्त स्रोत है जो एनटी आंतरिक रूप से उपयोग करता है। माइक्रोसॉफ्टलैंड के लोग अक्सर इस कुछ भ्रामक आदत की प्रतिलिपि बना सकते हैं।

+1

कृपया, लोग, इस जवाब को वोट दें, भले ही अन्य चुने गए "उत्तर" को चुना गया हो। – tzot

+0

[शग] दोनों सही हैं; यह 'लेन (' ΤΖΩΤΖΙΟΥ ') == 8' का प्रभाव है जो वास्तव में परिभाषित करता है कि यूनिकोड स्ट्रिंग * क्या है, मुझे लगता है। – bobince

+2

मैं असहमत हूं; मैंने सवाल पढ़ा, और यह कहता है "पायथन में यूनिकोड स्ट्रिंग क्या है"। चुना गया उत्तर यादृच्छिक वाक्यों के जाल की तरह लगता है, जबकि आपका उत्तर बिंदु पर बहुत अधिक लगता है; हालांकि, यह एक मुद्दा है जिसे मैं आगे नहीं बढ़ाऊंगा। चीयर्स :) – tzot

0

अजगर भंडार यूनिकोड। str() यूटीएफ -16 स्ट्रिंग के यूटीएफ -8 प्रतिनिधित्व को वापस कर देगा।

+1

पाइथन प्लेटफॉर्म और संकलन विकल्पों के आधार पर यूटीएफ -16 या यूटीएफ -32 के रूप में यूनिकोड तारों को स्टोर करता है। – tzot

+0

स्ट्रैट (यूनिकोड_स्ट्रिंग) यूटीएफ -8 वापस कौन सा मंच करता है? क्या तुमने कोशिश की? जैसे str (u "\ u0369") – tzot

+2

दोनों गिनती पर गलत है। 'str (unicode_val)' sys.getdefaultencoding() 'के अनुसार एन्कोड करेगा। – Tobu

-1

Wikipedia on UTF-8 से:

UTF-8 (8 बिट यूसीएस/यूनिकोड परिवर्तन स्वरूप) यूनिकोड के लिए एक चर लंबाई वर्ण एन्कोडिंग है। यह यूनिकोड मानक में किसी भी चरित्र का प्रतिनिधित्व करने में सक्षम है, फिर भी यूटीएफ -8 के लिए बाइट कोड और चरित्र असाइनमेंट का प्रारंभिक एन्कोडिंग ASCII के साथ पीछे संगत है। इन कारणों से, यह लगातार ई-मेल, वेब पेज [1], और अन्य स्थानों के लिए पसंदीदा एन्कोडिंग बन रहा है जहां वर्ण संग्रहीत या स्ट्रीम किए जाते हैं।

तो, यूनिकोड के दायरे में आप किस चरित्र का प्रतिनिधित्व करना चाहते हैं, इस पर निर्भर करता है कि यह एक और चार बाइट्स के बीच कहीं भी है।

From Wikipedia on Unicode:

कंप्यूटिंग में, यूनिकोड एक उद्योग मानक कंप्यूटर लगातार प्रतिनिधित्व करते हैं और हेरफेर पाठ में व्यक्त किया दुनिया का लेखन प्रणालियों के सबसे करने की इजाजत दी है।

तो यह दुनिया का लेखन प्रणालियों के सबसे (लेकिन सभी नहीं) का प्रतिनिधित्व करने में सक्षम है।

मैं इस आशा में मदद करता है :)

-2

तो एक "यूनिकोड स्ट्रिंग" पायथन में क्या है?

पायथन 'जानता है' कि आपकी स्ट्रिंग यूनिकोड है। इसलिए यदि आप इस पर regex करते हैं, तो यह पता चलेगा कि कौन सा चरित्र है और जो आदि नहीं है, जो वास्तव में सहायक है। यदि आपने एक स्ट्रेल किया है तो यह सही परिणाम भी देगा। उदाहरण के तौर पर यदि आपने हैलो पर स्ट्रिंग गिनती की है, तो आपको 5 मिलेगा (भले ही यह यूनिकोड हो)। लेकिन अगर आपने एक विदेशी शब्द की स्ट्रिंग गिनती की है और वह स्ट्रिंग यूनिकोड स्ट्रिंग नहीं है तो आपके पास बहुत बड़ा परिणाम होगा। पाइथोंग यूनिकोड स्ट्रिंग डेटाबेस में प्रत्येक चरित्र की पहचान करने के लिए यूनिकोड कैरेक्टर डेटाबेस की जानकारी का उपयोग करता है।उम्मीद है की वो मदद करदे।

8

इस बीच, मैंने यह सत्यापित करने के लिए एक परिष्कृत शोध किया कि पाइथन में आंतरिक प्रतिनिधित्व क्या है, और इसकी सीमाएं क्या हैं। "The Truth About Unicode In Python" एक बहुत अच्छा लेख है जो सीधे पायथन डेवलपर्स से उद्धृत करता है। जाहिर है, एक संकलन-समय स्विच के आधार पर आंतरिक प्रतिनिधित्व या तो यूसीएस -2 या यूसीएस -4 है। तो जॉन, यह यूटीएफ -16 नहीं है, लेकिन आपका जवाब मुझे वैसे भी सही रास्ते पर रखता है, धन्यवाद।

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