Win32 API
ANSIおよびワイド文字の関数
サーチ…
前書き
1つまたは複数の文字列を引数として取る関数のWindows APIドキュメントは、通常次のようになります。
BOOL WINAPI CopyFile(
_In_ LPCTSTR lpExistingFileName,
_In_ LPCTSTR lpNewFileName,
_In_ BOOL bFailIfExists
);
2つの文字列パラメータのデータ型は、いくつかの部分で構成されています。
- LP =ロングポインタ
- C = const
- T = TCHAR
- STR =文字列
TCHAR
はTCHAR
意味ですか?これは、プログラムのコンパイルのために選択されたプラットフォームに依存します。
CopyFile
自体は単なるマクロで、次のように定義されています:
#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif
したがって、実際には2つのCopyFile
関数があり、コンパイラフラグに応じて、 CopyFile
マクロはどちらか一方に解決されます。
コアトークンがある場合、 TCHAR
は次のように定義されます。
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
したがって、コンパイルフラグに応じて、TCHARは「ナロー」または「ワイド」(2バイト)文字です。
UNICODEが定義されているときに、 CopyFile
なるように定義されてCopyFileW
UTF-16でエンコードされたことが予想され、そのパラメータとして2バイト文字の配列を使用します。
UNICODEが定義されていない場合、 CopyFile
と定義されるCopyFileA
現在のユーザのデフォルトANSIエンコーディングでエンコードされることが期待されるシングルバイト文字列を使用します。
2つの類似したマクロがあります。 UNICODE
WindowsのAPIがワイド文字列を期待していますし、 _UNICODE
Cランタイムライブラリに似たような機能を可能にする(先頭にアンダースコア付き)。
これらの定義により、ANSIとUnicodeモードの両方でコンパイルされたコードを記述することができます。
utf-8は残念ながらうまくサポートされていませんが、ANSIエンコーディングはシングルバイトエンコーディング(すなわちlatin-1)やマルチバイトエンコーディング(つまりシフトjis)であることが重要です。
つまり、これらの関数のANSIもワイドキャラクタバリアントも、固定幅のエンコーディングで動作するとは想定できません。