Boost.Locale представить различные варианты для выполнения сравнения двух строк без учета регистра.
Либо с помощью сопоставления через boost::locale::collator
фаска:
int stricmp_using_collation(const std::string& lhs,
const std::string& rhs,
const std::locale& loc = std::locale())
{
// secondary level ignores character case but considers accents.
return std::use_facet<boost::locale::collator<char>>(loc)
.compare(boost::locale::collator_base::secondary, lhs, rhs);
}
или с помощью случая, складывающегося через boost::locale::fold_case
функция:
int stricmp_using_case_folding(const std::string& lhs,
const std::string& rhs,
const std::locale& loc = std::locale())
{
return boost::locale::fold_case(lhs, loc)
.compare(boost::locale::fold_case(rhs, loc));
}
Промежуточные результаты обеих функций могут быть сохранены, и поэтому обе могут быть оптимизированы, если кто-либо решит это сделать.
Согласно документация, чехол складной есть в общем-то как я понимаю, операция, не зависящая от локали, в то время как сопоставление является операцией, зависящей от локали.
Я думаю, это зависит от того, чего вы хотите достичь.
В случае сопоставления (используя collator_base::secondary
), знаки препинания также будут игнорироваться. Иногда это то, что вы хотите, а иногда нет. Так что вам решать, какой вариант предпочтительнее в конкретном случае.
Документация гласит:
fold_case обычно является независимой от локали операцией, но он получает локаль в качестве параметра для определения 8-битного кодирования.
Для меня в общем-то означает, что в этом случае fold_case
является локаль независима, а локаль только используется для определения 8-битной кодировки. (Но я не являюсь носителем английского языка …)
Других решений пока нет …