Как стать автором
Обновить

Комментарии 14

Очень круто оптимизировано, но есть ли тут кто-то, кому нужна валидация UTF-8 в чистом виде? Не получение из него codepoints, не итерация по нему, не ещё что-то, а чисто валидация?

Первое что приходит в голову: SMTP-сервер может валидировать тела писем перед доставкой адресату, HTTP-сервер может валидировать тела POST-запросов перед передачей скрипту-обработчику.

Если нужно выполнять разбор длинного текста, где преимущественно не-ASCII символы используются, то довольно полезно иметь быструю предфильтрацию.


Если, к примеру, вам прислали байтовый мусор, а вы большую часть входящего текста уже проитерировали и что-то с ним сделали, то обидно узнать под конец, что можно было даже не начинать получать из него codepoints или делать какой-то более ресурсоёмкий анализ

Есть. Всякие фронты и прокси которые потом это передают дальше и отсекают всякий мусор.

По хорошему в протоколах типа websockets должна проходить валидация для входных текстовых данных это из того с чем в последнее столкнулся.

Вообще, они это для своего парсера simdjson сделали, который 3.5гига в секунду парсит, но первый шаг там — валидация UTF-8. И так хорошо получилось, что решили отдельно описать и запаковать, вдруг кому ещё пригодится.

Угу, постоянно применяю fastutf в своем Rspamd, потому что задача валидации utf8 текстов стоит там постоянно и повсюду. Правда, я использую версию от китайца: https://github.com/cyb70289/utf8
который все организовал чуть более удобным для меня способом. Ну и для коротких строк (<64 байт) наивный метод валидации utf оказался быстрее avx2/sse41.
Ну а code points получать тоже приходится, но это потом — вначале нужно понять, не мусор ли у нас на входе, и не надо ли запустить тяжелые эвристики по определению кодировки, например.

Т.е. мусор приходит достаточно часто, чтобы имело смысл валидировать отдельно от парсинга?

Да, весьма часто, а кроме того, если заранее знать, что utf8 валидный, то можно парсить более дешевым способом (в libicu U8_NEXT_UNSAFE вместо U8_NEXT). Хотя я пока это не применял — мне было важнее выбросить мусор пораньше, особенно когда обрабатывается "плохой" трафик, например, со спамтрапов, где как раз стоит вопрос производительности.

Известная библиотека PCRE валидирует UTF-8 (при включении этого режима) до применения регулярки.

Ну если брать тот же раст — то он требует чтобы стрка была валидным UTF8. Поэтому он валидирует вообще все строки которые каким-либо образом появляются в программе (по сети ли, с диска ли). Можно ансейфно создавать строки из набора байт без валидации, но это УБ и так не делают.


Так что да — валидация важна.

Почему раньше никто не додумался до векторизации?
Ну как почему?) Потому что 99.9 лабают никчомные сайтики и ещё более никчомные серваки.
Ну а 0.000..1 действительно заняты делом.

п.с.: Сие можно распространить не только на так называемых «программистов», а и вообще на всех «деятельных» хуманов. Планета такая. Что поделать) На 99.9 не очень удачно заселена. И это сильно мягко выражаясь.
п.п.с.: Да да, очень очень скоро ии будет делать всё за вас. Математики не нужны и прочая прочая бредятина. Чей то кэп. (с)
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.