2014-09-27 11 views
8

पाइथन की स्मृति में यूनिकोड स्ट्रिंग का शाब्दिक रूप से प्रतिनिधित्व कैसे किया जाता है?पायथन में आंतरिक रूप से यूनिकोड का प्रतिनिधित्व कैसे किया जाता है?

उदाहरण के लिए मैं 'abc' मेमोरी में इसके समकक्ष ASCII बाइट्स के रूप में कल्पना कर सकता हूं। इंटीजर को 2 के प्रशंसा प्रतिनिधित्व के रूप में सोचा जा सकता है। हालांकि u'\u2049', भले ही UTF-8 में '\xe2\x81\x89' - 3 बाइट्स के रूप में प्रतिनिधित्व किया गया है, मैं स्मृति में शाब्दिक u'\u2049' कोडपॉइंट को कैसे देखूं?

क्या स्मृति में संग्रहीत एक विशिष्ट तरीका है? क्या पाइथन 2 और पायथन 3 इसका अलग-अलग व्यवहार करते हैं? किसी को भी उत्सुक के लिए

कुछ संबंधित प्रश्नों:

1) How are these strings represented internally in Python interpreter ? I don't understand

2) What is internal representation of string in Python 3.x

उत्तर

10

अजगर 2 और अजगर 3.0-3.2 उपयोग या तो UCS2 * या UCS4 यूनिकोड वर्ण के लिए, यह अर्थ प्रत्येक वर्ण के लिए या तो 2 बाइट्स या 4 बाइट्स का उपयोग करेंगे। कौन सा चुना जाता है एक संकलन-समय विकल्प है।

\u2049 तो आपके सिस्टम की और अगर UCS2 या UCS4 चुना गया था देशी बाइट क्रम के आधार पर या तो \x49\x20 या \x20\x49 या \x49\x20\x00\x00 या \x00\x00\x20\x49 के रूप में प्रतिनिधित्व किया है। एक यूनिकोड स्ट्रिंग में ASCII वर्ण अभी भी प्रति चरित्र 2 या 4 बाइट्स का उपयोग करते हैं।

पायथन 3.3 स्ट्रिंग में सभी वर्णों का प्रतिनिधित्व करने के लिए आवश्यक सबसे कॉम्पैक्ट फ़ॉर्म का उपयोग करके एक नए आंतरिक प्रतिनिधित्व के लिए स्विच किया गया। या तो 1 बाइट, 2 बाइट्स या 4 बाइट उठाए जाते हैं। एएससीआईआई और लैटिन -1 पाठ प्रति चरित्र केवल 1 बाइट का उपयोग करता है, शेष बीएमपी पात्रों को 2 बाइट की आवश्यकता होती है और उसके बाद 4 बाइट्स का उपयोग किया जाता है।

इन प्रतिनिधित्वों पर पूर्ण निचले स्तर के लिए PEP-393: Flexible String Representation देखें।


* तकनीकी रूप से यूसीएस -2 का निर्माण UTF-16 का उपयोग करता है, के रूप में गैर बीएमपी पात्रों 4 बाइट (2 UTF-16 अक्षर) प्रत्येक के लिए सांकेतिक शब्दों में बदलना करने के लिए UTF-16 के किराए की कोख का उपयोग करें। हालांकि, पायथन दस्तावेज अभी भी इसे यूसीएस 2 के रूप में संदर्भित करता है।

यह गैर-बीएमपी यूनिकोड तारों पर len() पर अनपेक्षित व्यवहार का कारण बनता है जिसमें वर्णित वर्णों की संख्या से अधिक लंबा होता है।

+2

यह जानने के लिए कि क्या आपके पास "संकीर्ण" (यूसीएस 2) या "चौड़ा" (यूसीएस 4) निर्माण है, sys.maxunicode की जांच करें। 65535 का अर्थ संकीर्ण है, 1114111 का मतलब चौड़ा है। –

+0

मुझे तकनीकी रूप से लगता है, यह यूटीएफ -16 या यूटीएफ -32 है, यूसीएस 2 या यूसीएस 4 नहीं, क्योंकि सरोगेट जोड़े को संकीर्ण बिल्डों में उपयोग किया जाता है, जिससे इसे यूटीएफ -16 बना दिया जाता है। –

+0

@NedBatchelder: वास्तव में, यह सुनिश्चित नहीं है कि दस्तावेज़ अभी भी यूसीएस का उपयोग करने के लिए क्यों चिपक रहा है। –

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

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