Ответ 1
Например,
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
s := "a\xc5z"
fmt.Printf("%q\n", s)
if !utf8.ValidString(s) {
v := make([]rune, 0, len(s))
for i, r := range s {
if r == utf8.RuneError {
_, size := utf8.DecodeRuneInString(s[i:])
if size == 1 {
continue
}
}
v = append(v, r)
}
s = string(v)
}
fmt.Printf("%q\n", s)
}
Вывод:
"a\xc5z"
"az"
FAQ - UTF-8, UTF-16, UTF-32 и спецификация
Q: Существуют ли последовательности байтов, которые не генерируются UTF? Как Должен ли я их интерпретировать?
A: Ни один из UTF не может генерировать каждую произвольную последовательность байтов. Для Например, в UTF-8 должен соблюдаться каждый байт формы 110xxxxx2 с байтом формы 10xxxxxx2. Последовательность, такая как < 110xxxxx2 0xxxxxxx2 > является незаконным и никогда не должен генерироваться. Когда эта незаконная последовательность байтов при преобразовании или интерпретации, UTF-8 соответствующий процесс должен обрабатывать первый байт 110xxxxx2 как незаконный ошибка завершения: например, сигнализация об ошибке, фильтрация байта или представление байта с маркером, таким как FFFD (ХАРАКТЕР ЗАМЕНЫ). В последних двух случаях он будет продолжаться обработка второго байта 0xxxxxxx2.
Сопоставительный процесс не должен интерпретировать незаконный или плохо сформированный байт последовательности как символы, однако он может принимать действия по восстановлению ошибок. Никакой соответствующий процесс не может использовать нерегулярные последовательности байтов для кодирования внеполосная информация.