Как получить один символ Unicode из строки

Интересно, как я могу получить символ Unicode из строки? Например, если строка "你好", как я могу получить первый символ "你"?

Из другого места я получаю один путь:

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

Это работает. Но у меня все еще есть некоторые вопросы:

  1. Есть ли другой способ сделать это?

  2. Почему в Go str[0] не получает символ Unicode из строки, а получает байтовые данные?

Ответ 1

Сначала вы можете прочитать https://blog.golang.org/strings Он ответит на часть ваших вопросов.

Строка в Go может содержать произвольные байты. Когда вы пишете str [i], результатом является байт, а индекс всегда имеет количество байтов.

В большинстве случаев строки кодируются в UTF-8. У вас есть несколько способов борьбы с кодировкой UTF-8 в строке.

Например, вы можете использовать оператор for... range для итерации по строке rune by rune.

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-й руне строки отсутствует, поскольку размер рун (в байтах) не является постоянным. Если вам нужна эта функция, вы можете легко написать свою собственную вспомогательную функцию, чтобы сделать это (с диапазоном... или с пакетом unicode/utf8).