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