予備的注意:この回答のUnicodeおよびUnicode文字は、質問自体のコンテキストを考慮して、UCS-2(XPまで)およびUTF-16(XP以降)エンコーディングを指し、ワイド文字、、およびその他と交換可能に使用されます。 Win32APIのコンテキストでの用語。Unicode標準は、UTF-8、UTF-16、UTF-32などの複数のエンコードを提供して、同じ数の文字をエンコードします。標準の異なる化身は、異なるスコープを持ちます。代理コードポイントは、基本的な多言語平面(BMP)から脱出するために使用されます。これはおおよそ最初の64Kコードポイントであり、16ビット文字とコードポイントごとに1文字でエンコードできる以上のコードをエンコードします。wchar_t
WCHAR
代理拡張機能は、NT4.0がリリースされた年に渡されたUnicode2.0標準用に開発されましたが、Windowsの最初の「Unicode対応」バージョンであるNT3.51がリリースされてから数年後です。その元の標準はBMPより多くの文字を考慮していなかったため、これは不正確ですが、 Unicode文字またはワイド文字がWin32APIコンテキストでUnicodeと同義語として使用されるようになりました。
あなたが提起した根本的な質問に答えるには:
wchar_t
「==」演算子を使用して文字列を単純に比較することはできませんか?
いいえ、そうではありません。また、「ANSI」文字列でもありません。つまり、char
型を基準として使用します。C文字列(ベースwchar_t
とchar
ベースの両方)はポインタであることを忘れないでください。これは、==
明らかに等しくない2つのポインター値を比較していたことを意味します。結局のところ、1つはリテラル文字列(つまり、プログラムイメージ内)であり、もう1つはヒープのどこかに割り当てられます。したがって、それらは間違いなく2つの異なるエンティティです。
を使用したい場合は==
、C ++などの言語をSTLクラスstd::string
(またはstd::basic_string<_TCHAR>
)または(Windowsの場合)ATLクラスCString
(または)で使用する必要がありますCStringT
。これらのクラスは、スマート文字列クラスと呼ばれることもあり、をオーバーライドするC++機能を使用しますoperator==()
。ただし、セマンティクスは実装によって異なるため、すべてのスマート文字列クラスが文字列の内容を比較するわけではないことに注意してください。単に同等性を比較するものもあればthis
(つまり、同じインスタンスである場合)、文字列の内容を大文字と小文字を区別しないか、大文字と小文字を区別して比較する場合もあります。
C文字列を比較するには、ユースケースで使用できる次の関数があります。
- 「ANSI」文字(
char
)文字列の場合:strcmp
、_stricmp
(および「カウントされた」バリアント:_strncmp
、_strnicmp
...その他あります)
- Unicode文字(
wchar_t
)文字列の場合:wcscmp
、_wcsicmp
(および「カウントされた」バリアント:_wcsncmp
、_wcsnicmp
...その他あります)
- 可変文字「type」(
TCHAR
)文字列の場合: _tcscmp
、_tcsicmp
(および「カウントされた」バリアント:_tcsncmp
、_tcsnicmp
...その他あります)
これらのプレフィックスを覚えておくことができます。
str
->文字列
wcs
->ワイド文字列
tcs
->T文字列
補足:with#include <tchar.h>
とwindows.h
macrosは同等でTEXT
あり_T
、ビルド時の定義に応じて「ANSI」またはUnicodeのいずれかになる文字列リテラルを宣言するために使用されます。同じことが当てはまり_TCHAR
、TCHAR
明らかに、後者はWin32APIコンテキストで好まれているようです。
したがって、Unicodeビルドはに拡張_T("something")
されL"something"
、「ANSI」ビルドはに拡張され"something"
ます。
TCHARに関しては、次のような議論を読むことを検討してください。TCHARはまだ関連性がありますか?( rubenvbによって指摘されています) TCHAR
/使用には賛成と反対の有効なポイントがあり_TCHAR
、決定を下し、それに固執する必要があります-つまり、一貫性があります。