Windows 下处理 ANSI 与 Unicode 字符串的一些小技巧
1. 开始将文本字符串想象为字符的数组,而不是char或字节的数组。
2. 为文本字符和字符串使用泛型(比如TCHAR/PTSTR)。
3. 为字节、字节指针和数据缓冲区使用显式数据类型(BYTE和PBYTE) 。
4. 为literal字符和字符串使用TEXT或_T宏,但为了保持一致性和更好的可读性,请
避免两者混用。
5. 执行全局替换。(例如,用PTSTR替换PSTR)。
6. 修改字符串算术问题。例如,函数经常希望你传给它缓冲区的字符数,而不是字节数。
这意味着你应该传入_countof(szBuffer),而不是sizeof(szBuffer)。
而且,如果需要为一个字符串分配一个内存块, 而且知道字符串中的字符数, 那么记住内存是以字节来分配的。
这意味着你必须调用malloc(nCharacters*sizeof(TCHAR)),而不是调用malloc(nCharacters)。
在前面列出的所有基本准则中, 这是最难记住的一条, 而且如果出错, 编译器不会提供任何警告或错误信息。
所以,最好定义一个宏来避免犯错:
#define chmalloc(nCharacters) (TCHAR*)malloc(nCharacters * sizeof(TCHAR))
7. 避免使用printf系的函数, 尤其是不要用%s和%S字段类型来进行ANSI与字符串的相互转换。
正确的做法是使用 MultiByteToWideChar 和 WideCharToMultiByte 函数。
8. UNICODE 和 _UNICODE 符号要么都指定,要么一个都不指定。
对于字符串处理函数, 有以下准则:
1. 始终使用安全的字符串处理函数,比如那些后缀为 _s 的,或者前缀为 StringCch 的。
后者主要在你想明确控制截断的时候使用; 如果不想明确控制截断, 则首选前者。
2. 不要使用不安全的C运行库字符串处理函数。
一般情况下,你使用或实现的任何缓冲区处理例程都必须获取目标缓冲区的长度作为一个参数。
C 运行库提供了一系列缓冲区处理替代函数,比如 memcpy_s,memmove_s,wmemcpy_s或wmemmove_s。
只要定义了 __STDC_WANT_SECURE_LIB__ 符号,所有这些方法都是可用的;CrtDefs.h默认定义了此符号。
所以,不要对 _STDC_WANT_SECURE_LIB__ 进行 undef。
3. 利用 /GS 和 /RTCs 编译器标志来自动检测缓冲区溢出。
4. 不要用 Kernel32 方法来进行字符串处理,比如 lstrcat 和 lstrcpy 。
5. 在我们的代码中,需要要比较两种字符串。其中,编程类的字符串包括文件名、路径、XML元素/属性以及注册表项/值等等。
对于这些字符串,应使用 CompareStringOrdinal 来进行比较。
因为它非常快,而且不会考虑用户的区域设置。这是完全合理的。
因为不管程序在世界上的什么地方运行,这种字符串都是不变的。
用户字符串则一般要在用户界面上显示。对于这些字符串,应使用 CompareString(Ex) 来比较。
因为在比较字符串的时候,它会考虑用户的区域设置。