gounicodeutf-8slicerune

Slice unicode/ascii strings in golang?


I need to slice a string in Go. Possible values can contain Latin chars and/or Arabic/Chinese chars. In the following example, the slice annotation [:1] for the Arabic string alphabet is returning a non-expected value/character.

    package main
    
    import "fmt"
    
    func main() {
        a := "a"
        fmt.Println(a[:1]) // works
        
        b := "ذ"
        fmt.Println(b[:1]) // does not work
        fmt.Println(b[:2]) // works
    
        fmt.Println(len(a) == len(b)) // false
    }

http://play.golang.org/p/R-JxaxbfNL


Solution

  • First of all, you should really read about strings, bytes and runes in Go.

    And here is how you can achieve what you want: Go playground (I was not able to properly paste arabic symbols, but if Chinese works, arabic should work too).

        s := "abcdefghijklmnop" 
        fmt.Println(s[2:9]) 
    
        s = "维基百科:关于中文维基百科" 
        fmt.Println(string([]rune(s)[2:9]))
    

    The output is:

    cdefghi
    百科:关于中文