Константа 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,
которая подсчитывает количество рун в строке