Функция utf8.RuneCount

Функция utf8.RuneCount подсчитывает количество рун в срезе байт. В отличие от встроенной функции len, которая возвращает количество байт, utf8.RuneCount правильно обрабатывает многобайтовые символы UTF-8. В первый параметр мы передаем срез байт (тип []byte), для которого нужно подсчитать количество рун. Функция возвращает количество рун в виде целого числа (тип int).

Синтаксис

goutf8.RuneCount(b []byte) int

Пример

Давайте подсчитаем количество рун в строке, содержащей только ASCII-символы:

gopackage main

import (
  "fmt"
  "unicode/utf8"
)

func main() {
  b := []byte("abcde")
  res := utf8.RuneCount(b)
  fmt.Println(res)
}

Результат выполнения кода:

go5

Пример

Давайте подсчитаем количество рун в строке, содержащей многобайтовые символы UTF-8:

gopackage main

import (
  "fmt"
  "unicode/utf8"
)

func main() {
  b := []byte("Привет, мир!")
  res := utf8.RuneCount(b)
  fmt.Println(res)
}

Результат выполнения кода:

go11

Пример

Давайте сравним результаты utf8.RuneCount и встроенной функции len для строки с эмодзи:

gopackage main

import (
  "fmt"
  "unicode/utf8"
)

func main() {
  b := []byte("👍👎")
  resLen := len(b)
  resCount := utf8.RuneCount(b)
  fmt.Println(resLen)
  fmt.Println(resCount)
}

Результат выполнения кода:

go8
2

Как видите, utf8.RuneCount возвращает правильное количество рун (2), а len возвращает количество байт (8), так как каждый эмодзи занимает 4 байта в кодировке UTF-8.

Смотрите также

  • функцию utf8.RuneCountInString,
    которая подсчитывает количество рун в строке
  • функцию utf8.DecodeRune,
    которая декодирует первую руну из среза байт
  • функцию utf8.DecodeRuneInString,
    которая декодирует первую руну из строки
  • функцию utf8.Valid,
    которая проверяет, является ли срез байт валидным UTF-8