サーチ…


前書き

1つまたは複数の文字列を引数として取る関数のWindows APIドキュメントは、通常次のようになります。

BOOL WINAPI CopyFile(
  _In_ LPCTSTR lpExistingFileName,
  _In_ LPCTSTR lpNewFileName,
  _In_ BOOL    bFailIfExists
);

2つの文字列パラメータのデータ型は、いくつかの部分で構成されています。

  • LP =ロングポインタ
  • C = const
  • T = TCHAR
  • STR =文字列

TCHARTCHAR意味ですか?これは、プログラムのコンパイルのために選択されたプラットフォームに依存します。

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もワイドキャラクタバリアントも、固定幅のエンコーディングで動作するとは想定できません。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow