1

Boost.Localeは、大文字と小文字を区別しない 2 つの文字列の比較を実行するためのさまざまなオプションを提供します。

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によると、大文字と小文字の折り畳みは一般にロケールに依存しない操作ですが、照合は高度にロケールに依存する操作です。

  • ケース フォールディング アプローチで誤った結果が得られる場合はありますか?
    (私を怖がらせるのは「一般的に」という言葉です。)
  • どちらかが優先される場合はありますか?
4

1 に答える 1

0

何を達成したいかによると思います。

照合の場合 ( を使用collator_base::secondary)、句読点も無視されます。これは、必要な場合もあれば、そうでない場合もあります。したがって、特定のケースでどちらを優先するかを決定するのはあなた次第です。

ドキュメントには次のように記載されています。

fold_case は通常、ロケールに依存しない操作ですが、パラメーターとしてロケールを受け取り、8 ビットのエンコーディングを決定します。

私にとって一般的には、この場合、それfold_case ロケールに依存しないことを意味し、ロケールは8ビットエンコーディングを決定するためにのみ使用されます。(しかし、私は英語のネイティブ スピーカーではありません...)

于 2014-02-27T07:38:48.757 に答える