2

文字列に部分文字列が含まれているかどうかを確認する必要がありますが、現在のロケールの規則に従っています。

したがって、スペイン語ロケールで文字列「aba」を検索すると、「cabalgar」、「rábano」、「gabán」の 3 つすべてに含まれます。

文字列をロケール情報と比較 (照合) できることはわかっていますが、find を使用して同じことを行うための組み込みまたは簡単な方法はありますか、それとも自分で作成する必要がありますか?

std::string (最大 TR1) または MFC の CString を使用しても問題ありません

4

3 に答える 3

3

参考までに、ICU バックエンドでコンパイルされたブースト ロケールを使用した実装を次に示します。

#include <iostream>
#include <boost/locale.hpp>

namespace bl = boost::locale;

std::locale usedLocale;

std::string normalize(const std::string& input)
{
    const bl::collator<char>& collator = std::use_facet<bl::collator<char> >(usedLocale);
    return collator.transform(bl::collator_base::primary, input);
}

bool contain(const std::string& op1, const std::string& op2){
    std::string normOp2 = normalize(op2);

    //Gotcha!! collator.transform() is returning an accessible null byte (\0) at
    //the end of the string. Thats why we search till 'normOp2.length()-1'
    return  normalize(op1).find( normOp2.c_str(), 0, normOp2.length()-1 ) != std::string::npos;
}

int main()
{
    bl::generator generator;
    usedLocale = generator(""); //use default system locale

    std::cout << std::boolalpha
                << contain("cabalgar", "aba") << "\n"
                << contain("rábano", "aba") << "\n"
                << contain("gabán", "aba") << "\n"
                << contain("gabán", "Âbã") << "\n"
                << contain("gabán", "aba.") << "\n"
}

出力:

true
true
true
true
false
于 2014-09-28T19:12:44.103 に答える
1

文字列インデックスをループして、部分文字列を検索したい文字列と比較できますstd::strcoll

于 2013-09-26T07:35:47.063 に答える