介绍
以一个或多个字符串作为参数的函数的 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 和宽字符变体都不能用于固定宽度编码。