9

如何知道子字符串在字符串中的位置,以字符(或符文)而不是字节为单位?

strings.Index(s, sub) 将以字节为单位给出位置。使用 Unicode 时,它​​与符文中的位置不匹配:http ://play.golang.org/p/DnlFjPaD2j

func main() {
    s := "áéíóúÁÉÍÓÚ"
    fmt.Println(strings.Index(s, "ÍÓ"))
}

结果:14。预期:7

当然,我可以手动转换并s查找子切片,但有更好的方法吗?sub[]rune

与此相关,要获取字符串的第一个n字符,我正在这样做:string([]rune(s)[:n]). 这是最好的方法吗?

4

2 回答 2

10

unicode/utf8导入包后,您可以这样做:

func main() {
    s := "áéíóúÁÉÍÓÚ"
    i := strings.Index(s, "ÍÓ")
    fmt.Println(utf8.RuneCountInString(s[:i]))
}

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

于 2014-02-16T10:47:49.293 回答
0

另外一个选项:

package main
import "strings"

func runeIndex(s, substr string) int {
   n := strings.Index(s, substr)
   if n == -1 { return -1 }
   r := []rune(s[:n])
   return len(r)
}

func main() {
   n := runeIndex("áéíóúÁÉÍÓÚ", "ÍÓ")
   println(n == 7)
}
于 2021-05-25T15:12:57.540 回答