Поиск без учета регистра в Юникоде на C ++ в Windows
-
06-07-2019 - |
Вопрос
Вчера я задавал аналогичный вопрос, но признаю, что мне нужно сформулировать его по-другому.
Короче говоря:В C ++ в Windows, как мне выполнить поиск строки без учета регистра (внутри другой строки), когда строки находятся в формате unicode (wide char, wchar_t), и я не знаю языка строк.Я просто хочу знать, существует ли иголка в стоге сена.Расположение иглы для меня не имеет значения.
Предыстория:У меня есть репозиторий, содержащий множество электронных писем.Сообщения на разных языках (японский, немецкий, русский, финский;вы называете это сами).Все данные находятся в формате Unicode, и я загружаю их в широкие строки (wchar_t) в моем приложении на C ++ (тела были MIME-декодированы, поэтому в моем отладчике я могу видеть фактические японские и немецкие символы).Я не знаю языка сообщений, поскольку сообщения электронной почты не содержат таких подробностей, кроме того, одно и то же электронное письмо может содержать символы с нескольких языков.
Я ищу что-то вроде wcsstr, но с возможностью выполнять поиск без учета регистра.Я знаю, что невозможно выполнить 100% правильное преобразование из верхнего регистра в нижний, не зная языка текста.Мне нужно решение, которое работает в 99% случаев, когда это возможно.
Я использую Visual Studio 2008 с C ++, STL и Boost.
Решение
Алгоритмы Boost String имеют icontains() иконки () шаблон функции, который может делать то, что вам нужно.
Другие советы
Вы должны указать язык для сравнения без учета регистра.Например, в турецком языке "i" - это НЕ строчная буква, соответствующая "I".Если язык, по-видимому, не указан, значит, сравнение выполняется с неявно выбранным языком.
Вы должны использовать Библиотека отделения интенсивной терапии который обеспечивает поддержку регулярных выражений Unicode, которые следуют правилам Unicode для сопоставления без учета регистра.Библиотека доступна в виде библиотек C / C ++ и Java.Многие другие языки, такие как Python, поддерживают оболочку для библиотек ICU.
вы могли бы преобразовать как "иголку", так и "стог сена" в нижний (или верхний регистр), затем выполнить wcsstr().