我怎样才能知道字符串中子字符串的位置,用字符(或符文)代替字节?
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])
。这是最好的方式吗?
答案 0 :(得分:5)
导入unicode/utf8
包后,您可以这样做:
func main() {
s := "áéíóúÁÉÍÓÚ"
i := strings.Index(s, "ÍÓ")
fmt.Println(utf8.RuneCountInString(s[:i]))
}
答案 1 :(得分: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)
}