《Windows核心编程》第2章 Unicode

来源:互联网 发布:怎么联系网络推手阿建 编辑:程序博客网 时间:2024/05/22 15:39

应用软件可以从各种不同的函数中获得特定国家的信息,并可观察控制面板的设置,以确定用户的首选项。软件的本地化要解决的真正问题,实际上就是如何来处理不同的字符集。

有些文字和书写规则(比如中文)的字符集中的符号太多了,因此单字节(它提供的符号最多不能超过256个)是根本不够使用。为此出现了双字节字符集(DBCS),以支持这些文字和书写规则。在双字节字符集中,字符串中的每个字符可以包含一个字节或包含两个字节。

Unicode提供了一种简单而又一致的表示字符串的方法。Unicode字符串中的所有字符都是16位的(两个字节)。在Windows Vista中,每个Unicode字符都是使用UTF-16编码。

UTF-8:将一些字符编码为1个字节,一些字符编码为2个字节,一些字符编码为3个字节,一些字符编码为4个字节。值在0x0080以下的字符压缩为1 个字节,0x0080和0x07FF之间的字符转换为2个字节,0x0800以上的字符都转换为3个字节,最后代理对(surrogate pair)被写为4个字节。

UTF-32:将每个都编码为4个字节。

为什么使用Unicode
1) 可以简化将来的代码转换工作
2) 可以很容易地在不同语言之间进行数据交换
3) 使你能够分配支持所有语言的单个二进制exe文件或dll文件
4) 提高应用程序的运行效率

微软公司对Unicode支持的情况
1) Windows 2000既支持Unicode,也支持ANSI,因此可以为任意一种开发应用程序。
2) Windows 98只支持ANSI,只能为ANSI开发应用程序。
3) Windows CE只支持Unicode,只能为Unicode开发应用程序。

标准C头文件String.h中定义了名为wchar_t的数据类型,它是一个Unicode字符的数据类型:typedef unsigned short wchar_t;

ANSI C中所有的Unicode函数均以wcs开头,wcs是宽字符串的英文缩写。若要调用Unicode函数,只需用前缀wcs来取代ANSI字符串函数的前缀str即可。

可以创建同时为ANSI和Unicode进行编译的单个源代码文件。若要建立双重功能,必须包含tchar.h文件,而不是包含Stirng.h文件。

tchar.h文件的唯一作用是帮助创建ANSI/Unicode通用源代码文件。它包含你应该用在源代码中的一组宏,而不应该直接调用str函数或者 wcs函数。如果在编译源代码文件时定义了_UNICODE,这些宏就会引用wcs这组函数。如果没有定义_UNICODE,那么这些宏将引用str这组函数。例如在tchar.h中有一个宏称为_tcscpy。如果在包含该头文件时没有定义_ UNICODE,那么_tcscpy就会扩展为ANSI的strcpy函数。否则, _tcscpy将扩展为Unicode的wcscpy函数。

字符串(literal string)前面的大写字母L,用于告诉编译器该字符串应该作为Unicode字符串来编译。

_TEXT宏也在tchar.h文件中做了定义。如果定义了_UNICODE,那么_TEXT定义为式:
#define _TEXT(x) L ## x
否则_TEXT将定义为:#define _TEXT(x) x

Windows头文件也定义了ANSI/UNICODE通用数据类型PTSTR和PCTSTR。这些数据类型既可以指ANSI字符串,也可以指UNICODE字符串,这取决于当编译程序模块时是否定义了UNICODE宏。

_UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。