最好将应用程序转换为支持Unicode的形式。 遵循的基本准则如下:
1.开始将文本字符串想象为字符的数组,而不是char或字节的数组
2.用通用数据类型(如TCHAR/PTSTR)来表示文本字符和字符串
3.用明确的数据类型(如BYTE和PBYTE)来表示字节,字节指针和数据缓冲区
4.用TEXT或_T宏来表示字面量字符和字符串,但为了保持一致性和更好的可读性,请避免两者混用
5.执行全局替换(例如,用PTSTR替换PSTR)
6.修改于字符串有关的计算。例如,函数经常希望我们传给它缓冲区大小的字符数,而不是字节数,这意味着我们应该传入_countof(szBuffer),而不是sizeof(szBuffer)。而且,如果需要为一个字符串分配一个内存,而且知道字符串中字符数,那么要记住内存是以字节来分配的。这意味着我们必须调用malloc(nCharacters*sizeof(TCHAR)),而不是调用malloc(nCharacgers)。在前面列出的所有基本准则中,这是最难记住的一条,最好定义一个宏来避免犯错:
- #define chmalloc(nCharacters) (TCHAR*)malloc(nCharacters*sizeof(TCHAR))
7.避免使用printf系列函数尤其是不要用%s和%S字段类型来进行ANSI于Unicode字符串之间的相互转换。正确的做法是使用MultiByteToWideChar和WideCharToMultiByte函数
8.UNICODE和_UNICODE符合要么同时指定,要么都不指定
对于字符串处理函数,应遵循以下基本准则。
1.始终使用安全的字符串处理函数,比如后缀为_s的函数,或者前缀为StringCch的函数,后者主要在我们明确控制截断的时候使用;如果不想明确控制截断,则首选前者。
2.不要使用不安全的C运行库字符串函数。
3.利用/GS和/RTCs编译器标志来自动检测缓冲区溢出。
4.不要用kernel32方法来进行字符串处理,比如lstrcat 和 lstrcpy。
5.比较两种字符串,应使用CompareStringOrdinal来进行比较,因为他非常快,不会考虑用户的区域设置。