文字列を示す "abc"、_T("abc")、L"abc" は全て意味が違う!

文字を代入するときに使う " " (ダブルクオーテーション)。Windowsプログラミングでは_T(" ") を見かけることが多いから、それに倣って...

char	pszText[256];

strcpy(pszText,_T("あいうえお"));

というようなソースコードを書いていないだろうか?残念ながらこれは大きな間違えだ。実はこの _T(" ")いうのはcharやWCHARに対してTCHARがあるのと同じで、ユニコードビルド時はユニコード文字列を、非ユニコード文字列時はSHIFT-JISなどの文字列を指す文字列になる。
対してstrcpyが扱う文字列は常に非ユニコード文字列のみだ。つまりユニコードビルド時にchar型に対してWCHAR型のユニコード文字列を代入しようとするソースコードになっている。

char	pszText[256];

strcpy(pszText,"あいうえお");

だから上のように従来のようなソースコードが正しい。では文字列型にTCHARを利用した場合はどうだろうか?

TCHAR	pszText[256];

strcpy(pszText,"あいうえお");

上のソースコードも間違えだ。先ほど説明したようにstrcpyの引数は常にchar型なのに対し、このソースコードではユニコードビルド時にWCHAR型が渡されるからだ。ではどうしたらいいのかと言うと、

TCHAR	pszText[256];

_tcscpy(pszText,_T("あいうえお"));

上のようになる。strcpyの代わりに_tcscpyを利用して、さらに文字列は _T(" ") で囲む。
この_tcscpyというのはTCHAR型用の文字列コピー関数で、ユニコードビルド時はWCHAR型文字列のコピー用関数wcscpyを、非ユニコードビルド時は従来のstrcpyかマルチバイト文字列用の_mbscpyと同等の処理になる。

最後に残った L" " という文字列の表現は...ここまで読めば予想がつくだろう。そうこれはユニコード文字列を示すものだ。

WCHAR	pszText[256];

wcscpy(pszText,L"あいうえお");

上のように使われる。

文字列コピー用の関数としてstrcpyに対して_tcscpyやwcscpyがあるように、文字列を数字にするatoiにもTCHAR用の_tstoi、WCHAR用の_wtoiが用意されている。このほかの文字列を扱うクラスに対しても同様にTCHAR用とWCHAR用の関数がある。ユニコードビルドと非ユニコードビルドを切り替えれるプログラミングをしたい場合はこれらの違いに特に気をつけよう。


カテゴリー「文字列操作」 のエントリー