C 语言中用char类型代表一个8 bit的ANSI字符,Microsoft 中的C/C++ 编译器定义了另一种类型wchar_t,代表一个16bit的Unicode字符。在Visual Studio中,当使用 /Zc:wchar_t 选项时,编译器将定义wchar_t类型。wchar_t的定义为typedef unsigned short wchar_t。
typedef char CHAR; // An 8-bit character
typedef wchar_t WCHAR; // An 16-bit character
Windows字符指针定义:
// Pointer to 8-bit character(s)
typedef CHAR *PCHAR;
typedef CHAR *PSTR;
typedef CONST CHAR *PCSTR;
// Pointer to 18-bit character(s)
typedef WCHAR *PWCHAR;
typedef WCHAR *PWSTR;
typedef CONST WCHAR *PCWSTR;//
还有一种字符类型TCAHR,他会根据编译器的选项来定义是使用char或者wchar_t,其定义为:
#ifdef UNICODE
typedef WCHAR TCAHR,*PTCHAR,PTSTR;
typedef CONST WCHAR *PCTSTR;
#define __TEXT(quote) L##quote
#else
typedef CHAR TCHAR,*PTCHAR,PTSTR;
typedef CONST CHAR *PCTSTR;
#define __TEXT(quote) quote
#endif
#define TEXT(quote) __TEXT(quote)
在Windows程序中API中,如WinFuncNameEx,后缀Ex表示该方法接受Unicode字符串参数。WinFuncNameEx有两个版本:一个是WinFuncNameExA,表示接受ANSI字符串参数;另一个是WinFuncNameExW,表示接受Unicode字符串参数。
而WinFuncNameEx的定义为:
#ifdef UNICODE
#define WinFuncNameEx WinFuncNameExW
#else
#define WinFuncNameEx WinFuncNameExA
#endif
编译器会根据Project中设置来链接调用相应的函数版本。
在Windows Vista和以后的系统中,WinFuncNameExA程序仅仅是把传入的ANSI字符串参数重新分配内存转换为Unicode,然后调用WinFuncNameExW,所以如果程序中使用ANSI字符并调用函数时会比直接Unicode字符调用函数慢一些。
在C中使用strlen函数来计算一个ANSI字符串的长度,在Unicode中使用wcslen来计算。与tchar相对就_tcslen函数计算tchar字符串的长度,相应的有_tcscpy、_tcscpy_s、_tcscat、_tcscat_s。
另外一些字符串操作函数:
HRESULT StringCchCat(PTSTR pseDest, size_t cchDest, PCTSTR pszSrc);
HRESULT StringCchCatEx(PTSTR pszDest, size_t cchDest, PCTSTR pszSrc,PTSTR *ppszDestEnd, size_t *pcchRemaining, DWORD dwFlags);
HRESULT StringCchCopy(PTSTR pseDest, size_t cchDest, PCTSTR pszSrc);
HRESULT StringCchCopyEx(PTSTR pszDest, size_t cchDest, PCTSTR pszSrc,PTSTR *ppszDestEnd, size_t *pcchRemaining, DWORD dwFlags);
HRESULT StringCchPrintf(PTSTR pszDest, size_t cchDest, PCTSTR pszFormat, …);
HRESULT StringCchPrintfEx(PTSTR pszDest, size_t cchDest, PTSTR *ppszDestEnd,size_t *pcchRemaining,DWORD dwFlags,PCTSTR pszFormat, …);
“cch”是counts of characters的缩写,用_countof这个宏可以计算这个值。字符串比较函数:
int CompareString(LCID local,DWORD dwCmdFlags,PCTSTR pString1,int cch1,PCTSTR pString2,int cch2);
int ComparaStringOrdinal(PCWSTR pString1,int cchCount1,PCWSTR pString2,int cchCount2,BOOL bIgnoreCase);
Unicode字符与ANSI字符之间的转换:
ANSI字符串转换为Unicode字符串:
int MultiByteToWideChar(UINT uCodePage/**/,DWORD dwFlags,PCTSTR pMultiByteStr,int cbMultiByte,PWSTR pWideCharStr,int cchWideChar);
Unicode字符串转换为ANSI字符串:
int WideCharToMultiByte(UINT uCodePage,DWORD dwFlags,PCWSTR pWideCharStr,int cchWideChar,PSTR pMultiByteStr,int cbMultiByte,PCSTR pDefaultChar,PBOOL pfUsedDefaultChar);