Windowsと文字コード


文字のデータ型

早くウィンドウを表示させて、マルチメディアなどの操作をしたいかもしれませんが
残念ならがそれはもうしばらく先の話になります
なぜならば、あのおぞましいソースファイルを見せたら
覚える前にやる気をなくしかねないからです(挫折経験のある方は良くわかるでしょう)

そこで、まずWindowsプログラミングを理解するうえで重要な
かつ将来性のあるソース記述のために Windows の文字コードとデータ型の説明をします

将来性を考えて、これから文字コードはUnicodeを用いるべきです
Windos NT はすでに Unicode をサポートしています
しかし、Windows 9x シリーズは Unicode に未対応なのが難しいところなのです

といって、プログラマがプラットフォームごとにコードを分けて書く必要はないのです
Windows SDK はこのギャップを巧みにこなしています
ただし、これを利用するためにはそれなりのデータ型の知識が必要です
ここさえ押さえれば、将来Unicode版にコードを書きなおすような手間がなくなります

Windows では、次の基本データ型を次のように定義しています
以下のデータ型の定義は、WINNT.H ヘッダファイルのものです

typedef char CHAR;
typedef short SHORT;
typedef long LONG;

これは簡単ですね、大文字になっただけです
また、ワイド文字は次のように定義されています

typedef wchar_t WCHAR;

Microsoft は、wc を変数名の先頭につけるように推奨しています
これは、ハンガリー記法という記述法で、変数名を見ただけで型がわかります
たとえば、 wcStr という変数名は、WCHAR 型であることがわかります
Windows プログラミングでは、このハンガリー記法による記述が推奨されます

WinMain() 関数の第三引数の型 LPSTR は次の定義になっています

typedef CHAR * LPSTR;

どうでしょうか、これで正体がわかったと思います
一見複雑なデータ型も、たどっていけばネタがわかるものなのです
LPSTR の L は Long を表すもので、16ビット時代の産物であるということから
PSTR (P はポインタ) というものも存在します(型は LPSTR とまったく同じ)
#include<windows.h>

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		PSTR lpCmdLine ,
		int nCmdShow ) {
	return 0;
}
第三引数 LPSTR が PSTR になっているのがわかると思います
型はまったく同じものなので、この記述に問題はありません
上記した理由から、LPSTR ではなく PSTR を好んで使うプログラマもいます

さて、基本的なことがわかったら再び Unicode の話に戻しましょう
じつは、SDKでは Unicode が定義されていればワイド文字を定義し
Unicode 未対応であれば char 型の1バイトでコンパイルするような方法があるのです

それはTCHAR型、 * PTCHAR型を用いるものです
これら二つのデータ型は次のような定義になっています

#ifdef UNICODE
typedef WCHAR TCHAR , *PTCHAR ;
#else
typedef char TCHAR , *PTCHAR ;
#endif

途中、他のデータ型も多く定義されていますが省略しています
UNICODE識別子の定義によって、ビット数を変化させたい文字列にはこれを用います


TEXTマクロ

ここで、簡単に TEXT マクロについても触れておきます
TEXT マクロは、UNICODEが定義されているかどうかで文字列に L を付加します

#define __T(x) L ## x

これが最終的なマクロになりますが、TEXT(x) はこれにxを渡します
UNICODEが定義されていなければ、何もしません

この講座のサンプルプログラムも、できるだけ双方に対応できるようにするため
TEXT() マクロや TCHAR 型を使用して、汎用的なコードプログラムを心がけます
実際の使用例は次の章で紹介します



前のページへ戻る次のページへ