TOP > eMbedded Visual C++ Tips > 第3回 TCHARを使うべしっっ!

eMbedded Visual C++ Tips 第3回 TCHARを使うべしっっ!

■ CEの文字コードはUNICODE

 x86のWindowsプログラミングとWindows CEプログラミングで決定的に異なるのは文字コードである。言わずもがな、前者はShift JIS(正しくはMS932。純粋なShift JISではない)であり、後者はUNICODEである。

 メモリ上で扱う文字コードも当然UNICODEであるので、データ型には専用の宣言が必要となる。また、Shift JISで記述されたテキストファイルの読み込みには特別な処理が必要となる。

    wchar_t sz[10];

    wcscpy(sz2,L"test");
 リテラル文字列の前のLはそれに続く文字列をUNICODEに変換するマクロである。見てのとおり、x86用マルチバイト文字列用の宣言とは異なるので、x86用のプログラムをWindows CEに移植する場合、あるいはその逆の場合はコードの全域に渡って該当個所の書き換えが必要となる。

■ 汎用テキストデータ型と汎用テキストルーチン

 Win32ではこの問題への解決策としてTCHAR等の汎用テキストデータ型および汎用テキストルーチンが用意されている。

    TCHAR sz[10];   // 正確にはTCHARも前に'_'が付くんだけどね

    _tcscpy(sz,_T("test"));
 ここで_T()マクロは汎用テキストを表すマクロだ。リテラル文字列もこのマクロでくくればコンパイル時に適切な文字コードにマッピングされるため、プラットフォームを意識せずにコードを書くことができる。_tcscpyはstrcpyの汎用テキストバージョンである。

    char c[40];
    ReadFile(hFile,c,40,&nRead,NULL);

    wchar_t	sz[20];
    MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,c,-1,sz,20);

 Shift JISのテキストをファイルから読み込む場合もUNICODEへの変換が必要となる。ファイルからデータを読み込んだ後、MultiByteToWideCharによってUNICODEへ変換する。これとは逆にファイルに文字列を書き出す場合、文字列をWideCharToMultiByteによってShift JISに変換した後で書き出せば良い。

■ MFCまたはATLならば便利な変換マクロが使用できる

 開発にMFCまたはATLを使うのであれば、A2W()等文字列変換マクロを使用することもできる。

    USES_CONVERSION;    // このマクロは必須
    char c[40];
    ReadFile(hFile,c,40,&nRead,NULL);

    LPWSTR sz;
    sz = A2W(c);    // 領域は自動的に割り当てられる
 どちらを使うかはほとんど好みの問題だが、特にATLで開発する場合はA2BSTR等もあるので変換マクロが便利だろう。汎用テキストを使ってコードを書いておけば、1つのソースファイルからx86用WindowsとWindows CEの両方に対応したバイナリを生成することができる。

(2003/12/03)


Copyright(C) 2003 モバイル開発系(K) All rights reserved.

[Home]