【问题标题】:When to case fold and when to collate using Boost.Locale?何时使用 Boost.Locale 进行大小写折叠以及何时进行整理?
【发布时间】: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


【解决方案1】:

我认为这取决于您想要实现的目标。

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

文件说:

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

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

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 2019-09-10
    • 2013-11-28
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多