2015-05-15 28 views
12

में स्ट्रिंग से एकल यूनिकोड-कैरेक्टर कैसे प्राप्त करें मैं गोलांग का शुरुआत कर रहा हूं। मुझे आश्चर्य है कि मैं स्ट्रिंग से यूनिकोड कैरेक्टर कैसे प्राप्त कर सकता हूं।
की तरह, स्ट्रिंग "你好" है, मैं पहला अक्षर "你" कैसे प्राप्त कर सकता हूं?
गोलांग

var str="你好" 
runes_array := []rune(str) 
fmt.Println(string(runes_array[0])) 

यह करता है काम:
अन्य जगह से मैं एक तरह से मिलता है।
लेकिन मेरे पास अभी भी कुछ प्रश्न हैं:
1) क्या इसे बनाने का कोई और तरीका है?
2) golang में क्यों str उपयोग नहीं कर सकते [0], स्ट्रिंग से यूनिकोड चरित्र मिलता
        लेकिन बाइट डाटा प्राप्त करने के लिए?

उत्तर

11

सबसे पहले, आप https://blog.golang.org/strings पढ़ना चाहेंगे यह आपके प्रश्नों का उत्तर देगा।

गो में एक स्ट्रिंग में मनमाने ढंग से बाइट शामिल हो सकते हैं। जब आप str लिखते हैं [i], परिणाम एक बाइट है, और सूचकांक हमेशा बाइट्स की संख्या है।

अधिकांश समय, तारों को यूटीएफ -8 में एन्कोड किया जाता है। स्ट्रिंग में यूटीएफ -8 एन्कोडिंग से निपटने के आपके पास कई तरीके हैं।

उदाहरण के लिए, आप रन के द्वारा स्ट्रिंग रन पर पुनरावर्तित करने के लिए ... श्रेणी विवरण का उपयोग कर सकते हैं।

var first rune 
for _,c := range str { 
    first = c 
    break 
} 
// first now contains the first rune of the string 

आप यूनिकोड/utf8 पैकेज का लाभ उठा सकते हैं। उदाहरण के लिए: स्ट्रिंग UTF-8 में एन्कोड किया गया है

r, size := utf8.DecodeRuneInString(str) 
// r contains the first rune of the string 
// size is the size of the rune in bytes 

है, वहाँ, स्ट्रिंग के n वें रूण का उपयोग करने के लिए कोई सीधा रास्ता है, क्योंकि runes का आकार (बाइट्स में) स्थिर नहीं है। यदि आपको इस सुविधा की आवश्यकता है, तो आप इसे करने के लिए आसानी से अपना स्वयं का सहायक कार्य लिख सकते हैं (इसके लिए ... श्रेणी, या यूनिकोड/utf8 पैकेज के साथ)।

+0

आपकी मदद के लिए धन्यवाद। दूसरा तरीका केवल पहला यूनिकोड चरित्र प्राप्त कर सकता है, यह अपूर्ण लगता है। मैं पहली तरह समझ गया, और मुझे लगता है कि मैं अपनी समस्या को हल करने के लिए इसे संशोधित कर सकता हूं। और मुझे अभी भी आश्चर्य है कि क्या कोई आसान है एक स्ट्रिंग से सूचकांक द्वारा यूनिकोड charcter पाने के लिए rway। –

+1

* आसान * तरीका वही करना है जो आपने किया था: [] rune (str) [अनुक्रमणिका]। और एक सबस्ट्रिंग के लिए वही: स्ट्रिंग ([] rune (str) [अनुक्रमणिका: अनुक्रमणिका + लंबाई])। सबसे सरल मामलों के लिए वास्तव में कुछ भी फैनसीयर करने का कोई कारण नहीं है। – Aedolon

+0

एक [] रनवे में कनवर्ट करना हालांकि आवंटित होगा। यह संभवतः गैर प्रदर्शन संवेदनशील कोड में स्वीकार्य है। –