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);

posted on 2011-06-14 18:24  zhaojunlucky  阅读(227)  评论(0编辑  收藏  举报