Unicode的好处:Unicode会增加程序的执行性能,并为本地化工作奠定基础,有利于同COM和.Net Framework的互操作。
2.1 字符编码
用户一直在将文本字符串编码成一组以0结尾的单字节字符,并调用strlen,它会返回“以0结尾的一个ANSI单字节字符数组”中的字符数。但是一个字节最多只能表示256个符号。但是很多国家的文字超过256个符号。所以就有了双字节字符串,这种字符串中的每个字符都是由1个字节或者2个字节组成。
UTF16编码:UTF(unicode transformation format(unicode转换格式)),将每个字符编码为2个字节或者说16位。
UTF8编码:将一些字符编码为1个字节、一些字符编码为2个字节、一些字符编码为3个字节、一些字符编码为4个字节。
UTF32编码:将每个字符都编码为4个字节。
2.2 ANSI字符和Unicode字符与字符串数据类型
C语言用char数据类型来表示一个8位ANSI字符。默认情况下,在源代码中声明一个字符串时,C编译器会把字符串中的字符转换成由8位char数据类型构成的一个数组,每个字符之间用0进行填充:
//an 8-bit character
char c = ‘A';
//An array of 99 8-bit character and 8-bit terminating zero
char czBuffer[100] = "A string";
同理wchar_t表示一个16位unicode(UTF16)字符。
2.3 Windows中的Unicode函数与ANSI函数
Vistual Studio创建一个新的项目时,它默认定义为Unicode。Windows中的函数会自行进行转换。
2.4 C运行库中的Unicode函数与ANSI函数
C运行库中的函数不会自行进行转换。在C运行库中,strlen就是一个能返回ANSI字符串长度的函数。与之对应的是wcslen能返回Unicode字符串的长度。现在应该在代码中调用_tcslen,它自己会根据编译器定义的宏进行选择。针对不属于C++标准一部分的标识符,C运行库始终会为它们附加下划线前缀。
2.5 C运行库中的安全字符串函数
任何修改字符串的函数都存在一个安全隐患:如果目标字符串缓冲区不够大,无法容纳所生成的字符串,就会导致内存中的数据被破坏。必须在包含其他所有文件之后才包含StrSafe.h。
有些方法的名称中,都含有一个“Cch”,这表示Count of character,即字符数;通常使用_countof宏来获取此值。另外还有一序列名称中含有“Cb”的函数,这些函数要求用字节数来指定大小,而不是字符数;通常使用sizeof操作符来获取此值。
用户应该一开始就将文本字符串想象成字符的数组,而不是char或字节的数组。