10

我发现了这个,https://groups.google.com/forum/# !topic/golang-nuts/YyKlLwuWt3w但据我所知,这些解决方案对我不起作用。

如果您使用将字符串视为切片(str[:20])的方法,它会在字符中间中断,我们得到“ال�”。

编辑:我相信我可以编写一个函数并将其作为 3 的倍数,因为符文是 int32(32 位/(8 位/字节))。我首先要检查是否有符文。

4

4 回答 4

25

只需先将其转换为符文切片,切片,然后将结果转换回来:

string([]rune(str)[:20])
于 2015-02-25T12:15:23.103 回答
11

您可以在不分配额外内存的情况下获取 UTF-8 字符串的子字符串(不必将其转换为rune切片):

func substring(s string, start int, end int) string {
    start_str_idx := 0
    i := 0
    for j := range s {
        if i == start {
            start_str_idx = j
        }
        if i == end {
            return s[start_str_idx:j]
        }
        i++
    }
    return s[start_str_idx:]
}

func main() {
    s := "世界 Hello"
    fmt.Println(substring(s, 0, 1)) // 世
    fmt.Println(substring(s, 1, 5)) // 界 He
    fmt.Println(substring(s, 3, 8)) // Hello
}
于 2016-07-23T03:12:48.093 回答
1

这是一个基于符文技巧的基于长度的实现:

func substr(input string, start int, length int) string {
    asRunes := []rune(input)

    if start >= len(asRunes) {
        return ""
    }

    if start+length > len(asRunes) {
        length = len(asRunes) - start
    }

    return string(asRunes[start : start+length])
}
于 2019-05-14T11:23:59.553 回答
0

如果你不介意实验包,你可以使用这个:

package main
import "golang.org/x/exp/utf8string"

func main() {
   a := utf8string.NewString("ÄÅàâäåçèéêëìîïü")
   s := a.Slice(1, 3)
   println(s == "Åà")
}

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

于 2020-12-27T18:03:20.013 回答