Я пишу декодер UTF-8, и я не знаю, как правильно обрабатывать недействительные кодовые точки:
- суррогаты
- кодовые точки больше 0x10ffff
Предположим, что я хотел бы заменить недействительные кодовые точки на 0xfffd.Теперь, как я должен заменить их?Сразу после того, как я узнаю, что кодовая точка не может быть действительной, или я должен декодировать / использовать все байты, которые предписывает первый байт?
Например, предположим, что поток UTF-8 содержит: 0xf4 0x90 0x80 0x80
Эти байты декодируют до 0x110000
, недопустимой кодовой точки.
Но на втором байте, когда обрабатывается 0xf4 0x90
, я знаю, что он не может быть действительной кодовой точкой, независимо от того, чтопоследние два байта:
Итак, должен ли этот поток генерировать одну ошибку (и одну замену), или он должен генерировать 3 ошибки (потому что 0xf4 0x90
недопустим, а затем 0x80
и другой 0x80
также недействителен)?
Существует ли стандарт, который предписывает это?Если нет, что может быть лучшей практикой?