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によると、大文字と小文字の折り畳みは一般にロケールに依存しない操作ですが、照合は高度にロケールに依存する操作です。
- ケース フォールディング アプローチで誤った結果が得られる場合はありますか?
(私を怖がらせるのは「一般的に」という言葉です。) - どちらかが優先される場合はありますか?