Когда следует свернуть, а когда сопоставить, используя 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-битной кодировки. (Но я не являюсь носителем английского языка...)

Другие вопросы по тегам