2015-06-11 10 views
7

इस बारे में काफी मदद मिली है, लेकिन मैं अभी भी उलझन में हूं। लेकिनयूनिकोड स्ट्रिंग भ्रम की पाइथन लंबाई

title = u'test' 
title_length = len(title) #5 

:

मैं इस तरह एक यूनिकोड स्ट्रिंग है! मुझे लेन होने के लिए लेन (शीर्षक) की आवश्यकता है। ग्राहकों को यह 6 होने की उम्मीद है क्योंकि वे बैकएंड पर मुझसे अलग तरीके से गिनते हैं।

एक कामकाज के रूप में मैंने इस छोटे से सहायक को लिखा है, लेकिन मुझे यकीन है कि इसे बेहतर किया जा सकता है (एन्कोडिंग के बारे में पर्याप्त ज्ञान के साथ) या शायद यह भी गलत है।

title_length = len(title) + repr(title).count('\\U') #6 

1. वहाँ लंबाई होने का एक बेहतर तरीका 6 होने के लिए है? :-)

मुझे लगता है कि मुझे (पायथन) यूनिकोड वर्णों की संख्या की गणना कर रहा है जो 5 है। ग्राहक बाइट्स की संख्या गिन रहे हैं?

2. क्या मेरे तर्क अन्य यूनिकोड वर्णों के लिए तोड़ेंगे जिन्हें उदाहरण के लिए 4 बाइट की आवश्यकता है?

पायथन 2.7 ucs4 चल रहा है।

+3

ग्राहक यूटीएफ -16 सरोगेट जोड़े की गणना करता है। –

+0

जब मैंने उन दो पंक्तियों को चलाने की कोशिश की, तो यह लंबाई 6 के रूप में दिखाया गया। – ssundarraj

+1

@ssundarraj: मेरा जवाब देखें; आप एक पायथन 2 यूसीएस 2 निर्माण चला रहे हैं। पायथन 3.3 या ऊपर का प्रयोग करें, या अपने आप को एक यूसीएस 4 बिल्ड प्राप्त करें। –

उत्तर

6

आपके पास 5 कोडपॉइंट्स है। उन कोडपॉइंट्स में से एक Basic Multilingual Plane के बाहर है जिसका अर्थ है उन कोडपॉइंट्स has to use two code units for the character के लिए यूटीएफ -16 एन्कोडिंग।

दूसरे शब्दों में, ग्राहक कार्यान्वयन के विवरण पर निर्भर है, और कुछ गलत कर रहा है। उन्हें कोड अंक पर गिनना चाहिए, कोड इकाइयां नहीं। ऐसे कई प्लेटफॉर्म हैं जहां यह नियमित रूप से होता है; पायथन 2 यूसीएस 2 बिल्ड ऐसे हैं, लेकिन विंडोज डेवलपर्स अक्सर विंडोज एपीआई के रूप में अंतर के बारे में भूल जाते हैं।

आप अपने टेक्स्ट को यूटीएफ -16 में एन्कोड कर सकते हैं और बाइट्स की संख्या दो से विभाजित कर सकते हैं (प्रत्येक यूटीएफ -16 कोड इकाई 2 बाइट्स है)। utf-16-le या utf-16-be संस्करण उठाओ लंबाई में एक BOM शामिल नहीं करने के लिए:

title = u'test' 
len_in_codeunits = len(title.encode('utf-16-le')) // 2 

आप अजगर 2 उपयोग कर रहे हैं (और स्ट्रिंग आप अच्छी तरह से हो सकता है के लिए u उपसर्ग द्वारा पहचानने), देखते हैं कि ध्यान में रखना पाइथन के 2 अलग-अलग स्वाद, इस पर निर्भर करते हुए कि आपने इसे कैसे बनाया है। बिल्ड-टाइम कॉन्फ़िगरेशन स्विच के आधार पर आपके पास या तो यूसीएस -2 या यूसीएस -4 बिल्ड होगा; पूर्व सरोगेट्स आंतरिक रूप से भी उपयोग करता है, और आपकी title मान की लंबाई भी 6 होगी। Python returns length of 2 for single Unicode character string देखें।

+0

ग्राहक वास्तव में जावा हैं, आप कैसे जानते थे कि वे यूटीएफ -16 सरोगेट जोड़े की गणना कर रहे हैं? क्या यह यूटीएफ -8 या यूटीएफ -32 भी नहीं हो सकता है? क्या मैं सुनिश्चित कर सकता हूं कि वे हमेशा * कोडकॉइंट पर गिनती करते हैं, कोडपॉइंट पर निर्भर करते हुए यह और भी हो सकता है? गिनती की आपकी विधि वास्तव में अधिक सुरुचिपूर्ण लगती है। :-) इस महान स्पष्टीकरण के लिए बहुत बहुत धन्यवाद! – kev

+0

यदि वे एक अलग यूटीएफ कोडेक (यूटीएफ -8 में 8 और यूटीएफ -32 के लिए 5) में कोड इकाइयों की गणना कर रहे थे तो गणना बहुत अलग होगी। हां, यूटीएफ -16 या तो एक या दो कोड इकाइयों का उपयोग करता है, हमेशा, मेरे उत्तर में विकिपीडिया लिंक देखें।जावा कोड तय किया जा सकता है; [जेएसआर -204] देखें (https://jcp.org/en/jsr/detail?id=204) और ['codePointCount()' विधि] (http://docs.oracle.com/javase/7/ डॉक्स/API/जावा/लैंग/String.html # codePointCount (पूर्णांक,% 20int))। –

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