Поиск без учета регистра в Юникоде в C ++ в Windows - PullRequest
1 голос
/ 24 октября 2009

Я задал похожий вопрос вчера, но осознаю, что мне нужно перефразировать его по-другому.

Короче говоря: В C ++ в Windows, как мне сделать поиск строки без учета регистра (внутри другой строки), когда строки в формате Юникод (широкий символ, wchar_t), и я не знаю язык строк. Я просто хочу знать, существует ли игла в стоге сена. Расположение иглы мне не подходит.

Справочная информация: У меня есть хранилище, содержащее много электронных писем. Сообщения на разных языках (японский, немецкий, русский, финский; вы называете это). Все данные представлены в формате Unicode, и я загружаю их в широкие строки (wchar_t) в моем приложении C ++ (тела были декодированы MIME, поэтому в моем отладчике я могу видеть настоящие японские, немецкие символы). Я не знаю язык сообщений, так как сообщения электронной почты не содержат этой детали, также одно тело письма может содержать символы из нескольких языков.

Я ищу что-то вроде wcsstr, но с возможностью выполнять поиск без учета регистра. Я знаю, что невозможно сделать 100% правильное преобразование из верхнего регистра в нижний регистр, не зная языка текста. Я хочу решение, которое работает в 99% случаев, когда это возможно.

Я использую Visual Studio 2008 с C ++, STL и Boost.

Ответы [ 4 ]

4 голосов
/ 25 октября 2009

Вы должны указать язык для сравнения без учета регистра. Например, на турецком языке «i» НЕ является строчной буквой, соответствующей «I». Если кажется, что язык не указан, то сравнение выполняется с неявно выбранным языком.

1 голос
/ 24 октября 2009

Алгоритмы Boost String имеют шаблон функции icontains () , который может делать то, что вам нужно.

0 голосов
/ 25 октября 2009

вы можете преобразовать и иглу, и стог сена в нижний регистр (или верхний регистр), а затем выполнить wcsstr ().

0 голосов
/ 24 октября 2009

Вы должны использовать библиотеку ICU , которая обеспечивает поддержку регулярных выражений Unicode, которые следуют правилам Unicode для сопоставления без учета регистра. Библиотека доступна в виде библиотек C / C ++ и Java. Многие другие языки, такие как Python, поддерживают оболочку для библиотек ICU.

...