何时折叠以及何时使用Boost.Locale进行整理?

时间:2013-06-09 19:35:55

标签: c++ unicode collation case-insensitive 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));
}

可以存储两个函数的中间结果,因此如果选择这样做,两者都可以进行优化。

根据documentation,案例折叠一般一个与语言环境无关的操作,而整理是一个高度依赖于语言环境的操作,据我所知。

  • 是否有时候案例折叠方法会给出不正确的结果?
    (这是“一般”这个词让我感到害怕。)
  • 有时候一个人优先于另一个吗?

1 个答案:

答案 0 :(得分:0)

我认为这取决于你想要达到的目标。

在整理案例中(使用collator_base::secondary),标点符号也会被忽略。这有时是你想要的,有时也不是。因此,由您来决定,在特定情况下哪个是首选。

文件说:

  

fold_case通常是与语言环境无关的操作,但它接收一个语言环境作为参数来确定8位编码。

对于我来说通常意味着在这种情况下,fold_case 区域设置独立,并且区域设置按顺序使用确定8位编码。 (但我不是英语母语人士......)