РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
220 of 1593 menu

Константа utf8.RuneError

Константа utf8.RuneError — это специальный символ из пакета unicode/utf8, который используется для обозначения некорректных байтов в строке UTF-8. Ее числовое значение — 0xFFFD (или '\uFFFD'). Эта константа применяется во многих функциях пакета, таких как utf8.DecodeRune или utf8.DecodeRuneInString, когда они сталкиваются с байтами, которые не образуют допустимую руну. Вместо ошибки возвращается эта константа, что позволяет продолжить обработку строки, указывая на наличие проблемного участка.

Синтаксис

utf8.RuneError

Пример с некорректной строкой

Давайте создадим строку, содержащую некорректный байт (например, байт 0xC0), и попробуем декодировать из нее первую руну с помощью функции utf8.DecodeRuneInString. В этом случае функция вернет константу utf8.RuneError и размер некорректного байта:

package main import ( "fmt" "unicode/utf8" ) func main() { // строка с некорректным байтом badString := "a\xc0b" r, size := utf8.DecodeRuneInString(badString) fmt.Printf("Руна: %q, Размер: %d, Равна RuneError: %v\n", r, size, r == utf8.RuneError) }

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

"Руна: '�', Размер: 1, Равна RuneError: true"

Пример с функцией utf8.ValidString

Константа utf8.RuneError также используется в связке с функцией utf8.ValidString. Проверим, является ли строка валидной, и если нет — заменим проблемный байт с помощью strings.ToValidUTF8. В месте замены будет использован символ, который передается вторым параметром. Если передать туда string(utf8.RuneError), то мы явно заменим все плохие байты на знак вопроса в ромбе:

package main import ( "fmt" "strings" "unicode/utf8" ) func main() { badString := "Hell\xc0 World" fmt.Println("Исходная строка (с сырыми байтами):", badString) valid := utf8.ValidString(badString) fmt.Println("Является валидной UTF-8:", valid) fixed := strings.ToValidUTF8(badString, string(utf8.RuneError)) fmt.Println("Исправленная строка:", fixed) }

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

"Исходная строка (с сырыми байтами): Hell\xc0 World" "Является валидной UTF-8: false" "Исправленная строка: Hell� World"

Пример с использованием utf8.RuneCountInString

В некоторых случаях, например, при подсчете рун с помощью utf8.RuneCountInString, некорректные байты также учитываются как отдельные руны. Каждая ошибка заменяется на utf8.RuneError и считается как одна руна:

package main import ( "fmt" "unicode/utf8" ) func main() { str := "a\xc0\xc1b" count := utf8.RuneCountInString(str) fmt.Println("Количество рун (с ошибками):", count) // Для сравнения выведем руны по отдельности for i := 0; i < len(str); { r, size := utf8.DecodeRuneInString(str[i:]) fmt.Printf("%q ", r) i += size } }

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

"Количество рун (с ошибками): 4" "'a' '�' '�' 'b' "

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

  • константу utf8.MaxRune,
    которая определяет максимальное значение руны
  • константу utf8.UTFMax,
    которая показывает максимальное количество байтов для кодировки руны
  • функцию utf8.ValidString,
    которая проверяет строку на валидность UTF-8
  • функцию utf8.RuneCountInString,
    которая подсчитывает количество рун в строке
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить