档案有助於极大地减少档案所占的磁碟空间。)但也许最糟的缺点是:人们相对来说还不习惯使用Unicode。身为程式写作者,这就是我们的工作。
宽字元和C
对C程式写作者来说,16位元字元的想法的确让人扫兴。一个char和一个位元组同宽是最不能确定的事情之一。没几个程式写作者清楚ANSI/ISO
9899-1990,这是「美国国家标准程式设计语言-C」(也称作「ANSI
C」)通过一个称作「宽字元」的概念来支援用多个位元组代表一字元的字元集。这些宽字元与常用的字元完美地共存。
ANSI
C也支援多位元组字元集,例如中文、日文和韩文版本Windows支援的字元集。然而,这些多位元组字元集被当成单位元组构成的字串看待,只不过其中一些字元改变了後续字元的含义而已。多位元组字元集主要影响C语言程式执行时期程式库函式。相比之下,宽字元比正常字元宽,而且会引起一些编译问题。
宽字元不需要是Unicode。Unicode是一种可能的宽字元集。然而,因为本书的焦点是Windows而不是C执行的理论,所以我将把宽字元和Unicode作为同义语。
char资料型态
假定我们都非常熟悉在C程式中使用char资料型态来定义和储存字元跟字串。但为了便於理解C如何处理宽字元,让我们先回顾一下可能在Win32程式中出现的标准字元定义。
下面的语句定义并初始化了一个只包含一个字元的变数:
char c = 'A' ;
变数c需要1个位元组来保存,并将用十六进位数0x41初始化,这是字母A的ASCII代码。
您可以像这样定义一个指向字串的指标:
char * p ;
因为Windows是一个32位元作业系统,所以指标变数p需要用4个位元组保存。您还可初始化一个指向字串的指标:
char * p = "Hello!" ;
像前面一样,变数p也需要用4个位元组保存。该字串保存在静态记忆体中并占用7个位元组-6个位元组保存字串,另1个位元组保存终止符号0。
您还可以像这样定义字元阵列:
char a[10] ;
在这种情况下,编译器为该阵列保留了10个位元组的储存空间。运算式sizeof(a)
将返回10。如果阵列是整体变数(即在所有函式外定义),您可使用像下面的语句来初始化一个字元阵列:
char a[] = "Hello!" ;
如果您将该阵列定义为一个函式的区域变数,则必须将它定义为一个stat |