介紹
以一個或多個字串作為引數的函式的 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 和寬字元變體都不能用於固定寬度編碼。