2013-10-17 6 views
10

मुझे एक फ़ाइल पढ़ने के दौरान कुछ परेशानी हो रही है जिसमें एक निश्चित कॉलम लंबाई प्रारूप है। कुछ कॉलम में umlauts हो सकता है।उमलॉट्स और स्लाइस

उमलॉट्स एक के बजाय 2 बाइट्स का उपयोग करने लगते हैं। यह वह व्यवहार नहीं है जिसकी मैं अपेक्षा कर रहा था। क्या कोई ऐसा काम है जो एक सबस्ट्रिंग देता है? इस मामले में स्लाइस काम नहीं कर रहा है।

http://play.golang.org/p/ZJ1axy7UXe

umlautsString := "Rhön" 
fmt.Println(len(umlautsString)) 
fmt.Println(umlautsString[0:4]) 

प्रिंटों:

5 
Rhö 

उत्तर

12

जाने में, एक तार का एक टुकड़ा, बाइट्स में गिना जाता है नहीं runes

यहां कुछ नमूना कोड है। यही कारण है कि "Rhön"[0:3] आपको Rh और ö का पहला बाइट देता है।

यूटीएफ -8 में एन्कोड किए गए अक्षरों को रन के रूप में दर्शाया जाता है क्योंकि यूटीएफ -8 वर्णों की एक बड़ी श्रृंखला प्रदान करने के लिए एक से अधिक बाइट (चार बाइट तक) में वर्णों को एन्कोड करता है।

यदि आप [] वाक्यविन्यास के साथ एक स्ट्रिंग को टुकड़ा करना चाहते हैं, तो स्ट्रिंग को []rune से पहले कनवर्ट करें। उदाहरण (on play):

umlautsString := "Rhön" 
runes = []rune(umlautsString) 
fmt.Println(string(runes[0:3])) // Rhö 

उल्लेखनीय: This golang blog post about string representation in go

+0

इस उत्तर के लिए धन्यवाद। मुझे नहीं पता था कि '[] rune' में कनवर्ट करना संभव था - इससे मुझे अपने कुछ हालिया कोड को साफ करने की अनुमति मिल जाएगी। –

+0

"यूटीएफ -8 अक्षरों को रन के रूप में एन्कोड किया गया है" बिल्कुल कोई समझ नहीं आता है। क्या आप इसे स्पष्टीकरण, पुनर्लेखन या हटा सकते हैं? – rightfold

+0

@rightfold आप कठोर हो रहे हैं। यह कम से कम 9 अन्य लोगों को समझ में आया है, इसलिए जवाब हटाना सवाल से बाहर है। आप स्पष्टीकरण के लिए अच्छी तरह से पूछ सकते थे, लेकिन इस मामले में ऐसा लगता है कि आप निमो पोस्ट किए गए लिंक का पालन करने के लिए बहुत आलसी थे, जो दोनों विस्तार से बताते हैं कि एक रनवे क्या है। – fresskoma

3

आप []rune करने के लिए string बदलने और इसके साथ काम कर सकते हैं:

package main 

import "fmt" 

func main() { 
    umlautsString := "Rhön" 

    fmt.Println(len(umlautsString)) 

    subStrRunes:= []rune(umlautsString) 

    fmt.Println(len(subStrRunes)) 

    fmt.Println(string(subStrRunes[0:4])) 
} 

http://play.golang.org/p/__WfitzMOJ

आशा है कि मदद करता है!

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