如何在golang

时间:2015-05-15 15:44:08

标签: string unicode go

我是golang的初学者。我想知道如何从字符串中获取unicode字符。
就像,字符串是“你好”,我怎样才能得到第一个字符“你”?
从其他地方我得到一种方式:

var str="你好"
runes_array := []rune(str)
fmt.Println(string(runes_array[0]))

确实有效 但我还有一些问题:
1)还有另一种方法吗? 2)为什么golang不能使用str [0]从字符串中获取unicode字符,
但得到字节数据?

4 个答案:

答案 0 :(得分:17)

首先,您可能需要阅读https://blog.golang.org/strings 它将回答你的部分问题。

Go中的字符串可以包含任意字节。当你写str [i]时,结果是一个字节,索引总是一个字节数。

大多数情况下,字符串是以UTF-8编码的。您有多种方法可以在字符串中处理UTF-8编码。

例如,您可以使用for ... range语句按符号迭代字符串符文。

var first rune
for _,c := range str {
    first = c
    break
}
// first now contains the first rune of the string

您还可以使用unicode / utf8包。例如:

r, size := utf8.DecodeRuneInString(str)
// r contains the first rune of the string
// size is the size of the rune in bytes

如果字符串是以UTF-8编码的,则没有直接的方法来访问字符串的第n个符文,因为符文的大小(以字节为单位)不是常量。如果您需要此功能,您可以轻松编写自己的辅助函数(使用for ...范围或使用unicode / utf8包)。

答案 1 :(得分:1)

如果您希望第一个符文为string,则可以

func firstChar(str string) string {
    return strings.Split(str, "")[0]
}

但是,如果您希望将其作为rune,@ DidierSpezia解决方案是最好的

func firstRune(str string) (r rune) {
  for _, r = range str {
      return
  }
  return
}

答案 2 :(得分:0)

您可以执行以下操作:

func main() {
  str := "cat"
  var s rune
  for i, c := range str {
    if i == 2 {
      s = c
    }
  }
}

s现在等于a

答案 3 :(得分:-1)

您可以使用 utf8string 包:

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

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

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