天天看点

《Windows核心编程》读书心得——字符和字符串处理(1)

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:考虑用户区域设置,适用于比较用户字符串。