Monday, 15 June 2015

Python returns length of 2 for single Unicode character string -


पायथन 2.7:

  में [2]: utf8_str = '\ xf0 \ x 9f [3]: प्रिंट [/ 3]: प्रिंट (यूटीएफ 8_स्ट्रैक) 👍 में [4]: ​​यूनिकोड_स्ट्रिक = utf8_str.decode ('utf-8') में [5]: प्रिंट (यूनिकोड_स्ट्रैथ) 👍 में [6]: यूनिकोड_स्ट्र आउट [ 6]: यू '\ U0001f44d' में [7]: लेन (यूनिकोड_स्ट्रैक) आउट [7]: 2  

चूंकि unicode_str केवल एक यूनिकोड कोड बिंदु (0x0001f44d), len (unicode_str) 1 के बजाय 2 क्यों करता है?

< P> आपका पायथन बाइनरी UCS-2 समर्थन (एक संकीर्ण बिल्ड) के साथ संकलित किया गया था और आंतरिक रूप से बीएमपी (बेसिक बहुभाषी विमान) के बाहर कुछ भी उपयोग किया जाता है।

इसका अर्थ है ऐसी कोडपॉइंट्स को 2 अक्षरों के रूप में दिखाया जाता है जब लंबाई की मांग करते हैं।

आपको अपने पायथन बायनरी को फिर से कंपैले करना होगा, यदि यह मामला ( ./ कॉन्फ़िगर करें --अन्य-यूनिकोड = Ucs4 इसे सक्षम करेगा), या पायथन 3.3 या नए में नवीनीकृत करें, जहां पर यू एक चर-चौड़ाई वाला यूनिकोड प्रकार जो कि एएससीआईआई, यूसीएस -2 और यूसीएस -4 के बीच स्विच करता है जैसे कि निहित कोडपॉइंट्स के लिए आवश्यक है।

पायथन संस्करण 2.7 और 3.0 - 3.2 पर, आप यह पता लगा सकते हैं कि आप किस तरह का निर्माण करेंगे निरीक्षण करना; यह एक विस्तृत यूसीएस -4 निर्माण के लिए एक संकीर्ण यूसीएस -2 निर्माण, 1114111 == 0x10FFFF के लिए 2 ^ 16-1 == 65535 == 0xFFFF होगा। पायथन 3.3 और ऊपर में इसे हमेशा 1114111 पर सेट किया जाता है।

डेमो:

  # संकीर्ण बिल्ड $ bin / python -c 'आयात सिस्टम; प्रिंट sys.maxunicode, len (u "\ U0001f44d"), सूची (यू "\ U0001f44d") '65535 2 [u' \ ud83d ', u' \ udc4d] # वाईड बिल्ड $ अजगर -सी 'आयात सिस्टम; प्रिंट sys.maxunicode, len (u "\ U0001f44d"), सूची (यू "\ U0001f44d") '1114111 1 [u' \ U0001f44d]]  

No comments:

Post a Comment