介绍

以一个或多个字符串作为参数的函数的 Windows API 文档通常如下所示:

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

两个字符串参数的数据类型由几部分组成:

  • LP =长指针
  • C =常数
  • T = TCHAR
  • STR =字符串

现在 TCHAR 是什么意思?这取决于为程序编译选择的平台。

CopyFile 本身只是一个宏,定义如下:

#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif

所以实际上有两个 CopyFile 函数,并且根据编译器标志,CopyFile 宏将解析为一个或另一个。

有核心令牌,TCHAR 定义为:

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

因此,根据编译标志,TCHAR 是(2 字节)字符。

因此,当定义 UNICODE 时,CopyFile 被定义为 CopyFileW,它将使用 2 字节字符数组作为参数,预计将采用 UTF-16 编码。

如果没有定义 UNICODE,CopyFile 被定义为 CopyFileA,它使用单字节字符数组,预计将以当前用户的默认 ANSI 编码进行编码。

有两个类似的宏:UNICODE 使 Windows API 期望宽字符串和 _UNICODE(带有前导下划线),它在 C 运行时库中启用类似的功能。

这些定义允许我们编写以 ANSI 和 Unicode 模式编译的代码。

重要的是要知道 ANSI 编码可以是单字节编码(即 latin-1)多字节编码(即移位 jis),但遗憾的是,utf-8 不能很好地支持。

这意味着这些函数的 ANSI 和宽字符变体都不能用于固定宽度编码。