2

大文字と小文字を無視して2つの個別の文字(charまたはUTF-16 )を比較する良い方法は何ですか?wchar_t

些細な実装では、両方を大文字または小文字にします。これらの1つがより良いと考えられていますか、それとも他の方法がありますか?

Unicodeのすべての詳細で完全に正しい比較が不可能であることを理解しています。比較は主に、構成ファイルとマイクロ文法の基本的な解析を目的としているため、完全である必要はありません。文字ごとの比較の制限の下で、それほど間違っていない実装を探しています。

[編集]
これらの構成ファイルには、ユーザーに表示されるテキストが含まれている場合があります。また、ユーザー入力を分析するとき、Unicodeテキストを避けることはできません。

4

4 に答える 4

3

CompareStringExが必要です。ワイド文字を使用し、大文字と小文字を区別しないフラグがあります。

于 2010-02-08T23:14:04.443 に答える
1

最初にそれらを文字列に変換します。たとえば、2つのTCHARの配列を作成し、TCHARを最初のTCHARにコピーして、2番目のTCHARを_T('\ 0')に設定します。次に、lstrcmpiまたはCompareStringを呼び出します。ニーズによっては、どちらも不十分な場合がありますが、良いスタートです。たとえば、ßを大文字にしたい場合、またはユーザーがトルコ語を使用していてiを大文字にしたい場合、自分でそれを行うのは思ったより難しいです。

于 2010-02-09T01:18:16.163 に答える
0

ASCIIベースの大文字と小文字を区別しない比較が必要な場合は、構成ファイルにUnicodeを使用しないでください。これらのファイルにはASCIIを使用してください。そうすれば、ロケールについて心配する必要はありません。

于 2010-02-08T23:04:25.130 に答える
0

英語(ASCII)キーワードに制限する場合は、比較を行う簡単な方法があります。キーワードにAZ以外の文字を使用する場合、これは一般化されませんが、AZではうまく機能します。

この関数に渡す値の1つが、ASCII範囲32〜127(AZ、az、0〜9、ほとんどの記号)の表示可能な文字のみを含む既知の適切なキーワード文字列になることを保証する場合は、次のように簡単なビットマスキングを実行できます。小文字を大文字に変換します。

bool IsKeywordMatch(LPCTSTR psz, LPCTSTR pszKey)
{
    while (pszKey[0])
    {
       if (psz[0] < 0x20)
          return false;

       if ((psz[0] & ~0x20) != (pszKey[0] & ~0x20))
         return false;

       ++psz;
       ++pszKey;
    }
    return true;
}

このコードは汎用の文字列比較ではなく、既知の適切なキーワードを入力文字列と比較することに特化しています。{}を[]の大文字として、 `を大文字の@として、〜を大文字の^として扱いますが、この関数への入力の1つにこれらの文字が含まれないことが保証されている場合は、問題ありません。

このように使用するためのものです

if (IsKeywordMatch(pszInput, "value"))
于 2010-02-08T23:39:55.023 に答える