Windows的字符编码主要有以下几个注意点
1.Windows Vista 中每个Unicode字符都是 UTF-16编码, 且是默认编码。.Net Framework始终使用UTF-16来编码。
开发Windows程序中,如果需要本机代码和托管代码之间传递字符或字符串,使用UTF-16可以改进性能减少内存消耗
2.C语言中char数据类型表示一个8位的ANSI字符,
Microsoft C/C++ 编译器又定义了一个内建的数据类型wchar_t表示16位的Unicode字符
Windows团队又为了区分自己定义的数据类型,在WinNT.h中定义了 typedef char CHAR; typedef wchar_t WCHAR
3.Windows版本里面的参数列表含有字符串的时候分2个版本末尾带有大写W表示接受Unicode字符串,末尾带有A的表示接受
ANSI字符串,而接受ANSI字符串的API其实只是一个转换层,负责分配内存,将ANSI字符串转换成Unicode字符串,然后代码
调用Unicode字符串的API,返回的时候,ANSI会释放它的内存缓冲区,Unicode字符串转换成非Unicode的形式返回回来,
因此速度比较慢,消耗内存。
4.同样C运行库也提供了一系列函数处理ANSI字符串和Unicode字符串,但是ANSI字符串操作的时候不用转换成Unicode字符串
5.推荐使用的字符和字符串处理方式
- 通用数据类型TCHAR/PTSTR表示文本字符和字符串,并且PSTR换成PTSTR
- 明确数据类型BYTE/PBYTE来表示字节,指针和数据缓冲区
- TEXT/_T表示字面量字符和字符床,避免两者混用
- 函数希望传给它的是缓冲区的字符数,而不是字节数的时候用_countof(szBuffer)而不是sizeof(szBuffer)
- 为一个字符串分配内存块,知道字符串的字符数,但是是以字节来分配,必须调用malloc(nCharacters*sizeof(TCHAR))
- 避免使用printf系列函数,尤其不要用%s %S来进行ANSI和Unicode的转换,正确的方式是MultiByteToWideChar(ANSI->Unicode),WideCharToMultiByte
- UNICODE _UNICODE符号要同时指定或同时不指定。
- 字符串拷贝等处理函数,最好使用带有_s的安全函数
- 不用Kernel32的方法进行字符串处理比如lstrcat lstrcpy
- 用户程序中比较两种字符串用CompareStringOridinal进行比较。