Когда следует свернуть, а когда сопоставить, используя Boost.Locale?

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));
}

Промежуточные результаты обеих функций могут быть сохранены, и поэтому обе могут быть оптимизированы, если кто-либо решит это сделать.

Согласно документация, чехол складной есть в общем-то как я понимаю, операция, не зависящая от локали, в то время как сопоставление является операцией, зависящей от локали.

  • Бывают ли случаи, когда подход с учетом случая дает неверные результаты?
    (Меня пугает слово «в общем»)
  • Есть ли моменты, когда один предпочтительнее другого?

1

Решение

Я думаю, это зависит от того, чего вы хотите достичь.

В случае сопоставления (используя collator_base::secondary), знаки препинания также будут игнорироваться. Иногда это то, что вы хотите, а иногда нет. Так что вам решать, какой вариант предпочтительнее в конкретном случае.

Документация гласит:

fold_case обычно является независимой от локали операцией, но он получает локаль в качестве параметра для определения 8-битного кодирования.

Для меня в общем-то означает, что в этом случае fold_case является локаль независима, а локаль только используется для определения 8-битной кодировки. (Но я не являюсь носителем английского языка …)

0

Другие решения

Других решений пока нет …