2016-02-02 3 views
8
जूलिया, Learn Julia in Y Minutes को परिचयात्मक गाइड

, अनुक्रमण UTF8 तार से उन हतोत्साहित:जूलिया में यूटीएफ 8 स्ट्रिंग्स को इंडेक्सिंग क्यों किया जा रहा है?

# Some strings can be indexed like an array of characters 
"This is a string"[1] # => 'T' # Julia indexes from 1 
# However, this is will not work well for UTF8 strings, 
# so iterating over strings is recommended (map, for loops, etc). 

क्यों पुनरावृत्ति है इस तरह के तार से अधिक हतोत्साहित किया? विशेष रूप से इस वैकल्पिक स्ट्रिंग प्रकार की संरचना के बारे में क्या अनुक्रमण त्रुटि प्रवण बनाता है? क्या यह जूलिया विशिष्ट पिटफॉल है, या यह यूटीएफ 8 स्ट्रिंग सपोर्ट के साथ सभी भाषाओं में विस्तारित है?

+1

के बाद से UTF-8 यूनिकोड की एक मल्टी-बाइट एन्कोडिंग, एक UTF-8 स्ट्रिंग में अनुक्रमण, या लंबाई (हो रही अक्षरों में तरह बातें इकाइयों कोड करने के लिए विरोध के रूप में के रूप में) ओ (एन) (जहां एन स्ट्रिंग का आकार है) ऑपरेशन। यदि आपको अक्सर ऐसी चीजें करने की ज़रूरत है, तो आप यूटीएफ 32 स्ट्रिंग का उपयोग करना बंद कर देंगे, और आवश्यकतानुसार यूटीएफ 8 में/से कनवर्ट करना होगा। यह जूलिया विशिष्ट पिटफॉल नहीं है, लेकिन पाइथन 3 जैसी कुछ भाषाएं यूनिकोड स्ट्रिंग्स के लिए सर्वश्रेष्ठ आंतरिक प्रतिनिधित्व चुन सकती हैं, जो स्ट्रिंग के आधार पर इंडेक्सिंग के लिए अभी भी ओ (1) हैं। –

उत्तर

11

क्योंकि यूटीएफ 8 में एक चरित्र हमेशा एक बाइट में एन्कोड नहीं होता है।

उदाहरण के लिए जर्मन भाषा स्ट्रिंग böse (बुराई) लें। UTF8 एन्कोडिंग में इस स्ट्रिंग के बाइट्स हैं:

0x62 0xC3 0xB6 0x73 0x65 
b ö   s e 

आप ऊमलायूट देख सकते हैं ö 2 बाइट्स की आवश्यकता है।

अब यदि आप सीधे इस यूटीएफ 8 एन्कोडेड स्ट्रिंग "böse"[4] को इंडेक्स करते हैं तो आपको s और e नहीं मिलेगा।

हालांकि, अगर आप जूलिया में एक iterable वस्तु के रूप में स्ट्रिंग का उपयोग कर सकते हैं:

julia> for c in "böse" 
      println(c) 
     end 
b 
ö 
s 
e 

और चूंकि आपके द्वारा पूछे गए, नहीं, UTF8 तार के साथ सीधे बाइट अनुक्रमण मुद्दे नहीं जूलिया लिए विशिष्ट हैं। आगे पढ़ने के लिए

सिफारिश:
http://docs.julialang.org/en/release-0.4/manual/strings/#unicode-and-utf-8

+2

आप 'chr2ind' का उपयोग करके पुनरावृत्त भी कर सकते हैं जो बाइट इंडेक्स से चरित्र सूचकांक में परिवर्तित होता है:' I में 1: लंबाई (ओं); सी = chr2ind (एस, i); println (रों [सी]); end'। – amrods

+5

@amrods आप इसके बजाय 'graphemes' फ़ंक्शन का उपयोग कर सकते हैं:' संग्रह (graphemes ("böse")) 'रिटर्न' ["बी", "ö", "एस", "ई"] ' – SalchiPapa

+0

@ismael बहुत अच्छा पता है ... धन्यवाद – amrods

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