分享
 
 
 

Windows程序设计——笔记(3)

王朝vc·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

2.2 宽字符和C宽字符不一定是Unicode。Unicode是宽字符集的一种。然而,因为本书的焦点是Windows而不是C执行的理论,所以书中把宽字符和Unicode作为同义语。

2.2.1 char数据类型

(1)下面的语句定义并初始化了一个只包含一个字符的变量:

char c = 'A' ;

变量c需要1个字节来保存,并将用十六进位数0x41初始化,这是字母A的ASCII代码。

(2)可以这样定义一个指向字串的指针:

char * p ;

因为Windows是一个32位元作业系统,所以指针变量p需要用4个字节保存。还可初始化一个指向字串的指针:

char * p = "Hello!" ;

字串”Hello!”保存在静态记忆体中并占用7个字节,其中6个字节保存字串,另1个字节保存终止符号0。

(3)可以这样定义字符数组:

char a[10] ;

在这种情况下,编译器为该数组保留了10个字节的储存空间。运算式sizeof(a) 将返回10。

(4)如果数组是全体变量(即在所有函数外定义),您可使用像下面的语句来初始化一个字符数组:

char a[] = "Hello!" ;

(5)如果您将该数组定义为一个函数的区域变量,则必须将它定义为一个static变量,如下:

static char a[] = "Hello!" ;

无论哪种情况,字串都储存在静态程序记忆体中,并在末尾添加0,这样就需要7个字节的储存空间。

2.2.2 宽字符

(1)Unicode或者宽字符都没有改变char数据类型在C中的定义。

(2)C中的宽字符基於wchar_t数据类型,它在几个头文件包括WCHAR.H中都有定义,如下:

typedef unsigned short wchar_t ;

因此,wchar_t数据类型与无符号短整数型相同,都是16位宽。

(3)要定义包含一个宽字符的变量,可使用下面的语句:

wchar_t c = 'A' ;

变量c是一个双字节值0x0041,是Unicode表示的字母A。(然而,因为Intel微处理器从最小的字节开始储存多字节数值,该字节实际上是以0x41、0x00的顺序保存在记忆体中。如果检查Unicode文字的电脑储存应注意这一点。)

(4)可定义指向宽字串的指针:

wchar_t * p = L"Hello!" ;

注意紧接在第一个引号前面的大写字母L(代表「long」)。这将告诉编译器该字串按宽字符保存——即每个字符占用2个字节。通常,指针变量p要占用4个字节,而字串变量需要14个字节-每个字符需要2个字节,末尾的0还需要2个字节。

(5)可以用下面的语句定义宽字符数组:

static wchar_t a[] = L"Hello!" ;

该字串也需要14个字节的储存空间,sizeof (a) 将返回14。索引数组a可得到单独的字符。a[1] 的值是宽字符「e」,或者0x0065。第一个引号和L两个符号之间必须没有空格。L使编译器将字串存为每个字符2字节。

(6)可在单个字符文字前面使用L字首,来表示它们应解释为宽字符。如下所示:

wchar_t c = L'A' ;

但通常这是不必要的,C编译器会对该字符进行扩充,使它成为宽字符。

2.2.3 宽字符程序库函数

strlen函数的宽字符版是wcslen(wide-character string length:宽字串长度),并且在STRING.H(其中也说明了strlen)和WCHAR.H中均有说明。strlen函数说明如下:

size_t __cdecl strlen (const char *) ;

而wcslen函数则说明如下:

size_t __cdecl wcslen (const wchar_t *) ;

要得到宽字串的长度可以调用

wchar_t * pw = L"Hello!" ;

iLength = wcslen (pw) ;

函数将返回字串中的字符数6。改成宽字节後,字串的字符长度不改变,只是字节长度改变了。

所有带有字串参数的C执行时期程序库函数都有宽字符版。例如,wprintf是printf的宽字符版。这些函数在WCHAR.H和含有标准函数说明的头文件中说明。

2.2.4 维护单一原始码

使用Unicode最主要缺点是,程序中的每个字串都将占用两倍的储存空间。此外,宽字符执行时期程序库中的函数比常规的函数大。

因此,就有必要建立两个版本的程序——一个处理ASCII字串,另一个处理Unicode字串。最好的解决办法是维护既能按ASCII编译又能按Unicode编译的单一原始码档案。

一个办法是使用Microsoft Visual C++包含的TCHAR.H头文件。(该头文件不是ANSI C标准的一部分,因此其中定义的每个函数和巨集定义的前面都有一条下横线。)

TCHAR.H为需要字串参数的标准执行时期程序库函数提供了一系列的替代名称(例如,_tprintf和_tcslen)。有时这些名称也称为「通用」函数名称,因为它们既可以指向函数的Unicode版也可以指向非Unicode版。

如果定义了名为_UNICODE的识别字,并且程序中包含了TCHAR.H头文件,那么_tcslen就定义为wcslen:

#define _tcslen wcslen

如果没有定义UNICODE,则_tcslen定义为strlen:

#define _tcslen strlen

等等。

TCHAR.H还用一个新的数据类型TCHAR来解决两种字符数据类型的问题。如果定义了 _UNICODE识别字,那么TCHAR就是wchar_t:

typedef wchar_t TCHAR ;

否则,TCHAR就是char:

typedef char TCHAR ;

现在开始讨论字串文字中的L问题。如果定义了_UNICODE识别字,那么一个称作__T的巨集就定义如下:

#define __T(x) L##x

这是相当晦涩的语法,但合乎ANSI C标准的前置处理器规范。那一对井字号称为「粘贴符号(token paste)」,它将字母L添加到巨集引数上。因此,如果巨集引数是"Hello!",则L##x就是L"Hello!"。

如果没有定义_UNICODE识别字,则__T巨集只简单地定义如下:

#define __T(x) x

此外,还有两个巨集与__T定义相同:

#define _T(x) __T(x)

#define _TEXT(x) __T(x)

在Win32 console程序中使用哪个巨集,取决於您喜欢简洁还是详细。基本地,必须按下述方法在_T或_TEXT巨集内定义字串文字:

_TEXT ("Hello!")

这样做的话,如果定义了_UNICODE,那么该串将解释为宽字符的组合,否则解释为8位元的字符字串。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有