Функция utf8.RuneCount
Функция utf8.RuneCount подсчитывает количество рун в срезе байт. В отличие от встроенной функции len, которая возвращает количество байт, utf8.RuneCount правильно обрабатывает многобайтовые символы UTF-8. В первый параметр мы передаем срез байт (тип []byte), для которого нужно подсчитать количество рун. Функция возвращает количество рун в виде целого числа (тип int).
Синтаксис
utf8.RuneCount(b []byte) int
Пример
Давайте подсчитаем количество рун в строке, содержащей только ASCII-символы:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
b := []byte("abcde")
res := utf8.RuneCount(b)
fmt.Println(res)
}
Результат выполнения кода:
5
Пример
Давайте подсчитаем количество рун в строке, содержащей многобайтовые символы UTF-8:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
b := []byte("Привет, мир!")
res := utf8.RuneCount(b)
fmt.Println(res)
}
Результат выполнения кода:
11
Пример
Давайте сравним результаты utf8.RuneCount и встроенной функции len для строки с эмодзи:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
b := []byte("👍👎")
resLen := len(b)
resCount := utf8.RuneCount(b)
fmt.Println(resLen)
fmt.Println(resCount)
}
Результат выполнения кода:
8
2
Как видите, utf8.RuneCount возвращает правильное количество рун (2), а len возвращает количество байт (8), так как каждый эмодзи занимает 4 байта в кодировке UTF-8.
Смотрите также
-
функцию
utf8.RuneCountInString,
которая подсчитывает количество рун в строке -
функцию
utf8.DecodeRune,
которая декодирует первую руну из среза байт -
функцию
utf8.DecodeRuneInString,
которая декодирует первую руну из строки -
функцию
utf8.Valid,
которая проверяет, является ли срез байт валидным UTF-8