Как декодер UTF-8 должен правильно обрабатывать некорректные кодовые точки (суррогаты, больше 0x10ffff)? - PullRequest
0 голосов
/ 30 сентября 2018

Я пишу декодер UTF-8, и я не знаю, как правильно обрабатывать недействительные кодовые точки:

  • суррогаты
  • кодовые точки больше 0x10ffff

Предположим, что я хотел бы заменить недействительные кодовые точки на 0xfffd.Теперь, как я должен заменить их?Сразу после того, как я узнаю, что кодовая точка не может быть действительной, или я должен декодировать / использовать все байты, которые предписывает первый байт?

Например, предположим, что поток UTF-8 содержит: 0xf4 0x90 0x80 0x80

Эти байты декодируют до 0x110000, недопустимой кодовой точки.

Но на втором байте, когда обрабатывается 0xf4 0x90, я знаю, что он не может быть действительной кодовой точкой, независимо от того, чтопоследние два байта:

Итак, должен ли этот поток генерировать одну ошибку (и одну замену), или он должен генерировать 3 ошибки (потому что 0xf4 0x90 недопустим, а затем 0x80 и другой 0x80также недействителен)?

Существует ли стандарт, который предписывает это?Если нет, что может быть лучшей практикой?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Консорциум Unicode, похоже, обеспокоен только точностью (не отбрасывая хорошие байты) и безопасностью (не соединяя два куска хорошего текста вместе, потому что сканер безопасности мог бы пропустить текст при рассмотрении плохих байтов, но, возможно, имел бызаблокировал убранный текст).Это позволяет другим определять любые конкретные практики.(Похоже, что он предложил лучшие практики, но откажется , поскольку W3C их формализовал.)

W3C, конечно, заботится о безопасности, но также и о последовательности, о которой вы просите.Он говорит об ошибке (например, вставить заменяющий символ) для каждой плохо сформированной подпоследовательности, согласно очень подробному эталонному алгоритму декодера UTF-8 .

0 голосов
/ 02 октября 2018

Я нашел ответ в стандарте Unicode, глава 03 , стр. 126-129:

  • Стандарт Unicode предписывает, что правильно сформированная подпоследовательность не должна использоватьсякак часть неправильно сформированной последовательности (хотя в моем примере такой случай не содержится)
  • есть рекомендация следовать W3C: должна быть сгенерирована одна ошибка для максимальной части неправильно сформированной подпоследовательности (см. определение в связанном документе)
  • второй байт 0xf4 0x90 0x80 0x80 недопустим, поэтому я должен генерировать 4 ошибок, если рекомендация выполняется (потому что2-й байт недействителен, максимальная часть в начале просто 0xf4)

Если мой пример был 0xf4 0x8f 0x41, то я должен генерировать только ошибку 1 ,0xf4 0x8f - максимальная подпоследовательность, а 0x41 - правильно сформированная подпоследовательность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...