l ANSI和UNICODE编码:
ANSI编码中,1个字符可能占一个字节、两个字节甚至多个字节,且不同国家的文字有不同的规定,存在字符库的冲突。
UNICODE编码(包括UTF-8、UTF-16、UTF-32,最常用的是UTF-16),以UTF-16为例,每个字符占用固定大小的字节数(2个字节),当然,少数无法用2字节表示的字符除外(这些字符可用代理,4字节表示)。UNICODE编码中,不同国家的文字分在不同的码段,不存在字符库的冲突,更有利于计算机的全球化需要。因此,微软提倡使用UNICODE编码,在WINDOWS NT以后的操作系统中,都是以UNICODE编码的。
建议:我们自己写在WINDOWS下运行的程序,最好也使用UNICODE编码,因为这样更高效。若使用ANSI编码,在调用WINDOWS提供的函数时,函数内部会把字符串先转换为UNICODE编码,再交给操作系统,当操作系统将字符串返还给程序时,还需要再执行一次UNICODE到ANSI的转换,因此会产生更多的时间和内存的开销。
l UNICODE字符串的表示方法:
wchar_t c = L ’A’; (类型为wchar_t或WCHAR,大写L表示使用UNICODE编码)
l 推荐的字符和字符串处理方式:
(1) 用通用数据类型(如TCHAR/PTSTR)来表示字符串(这样兼容性更强);
(2) 用TEXT或_T宏表示字符串;
(3) 用明确的数据类型(如BYTE和PBYTE)表示字节、缓冲区;
(4) 注意为字符串开辟空间的方式:
Malloc(nCharacters * sizeof(TCHAR)) 推荐
Malloc(nCharacters) 避免
(因为并不是任何情况下字符都占用1个字节)
(5) MultiByteToWideChar( ) ANSI转UNICODE
WideCharToMultiByte( ) UNICODE转ANSI
(6) 使用安全的字符串函数:
函数 |
表征符串大小的参数 |
字符串超长 |
安全性 |
strcpy wcscpy |
无 |
溢出 |
不安全 |
_tcscpy_s _tcscat_s |
字符个数(可用_countof函数计算) |
置空 |
安全 |
StringCchCat StringCchCopy StringCchPrintf |
字符个数 |
截断 |
安全 |
StringCbCat StringCbCopy StringCbPrintf |
字符串所占字节数 |
截断 |
安全 |
(7) 比较两种字符串的函数:
CompareStringOrdinal:比较快,适用于文件名、路径XML元素、注册表项的比较;
CompareString:考虑用户区域设置,适用于比较用户字符串。