Windows核心编程 第2章读书笔记
二.字符和字符串处理
1.UTF全称Unicode Transformation Format,UTF-16每个字符编码为2字节16位;
2.在Windows程序中使用UTF-16能改进性能和减少内存消耗;
自Windows NT起,Windows的所有版本都完全用Unicode来构建,调用Windows函数 时,如果传入一个ANSI字符,那么函数首先把字符串转换为Unicode,再把结果传给操作系统,
如果希望函数返回ANSI字符串,那么操作系统会先把Unicode转换为ANSI字符串,再把结果返回给应用程序;
3.Microsoft的C/C++编译器定义了一个内建的数据类型wchar_t,表示16位的Unicode字符
wchar_t c=L'A';
4.在Windows头文件WinNT.h中定义:
typedef char CHAR; //8-bit
typedef CHAR *PCHAR;
typedef CONST CHAR *PCSTR;
-------------------------------------------------------------------------------------------------------
typedef wchar_t WCHAR; //16-bit
typedef WCHAR *PWCHAR;
typedef CONST WCHAR *PCWSTR;
------------------------------------------------------------------------------------------------------
在API中经常遇到的参数类型:PCTSTR
#ifdef UNICODE
typedef LPCWSTR PCTSTR;
#else
typedef LPCSTR PCTSTR;
#endif
自己整理一下,果然清晰多了
5.Windows函数的参数中有字符串,则该函数通常有两个版本,比如 CreateWindowsEx:
在WinUser.h中,CreateWindowsEx实际上是一个宏
#ifdef UNICODE
typedef CreateWindowsEx CreateWindowsExW;
#else
typedef CreateWindowsEx CreateWindowsExA;
#endif
6.Microsoft开始倾向于某些函数只提供Unicode版本;
7.C运行库中大多数字符串处理函数不检测长度参数,所以会发生缓冲区溢出;
8.Windows中常见字符串函数
int CompareString(
LCID Locale,
DWORD dwCmpFlags,
LPCTSTR lpString1,
int cchCount1,
LPCTSTR lpString2,
int cchCount2
);
LCID:locale ID,32位值,用来标识一种语言,这个函数以符号当地语言习惯的方式来比较,得到更有意义的结果
--------------------------------------------------------------
int CompareStringOrdinal(
LPCWSTR lpString1,
int cchCount1,
LPCWSTR lpString2,
int cchCount2,
BOOL bIgnoreCase
);
这个函数执行的是码位(code-point)比较,不考虑区域设置,所以速度很快,只支持Unicode字符串;
9.TCHAR
当没有定义_UNICODE宏时,TCHAR = char
当定义了_UNICODE宏时,TCHAR = wchar_t
10.TEXT是在winnt.h中定义
举例:TCHAR *ptch = TEXT("This is a const string.");
如果使用UNICODE字符集, 则TEXT("This is a const string.")相当于L"This is a const string.",
如果使用ASCII集, 则上述字符串相当于“This is a const string.”;
11.Unicode与ANSI字符串转换
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar
);
-------------------------------------------------------------------------------------------------------
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cbMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
12.判断文本是ANSI还是Unicode
BOOL IsTextUnicode(
const VOID *lpv,
int iSize,
LPINT lpiResult
);
此方法并不一定准确。