Unicode 如何从golang中的一串符文中获取子字符串?

Unicode 如何从golang中的一串符文中获取子字符串?,unicode,go,rune,Unicode,Go,Rune,我发现了这一点,但据我所知,这些解决方案并不适合我 如果使用字符串处理的方法作为一个切片( STR〔20〕),它在字符中间中断,我们得到“γ”。�". 编辑:我相信我可以编写一个函数,并将其作为3的倍数,因为符文是int32(32位/(8位/字节))。我必须首先检查是否有符文。只需先将其转换为符文片段,然后再转换回结果: string([]rune(str)[:20]) 您可以在不分配额外内存的情况下获得UTF-8字符串的子字符串(您不必将其转换为runeslice): func子字符串(s字

我发现了这一点,但据我所知,这些解决方案并不适合我

如果使用字符串处理的方法作为一个切片(<代码> STR〔20〕),它在字符中间中断,我们得到“γ”。�".


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

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

string([]rune(str)[:20])

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

func子字符串(s字符串、起始整型、结束整型)字符串{
开始\u str\u idx:=0
i:=0
对于j:=范围s{
如果i==开始{
开始\u str\u idx=j
}
如果i==结束{
返回s[start\u str\u idx:j]
}
我++
}
返回s[start\u str\u idx:]
}
func main(){
s:=”世界 “你好”
fmt.Println(子字符串(s,0,1))//世
fmt.Println(子字符串(s,1,5))//界 他
fmt.Println(子字符串(s,3,8))//您好
}

以下是基于符文技巧的基于长度的实现:

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])
}

如果您不介意实验包,您可以使用:

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

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

请注意,这可能会导致恐慌:运行时错误:如果字符串大小已经小于要剪切的值,则切片边界超出范围