Comments 6
std::searchработает с байтами, поэтому для UTF-8 нужен слой декодирования или специализированная библиотека.
В принципе UTF-8 гарантирует, что если needle и hasytack являются валидными UTF-8 строками, простой байтовый поиск найдёт корректную подстроку (поскольку старшие биты однозначно определяют, является ли данный байт отдельным символом, первым байтом многобайтовой последовательности или одним из следующих байтов). Позицию при этом получим в байтах, а не в символах - от задачи зависит, устроит ли такое.
Это если предварительно сделали нормализацию текста, иначе текст с акцентами может быть по разному представлен и вы не найдете.
autoci_equal = [](chara,charb)
Это должно бытьauto ci_equal = []( unsinged char a, unsigned char b)
и никаких static_cast<unsigned char>(a) внутри не нужно.
"На локалях с отрицательными байтами" - какой-то бред.
Особенно нравится ваш код ‘ "ERROR", "ERROR" + 5’. Возлагается надежда на компилятор, что он текстовые константы положит в сегмент статических данных только для чтения ровно один раз, хотя в стандарте про такую оптимизацию не просят.
Всё про std::search и где его применять