在golang中如何切分unicode/ascii字符串?

16

我需要在Go中对字符串进行切片。可能的值可以包含拉丁字符和/或阿拉伯/中文字符。在下面的例子中,对于阿拉伯字符串“alphabet”,切片注释[:1]返回了一个非预期的值/字符。

    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


3
дҪ еҸҜд»ҘдҪҝз”Ёgolang.org/x/exp/utf8stringдёӯзҡ„Atж–№жі•гҖӮ - ferhatelmas
2个回答

32

首先,您应该阅读有关Go语言中的字符串、字节和符文的相关文章

这是如何实现您想要的: Go playground(我无法正确粘贴阿拉伯符号,但如果中文可以工作,则阿拉伯语也应该可以工作)。

    s := "abcdefghijklmnop" 
    fmt.Println(s[2:9]) 

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

输出结果为:

cdefghi
百科:关于中文

10
好的,已经生效了。谢谢。注意:我使用utf8.RuneCountInString(s)来获取字符串大小,而不是len(s)函数,因为len(s)函数计算的是字节数,而不是字符数。http://golang.org/pkg/builtin/#len - Jonathan Simon Prates

0
你可以使用 utf8string 包:
package main
import "golang.org/x/exp/utf8string"

func main() {
   a := utf8string.NewString("")
   // example 1
   r := a.At(1)
   // example 2
   s := a.Slice(1, 3)
   // example 3
   n := a.RuneCount()
   // print
   println(r == '', s == "", n == 5)
}

https://pkg.go.dev/golang.org/x/exp/utf8string


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接