Pull to refresh

Comments 6

std::search работает с байтами, поэтому для UTF-8 нужен слой декодирования или специализированная библиотека.

В принципе UTF-8 гарантирует, что если needle и hasytack являются валидными UTF-8 строками, простой байтовый поиск найдёт корректную подстроку (поскольку старшие биты однозначно определяют, является ли данный байт отдельным символом, первым байтом многобайтовой последовательности или одним из следующих байтов). Позицию при этом получим в байтах, а не в символах - от задачи зависит, устроит ли такое.

Это если предварительно сделали нормализацию текста, иначе текст с акцентами может быть по разному представлен и вы не найдете.

Согласен, по сути байтовым поиском можно найти только конкретную последовательность UTF-8 codepoint'ов. Но если, скажем, надо найти ASCIIшную последовательность (тэги или ключевые слова в документе с UTF-8 содержимым), этого достаточно.

auto ci_equal = [](char a, char b)

Это должно быть
auto ci_equal = []( unsinged char a, unsigned char b)

и никаких static_cast<unsigned char>(a) внутри не нужно.

"На локалях с отрицательными байтами" - какой-то бред.

Вообще-то всё правильно было, вы просто заменили явное приведение signed -> unsigned неявным.

Особенно нравится ваш код ‘ "ERROR", "ERROR" + 5’. Возлагается надежда на компилятор, что он текстовые константы положит в сегмент статических данных только для чтения ровно один раз, хотя в стандарте про такую оптимизацию не просят.

Sign up to leave a comment.

Information

Website
otus.ru
Registered
Founded
Employees
101–200 employees
Location
Россия
Representative
OTUS