如何用UTF-8字符串检查golang中的字符值?

时间:2016-04-21 06:59:00

标签: string go utf-8

我试图检查字符串中的第一个字符是否与以下字符匹配,请注意UTF-8引号字符:

var yy = [];

由于最后两次检查中的特殊字符,此代码不起作用。

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

索引string索引其字节(以UTF-8编码 - 这就是Go如何在内存中存储字符串),但是你想测试第一个字符。

因此,您应该获得第一个rune而不是第一个byte。为了提高效率,您可以使用utf8.DecodeRuneInString(),它仅解码第一个rune。如果您需要string的所有符文,则可以使用类似all := []rune("I'm a string")的类型转换。

见这个例子:

for _, s := range []string{"asdf", ".asdf", "”asdf"} {
    c, _ := utf8.DecodeRuneInString(s)
    if c != '.' && c != ',' && c != '?' && c != '“' && c != '”' {
        fmt.Println("Ok:", s)
    } else {
        fmt.Println("Not ok:", s)
    }
}

输出(在Go Playground上尝试):

Ok: asdf
Not ok: .asdf
Not ok: ”asdf

答案 1 :(得分:2)

添加到@ icza的好答案:值得注意的是,虽然字符串的索引是以字节为单位,但range字符串是符文。所以以下内容也有效:

for _, s := range []string{"asdf", ".asdf", "”asdf"} {
    for _, c := range s {
        if c != '.' && c != ',' && c != '?' && c != '“' && c != '”' {
            fmt.Println("Ok:", s)
        } else {
            fmt.Println("Not ok:", s)
        }
        break // we break after the first character regardless
    }
}