А зачем мне эта гарантия? Если там кодпоинт, отличный от U+0064, то смело идем дальше, независимо от того, в какую графему входит этот кодпоинт (и входит ли вообще).
Простите, но тогда Вы обсуждаете какой-то свой алгоритм. Описываемый мною (Бойер-Мур) требует сравнения именно символов, именно на конкретных местах в тексте, а не абы каких code point-ов не пойми от чего. Ну или я Вас не понимаю.
Не говоря уже о вопросе - хотим ли мы матчить U+0071 U+0077 и U+0077 U+0071 U+200F?
Более важный вопрос хотим ли мы при поиске U+0062 U+0061 U+0064 находить её в тексте U+0062 U+0061 U+0301 U+0064. Обычно - хотим (блокнот в Win7 правда не находит). И именно в этом месте возникает проблема непостоянной длины символа (в данном случае ударной a), потому что при попытке сравнения по Вашему варианту U+0064 и U+0301 получим ложь (не то сравниваем) и алгоритм поиска ошибётся. И эта ошибка поползёт дальше, так как U+0301 в алфавит искомой строки не входит и шаблон будет сдвинут снова с ошибкой и искомая строка в тексте U+0062 U+0061 U+0301 U+0064 U+0062 U+0061 U+0064 тоже не найдётся (будут сравниваться U+0064 из подстроки и последняя U+0061 из текста), хотя тут она есть
прямо в изначальном виде! А Кнут-Моррис-Пратт её нашёл бы, хотя бы вторую.
Если скажем и шаблон, и текст получены перекодировкой из CP1251 в UTF8,
Как я выше и говорил, это отдельный простой частный случай, с такими проблем нет, вот написать более-менее универсальный метод проблема есть. А бывает нужен именно универсальный (ну хотя бы до какого-то разумного предела) ибо строки в обработку могут приходить из внешних источников, от юзеров весьма невысокой квалификации.
(Банальный пример)
Хранение локализации текстов во внешнем файле (даже на SD карте), причём его может редактировать и добавлять к устройству сам конечный пользователь. Представляете ЧТО там может встречаться? А выводить текст надо, хоть как-то. Это конечно не быстрый поиск, но проблема родственная.
(Свойства UTF8)
свойства UTF8 гарантируют,
Тоже нетривиальный вопрос, хоть стандарт и требует однозначности кодировки, но чисто теоретически кодовое пространство допускает добить каждый код до 6-ти байтов занулив старшие биты (или даже до 8-ми!
). Да, не по стандарту, но иногда может оказаться удобным, если до 4-х байтов добивать, получим всё тот же utf8, но фиксированной длины. Кто его поймёт и правильно обработает - без понятия, надо проверять, не факт что везде уже интегрировали проверку на результирующий код меньше U+110000 и не более чем четырёхбайтовость. Может быть полезно если кто-то понимает исключительно utf8 причём без строгой проверки на стандарт (а utf16 и utf32 не понимает, довольно обыденная ситуация кстати), а для чего-то нужна фиксированная длина кодов, такой вот лайфхак.