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));
}
可以存储两个函数的中间结果,因此如果选择这样做,两者都可以进行优化。
根据documentation,案例折叠一般一个与语言环境无关的操作,而整理是一个高度依赖于语言环境的操作,据我所知。
答案 0 :(得分:0)
我认为这取决于你想要达到的目标。
在整理案例中(使用collator_base::secondary
),标点符号也会被忽略。这有时是你想要的,有时也不是。因此,由您来决定,在特定情况下哪个是首选。
文件说:
fold_case通常是与语言环境无关的操作,但它接收一个语言环境作为参数来确定8位编码。
对于我来说通常意味着在这种情况下,fold_case
区域设置独立,并且区域设置仅按顺序使用确定8位编码。 (但我不是英语母语人士......)