|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
2.2 宽字符和C语言
作为一个C语言程序员,使用16位字符的整个想法一定让人寒意顿生。一个字符(char)的宽度和一个字节(byte)的长度相同是此生极少数确凿无疑的事实之一。只有少数程序员意识到这一点:ANSI/ISO 9899-1990,也就是“美国国家为程序设计语言C指定的标准”(也称为“ANSI C”),通过一种叫“宽字符”的概念来支持用多个字节代表一个字符的字符集。这些宽字符同样很好地存在于正常和熟悉的字符中。
ANSI C还支持多字节字符集,如那些在中文、日语和韩语版本的Windows中支持的字符集。然后,这些多字节字符集被当作单字节值的字符串,在那些字符串里一些字符改变了后续字符的含义。多字节字符集主要影响C语言运行库函数。与此相反,宽字符不仅比正常字符宽,而且涉及编译器的一些问题。(这种宽是存储容量大的意思,而不是眼睛看到的字更宽的理解)
宽字符并不一定是Unicode。Unicode只是宽字符编码的一种实现,然而,由于本书的重点是Windows,而不是一个抽象的C语言实现,我会将宽字符和Unicode视为同义词。
2.2.1 char数据类型
假设我们都十分熟悉在C程序中使用char数据类型来定义和存储字符和字符串。但是为了进一步了解C语言如何处理宽字符,让我们先来审查一下正常字符的定义,因为它可能出现在一个Win32程序中。
下面的声明定义和初始化一个包含单一字符的变量:
char c = ‘A’;(c是字符变量,没有字符串变量的说法)
变量c需要一个字节的存储空间并会用十六进制值0x41来初始化,也就是ASCII字母A的符号。
可以如下定义一个指向字符串的指针:
char *p;(p是一个指向字符串的指针变量)
因为windows是一个32位的操作系统,指针变量P需要4个字节的存储空间。还可以如下初始化一个指向字符串的指针:
char * p = “Hello!”;
变量p和之前一样,仍然需要4个字节的存储空间。字符串存储在静态内存中并使用7个字节的存储空间—其中6个字节存储字符串而另外一个字节存储表示字符串结束的0。
还可以如下定义一个字符数组:
char a[10];
在这种情况下,编译器保留了10个字节的存储空间给这个数组。sizeof(a)表达式会返回10。如果数组是全局的(就是说,定义在任何函数外面),你就可以用这样的语句来初始化一个字符数组:
char a[] = “Hello!”;
如果将此数组定义为一个函数的局部变量,那么它必须定义为静态(static)变量:
static char a[] = “Hello!”;(定义成静态变量有很多好处,后面的例子中的消息处理中就大量涉及,在某个消息处理中的静态变量需要在其他的消息处理中继续使用的情况。所以该设置成静态变量的地方一定要设置)
无论是前面哪一种情况,字符串都始终被存储在静态内存中,并有一个0加在最后,所以需要7个字节的存储空间。
|
|