2010-01-28 14 views
9

मेरे पास यूनिकोड में एक स्ट्रिंग है और मुझे पहले एन वर्णों को वापस करने की आवश्यकता है। मैं यह कर रहा हूं:यूनिकोड स्ट्रिंग के पहले एन अक्षरों को लौटाना

result = unistring[:5] 

लेकिन निश्चित रूप से यूनिकोड तार की लंबाई = वर्णों की लंबाई। कोई विचार? एकमात्र समाधान फिर से उपयोग कर रहा है?

संपादित करें: अधिक जानकारी

unistring = "Μεταλλικα" #Metallica written in Greek letters 
result = unistring[:1] 

returns->?

मुझे लगता है कि यूनिकोड स्ट्रिंग्स दो बाइट्स (चार) हैं, यही कारण है कि यह बात होती है। अगर मैं कार्य करें:

result = unistring[:2] 

मैं

M

जो सही है, मिलता तो, मैं हमेशा काट चाहिए * 2 या मैं कुछ करने के लिए कनवर्ट करना चाहिए?

+0

क्या आप सुनिश्चित हैं कि आपके पास वास्तविक यूनिकोड स्ट्रिंग है, और यूटीएफ -8 डेटा के साथ एक बाइट्रिंग नहीं है? यदि हां, तो आप 'चरित्र' को कैसे परिभाषित करते हैं? (यूनिकोड तार कोडपॉइंट्स (यूसीएस -4 बिल्डों में) या कोडुनिट्स के तार हैं।) –

+1

हमारे होस्ट से: http://www.joelonsoftware.com/articles/Unicode.html – Will

+0

, कृपया नहीं। यह वास्तव में यहां लागू नहीं है। – Joey

उत्तर

6

दुर्भाग्य से पायथन 3.0 से पहले ऐतिहासिक कारणों के लिए दो स्ट्रिंग प्रकार हैं। byte strings (str) and Unicode strings (unicode)

पायथन 3.0 में एकीकरण से पहले स्ट्रिंग शाब्दिक घोषित करने के दो तरीके हैं: unistring = "Μεταλλικα" जो एक बाइट स्ट्रिंग और unistring = u"Μεταλλικα" है जो एक यूनिकोड स्ट्रिंग है।

? जब आप result = unistring[:1] करते हैं तो कारण है क्योंकि आपके यूनिकोड टेक्स्ट में से कुछ वर्ण गैर-यूनिकोड स्ट्रिंग में सही ढंग से प्रदर्शित नहीं किए जा सकते हैं। यदि आपने कभी भी वास्तव में पुराने ईमेल क्लाइंट का उपयोग किया है और उदाहरण के लिए ग्रीस जैसे देशों में मित्रों से ईमेल प्राप्त किए हैं, तो आपने शायद इस तरह की समस्या देखी है।

तो पाइथन 2.x में यदि आपको यूनिकोड को संभालने की आवश्यकता है तो आपको इसे स्पष्ट रूप से करना होगा। पाइथन में यूनिकोड से निपटने के लिए इस परिचय पर एक नज़र डालें: Unicode HOWTO

+0

"Μεταλλικα" एक ASCII स्ट्रिंग नहीं है। यह स्क्रिप्ट को बचाने के लिए उपयोग किए गए एन्कोडिंग में एक बाइट स्ट्रिंग है। –

+2

आप सही हैं मार्क इन्हें एएससीआईआई स्ट्रिंग्स के बजाए बाइट स्ट्रिंग के रूप में संदर्भित करना अधिक सही है, मैंने तदनुसार जवाब अपडेट किया है। मैं वास्तव में व्यक्त करने की कोशिश कर रहा था कि ASCII पाठ (या आपके कंप्यूटर पर कोड पृष्ठों के आधार पर समकक्ष बाइट स्ट्रिंग) एकमात्र चीज है जिसे सुरक्षित रूप से बाइट तारों से छेड़छाड़ की जा सकती है। –

+1

यूनिकोड हाउटो लिंक मर चुका है – jeremyvillalobos

8

आप जब कहते हैं:

unistring = "Μεταλλικα" #Metallica written in Greek letters 

आप एक यूनिकोड स्ट्रिंग नहीं है। आपके पास (संभवतः) यूटीएफ -8 में एक बाइटिंग है। यह वही बात नहीं है। एक यूनिकोड स्ट्रिंग पायथन में एक अलग डेटाटाइप है। आप सही एन्कोडिंग का उपयोग bytestrings डिकोडिंग द्वारा यूनिकोड मिलती है:

unistring = "Μεταλλικα".decode('utf-8') 

या सही एन्कोडिंग घोषणा के साथ एक स्रोत फ़ाइल में यूनिकोड शाब्दिक का उपयोग करके

# coding: UTF-8 
unistring = u"Μεταλλικα" 

यूनिकोड स्ट्रिंग क्या करेंगे आप क्या चाहते हैं जब आप unistring[:5] करें।

+0

आपको .decode() उदाहरण से पहले "# कोडिंग: utf-8" की आवश्यकता होगी, और फ़ाइल वास्तव में utf-8 में सहेजी जानी चाहिए। पाइथन 2.x स्क्रिप्ट को डीकोड करते समय ASCII को डिफ़ॉल्ट करता है। गैर-ASCII वर्णों के किसी भी उपयोग के लिए फ़ाइल को सहेजने के लिए उपयोग किए गए एन्कोडिंग की घोषणा करने के लिए # कोडिंग लाइन की आवश्यकता होती है। –

+1

पायथन 2.5 में और बाद में आपको गैर-ASCII सामग्री वाले किसी भी स्रोत फ़ाइल पर कोडिंग घोषणा की आवश्यकता है, हां। (इससे पहले यह सिर्फ एक चेतावनी है।) कोडिंग घोषणा हालांकि कोड के अर्थ को नहीं बदलेगी, क्योंकि यह केवल बाइट्सिंग में बाइट्स है। –

+1

-1 यह सही नहीं है "कुछ यूनिकोड परीक्षण" [: 5] अवैध अनुक्रम दे सकता है, क्योंकि यूटीएफ -16 वैरिएबल चौड़ाई एन्कोडिंग है, इसलिए "यूनिकोड" स्ट्रिंग काटने से यूटीएफ -8 स्ट्रिंग – Artyom

4

किसी भी प्रकार के "यूनिकोड स्ट्रिंग" के साथ कोई सही सीधा-आगे दृष्टिकोण नहीं है।

यहां तक ​​कि पायथन "यूनिकोड" यूटीएफ -16 स्ट्रिंग में चरम लंबाई वर्ण हैं, इसलिए आप केवल ustring [: 5] के साथ काट नहीं सकते हैं। चूंकि कुछ यूनिकोड कोड बिंदु अधिक से अधिक "चरित्र" यानी सरोगेट जोड़े का उपयोग कर सकते हैं।

तो तुम 5 कोड अंक कटौती (ध्यान दें कि इन पात्रों नहीं हैं) करना चाहते हैं ताकि आप पाठ का विश्लेषण, http://en.wikipedia.org/wiki/UTF-8 और http://en.wikipedia.org/wiki/UTF-16 परिभाषाओं नज़र आ सकती है। तो आपको सीमाओं को समझने के लिए कुछ मास्क का उपयोग करने की आवश्यकता है।

इसके अलावा आपको अभी भी वर्ण नहीं मिलते हैं। उदाहरण के लिए। शब्द "שָלוֹם" - हिब्रू में शांति "शालोम" में 4 वर्ण और 6 कोड अंक पत्र "शिन", स्वर "ए" अक्षर "लम्बा हुआ", अक्षर "वाव" और स्वर "ओ" और अंतिम अक्षर "मेम" होता है।

तो चरित्रकोड बिंदु नहीं है।

अधिकांश पश्चिमी भाषाओं के लिए जहां दो अक्षरों वाले अक्षरों को दो कोड बिंदुओं के रूप में दर्शाया जा सकता है। "यूनिकोड सामान्यीकरण" के लिए उदाहरण के लिए खोजें।

तो ... यदि आपको वास्तव में 5 पहले वर्णों की आवश्यकता है तो आपको आईसीयू लाइब्रेरी जैसे टूल का उपयोग करना होगा। उदाहरण के लिए पाइथन के लिए आईसीयू लाइब्रेरी है जो वर्ण सीमा इटरेटर प्रदान करती है।

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