1

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));
}

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

根据文档,据我所知,案例折叠通常是与语言环境无关的操作,而排序规则是高度依赖语言环境的操作。

  • 案例折叠方法有时会给出不正确的结果吗?
    (让我害怕的是“一般”这个词。)
  • 有没有时候一个人比另一个人更受欢迎?
4

1 回答 1

0

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

在排序规则的情况下(使用collator_base::secondary),标点符号也将被忽略。这有时是你想要的,有时不是。因此,由您决定,在特定情况下哪个是首选。

文件说:

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

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

于 2014-02-27T07:38:48.757 回答