「TCHAR」型とのお付き合いはWindowsプログラミングにはかかせない。TCHAR型は前に説明したように「UNICODE」定義がない場合はchar型と同一だ。
依存環境:ATL#include "atlstr.h"
void Test(void)
{
CAtlString strMessage;
strMessage.Format(_T("TCHARのサイズは %d Bytes\n"),sizeof(TCHAR));
::MessageBox(NULL,strMessage,_T(""),MB_OK);
}
プロジェクトファイルをダウンロード
このプログラムはsizeof(TCHAR)の結果をメッセージボックスに表示するだけの簡単なものだ。これの実行結果を見てみると...
■「UNICODE」が定義されていないとき
■「UNICODE」が定義されているとき
となる。つまり「UNICODE」定義の有無でTCHAR型はサイズが変わる。TCHAR型は文字を代入するための型なので、次は文字がメモリ上でどのような値として格納されているかを見てみよう。
#include "atlstr.h"
void Test(void)
{
CAtlString strMessage;
TCHAR ch;
ch = _T('A');
strMessage.Format(_T("「%c」はメモリ上で 0x%X と格納されています"),ch,ch);
::MessageBox(NULL,strMessage,_T(""),MB_OK);
}
プロジェクトファイルをダウンロード
■「UNICODE」が定義されていないとき
■「UNICODE」が定義されているとき
...この例ではまったく同じだ。実はこのように英数字の1文字を見た場合、「UNICODE」が定義されていても、そうでなくても文字コードに違いはない。異なるのは型の大きさsizeof(TCHAR)だけだ。ではどのようなときに違いが出るかというと、全角文字や文字列を利用する場合だ。
次はTCHAR型に文字列を代入して、その文字列のメモリ上での格納状態を見てみよう。
#include "atlstr.h"
void Test(void)
{
CAtlString strTmp;
CAtlString strMessage;
BYTE* pcbTmp;
//文字列用にTCHARを確保
TCHAR pch[256];
//文字列を代入
_tcscpy(pch,_T("ABCあいう"));
//文字列をBYTE配列として処理する
pcbTmp = (BYTE*)pch;
for(int i = 0; i < _tcslen(pch)*sizeof(TCHAR); i++)
{
//1BYTEずつ16進数表示
strTmp.Format(_T("%02X "),pcbTmp[i]);
strMessage += strTmp;
}
strTmp.Format(_T("「%s」はメモリ上で %s と格納されています"),pch,strMessage);
::MessageBox(NULL,strTmp,_T(""),MB_OK);
}
プロジェクトファイルをダウンロード
■「UNICODE」が定義されていないとき
■「UNICODE」が定義されているとき
先に試した「A」という1文字での結果では「UNICODE」定義有無での違いは現れなかった。しかしどうだろう。今回の文字列での結果は「UNICODE」定義の有無で結果が大きくことなっている。
まず従来の「UNICODE」定義がない場合は、「ABC」という文字列の文字コード0x41、0x42、0x43が連続して並んでいる。しかし「UNICODE」定義がある場合では各文字コードの間に0x00が入っている。これはsizeof(TCHAR)の違い(UNICODE時は2BYTE、それ以外は1BYTEということ)からも容易に想像できるだろう。
その次の「あいう」という文字列では「UNICODE」定義がない場合には従来どおり0xA0 0x82...とSHIFT-JISによる文字コードが並んでいる。しかし「UNICODE」定義がある場合には0x42 0x30 0x44 0x30...とまったく異なった配列になっている。
このような「UNICODE」定義があるときの文字コードのことを「ユニコード」という。つまりTCHARという文字型は「UNICODE」定義がないときはSHIFT-JISなどの従来の文字コード、「UNICODE」が定義されているときはユニコードの文字コードを扱う型になる。
