windows核心编程2

来源:互联网 发布:python常用函数 编辑:程序博客网 时间:2024/05/17 10:52
                                                                第2章U n i c o d e
2.1 字符集
软件的本地化要解决的真正问题,实际上就是如何来处理不同的字符集。问题是,有些文字和书写规则(比如日文中的汉字就是个典型的例子)的字符集中的符号太多了,因此单字节(它提供的符号最多不能超过2 5 6个)是根本不敷使用的。为此出现了双字节字符集(D B C S),以支持这些文字和书写规则。
2.1.1 单字节与双字节字符集
在双字节字符集中,字符串中的每个字符可以包含一个字节包含两个字节。
使用双字节字符集,对于程序员来说简直是个很大的难题,因为有些字符只有一个字节宽,而有些字符则是两个字节宽。如果只是调用s t r l e n函数,那么你无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。
2.1.2 Unicode:宽字节字符集
U n i c o d e字符串中的所有字符是1 6位的(两个字节)。
由于U n i c o d e用一个1 6位的值来表示每个字符,因此总共可以得到65 000个字符,这样,它就能够对世界各国的书面文字中的所有字符进行编码,远远超过了单字节字符集的2 5 6个字符的数目。
  1 6位代码                 字符
0 0 0 0 - 0 0 7 F      A S C I I    
0 0 8 0 - 0 0 F F     拉丁文1字符
0 1 0 0 - 0 1 7 F     欧洲拉丁文
0 1 8 0 - 0 1 F F     扩充拉丁文
0 2 5 0 - 0 2 A F     标准拼音
0 2 B 0 - 0 2 F F     修改型字母
0 3 0 0 - 0 3 6 F     通用区分标志
0 4 0 0 - 0 4 F F     西里尔字母
0 5 3 0 - 0 5 8 F     亚美尼亚文
0 5 9 0 - 0 5 F F     西伯莱文
0 6 0 0 - 0 6 F F     阿拉伯文
0 9 0 0 - 0 9 7 F     梵文
目前尚未分配的代码点大约还有29 000个,不过它们是保留供将来使用的。另外,大约有
6 0 0 0个代码点是保留供个人使用的。
2.2 为什么使用U n i c o d e
当开发应用程序时,当然应该考虑利用U n i c o d e的优点。即使现在你不打算对应用程序进
行本地化,开发时将U n i c o d e放在心上,肯定可以简化将来的代码转换工作。此外, U n i c o d e还
具备下列功能:
• 可以很容易地在不同语言之间进行数据交换。
• 使你能够分配支持所有语言的单个二进制. e x e文件或D L L文件。
• 提高应用程序的运行效率(本章后面还要详细介绍)。
2.3需要注意的问题
下面让我们进一步明确一下“M i c r o s o f t公司对U n i c o d e支持的情况”:
• Windows 2000既支持U n i c o d e,也支持A N S I,因此可以为任意一种开发应用程序。
• Windows 98只支持A N S I,只能为A N S I开发应用程序。
• Windows CE只支持U n i c o d e,只能为U n i c o d e开发应用程序。
2.4对C O M的简单说明
当M i c r o s o f t公司将C O M从1 6位Wi n d o w s转换成Wi n 3 2时,公司作出了一个决定,即需要字
符串的所有C O M接口方法都只能接受U n i c o d e字符串。
2.5如何编写U n i c o d e源代码
M i c r o s o f t公司为U n i c o d e设计了Windows API,这样,可以尽量减少对你的代码的影响。实
际上,你可以编写单个源代码文件,以便使用或者不使用U n i c o d e来对它进行编译。只需要定
义两个宏(U N I C O D E和_ U N I C O D E),就可以修改然后重新编译该源文件。

2.6成为符合A N S I和U n i c o d e的应用程序
即使你不打算立即使用U n i c o d e,最好也应该着手将你的应用程序转换成符合U n i c o d e的应
用程序。下面是应该遵循的一些基本原则:
• 将文本串视为字符数组,而不是c h a r s数组或字节数组。
• 将通用数据类型(如T C H A R和P T S T R)用于文本字符和字符串。
• 将显式数据类型(如B Y T E和P B Y T E)用于字节、字节指针和数据缓存。
• 将T E X T宏用于原义字符和字符串。
• 执行全局性替换(例如用P T S T R替换P S T R)。
修改字符串运算问题。例如函数通常希望你在字符中传递一个缓存的大小,而不是字节。
这意味着你不应该传递s i z e o f ( s z B u ff e r ) ,而应该传递( s i z e o f ( s z B u ff e r ) / s i z e o f ( T C H A R )。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来
分配内存。这就是说,应该调用malloc(nCharacters *sizeof(TCHAR)), 而不是调用m a l l o c
( n C h a r a c t e r s )。在上面所说的所有原则中,这是最难记住的一条原则,如果操作错误,编译器
将不发出任何警告。
 
原创粉丝点击