IPython पर निम्नलिखित एक्सचेंज पर विचार शामिल हैं:पायथन: हो रही सही स्ट्रिंग की लंबाई जब यह सरोगेट जोड़े
In [1]: s = u'華袞與緼同歸'
In [2]: len(s)
Out[2]: 8
सही उत्पादन 7
किया जाना चाहिए था, लेकिन इन सात चीनी अक्षरों के पांचवें एक उच्च यूनिकोड कोड है, क्योंकि -पॉइंट, यह केवल एक साधारण कोडपॉइंट की बजाय "सरोगेट जोड़ी" द्वारा यूटीएफ -8 में दर्शाया गया है, और नतीजतन पायथन सोचता है कि यह एक के बजाय दो अक्षर है।
यहां तक कि अगर मैं unicodedata
है, जो सही ढंग से किराए की जोड़ी देता है एक भी कोडपॉइंट (\U00026177
) के रूप में उपयोग करते हैं, जब len()
के लिए पारित गलत लंबाई अभी भी दिया जाता है:
In [3]: import unicodedata
In [4]: unicodedata.normalize('NFC', s)
Out[4]: u'\u83ef\u889e\u8207\u7dfc\U00026177\u540c\u6b78'
In [5]: len(unicodedata.normalize('NFC', s))
Out[5]: 8
के लिए अजगर recompiling की तरह कठोर कदम उठाने के बिना यूटीएफ -32, क्या इस तरह की स्थितियों में सही लंबाई पाने का एक आसान तरीका है?
मैं आईपीथन 0.13, पायथन 2.7.2, मैक ओएस 10.8.2 पर हूं।
चर्चाएं [यहां] (http://stackoverflow.com/questions/9934752/platform-specific-unicode-semantics-in-python-2-7) और [यहां] (http://stackoverflow.com/ प्रश्न/6922480/कैसे-से-एक-विश्वसनीय-यूनिकोड-वर्ण-गिनती-इन-पायथन) प्रासंगिक प्रतीत होता है। – DSM
@DSM: इन्हें खोदने के लिए धन्यवाद। आपका पहला लिंक यूटीएफ -32 ("चौड़ा निर्माण") के लिए संकलित पायथन दिखाता है, जिसे मैंने अपने प्रश्न में अस्वीकार कर दिया था। दूसरे में, वेबेरी द्वारा जवाब वास्तव में सही वर्णों को गिनने के लिए कोड का एक विस्तृत टुकड़ा दिखाता है। मेरा डिफ़ॉल्ट कामकाज उत्तरार्द्ध की तरह है, लेकिन मुझे उम्मीद है कि कुछ अंतर्निहित और अधिक प्रत्यक्ष मौजूद है। – brannerchinese
मैं यहां अपना परिणाम पुन: पेश नहीं कर सकता (उबंटू बॉक्स, पायथन 2.7.2)। यूनिकोड के लिए आप \ u83ef \ u889e \ u8207 \ u7dfc \ U00026177 \ u540c \ u6b78 'मुझे दोनों लेन (ओं) और लेन (यूनिकोड.नोर्मलाइज (' एनएफसी ', एस) के साथ सात की लंबाई मिलती है) – Vicent