【发布时间】:2013-06-05 11:45:17
【问题描述】:
Boost.Locale 提供了不同的选项来对两个字符串进行不区分大小写的比较。
通过boost::locale::collator facet 使用排序规则:
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,据我所知,大小写折叠通常是独立于语言环境的操作,而排序规则是高度依赖于语言环境的操作。
- 案例折叠方法有时会产生不正确的结果吗?
(让我害怕的是“一般”这个词。) - 是否有优先于另一个的时候?
【问题讨论】:
-
定义“不正确的结果”:S。 AFAIK 唯一常见的依赖于语言环境的案例折叠剪裁涉及土耳其语 i。
-
这两个函数比较不同。
stricmp_using_collation根据给定语言环境的字母进行比较,stricmp_using_case_folding根据全局语言环境的字母进行比较。您应该在stricmp_using_case_folding中使用collator::compare而不是wstring::compare。是的,collator_base::secondary比较级别的排序规则会跳过标点符号,而wstring::compare不会。
标签: c++ unicode collation case-insensitive boost-locale