设为首页 加入收藏

TOP

Unicode简介(十一)
2010-12-30 21:07:57 来源: 作者: 【 】 浏览:12512
Tags:Unicode 简介
元。

宽字元程式库函式
 

我们都知道如何获得字串的长度。例如,如果我们已经像下面这样定义了一个字串指标:

char * pc = "Hello!" ;

我们可以呼叫

iLength = strlen (pc) ;

这时变数iLength将等於6,也就是字串中的字元数。

太好了!现在让我们试著定义一个指向宽字元的指标:

wchar_t * pw = L"Hello!" ;

再次呼叫strlen :

iLength = strlen (pw) ;

现在麻烦来了。首先,C编译器会显示一条警告消息,可能是这样的内容:

'function' : incompatible types - from 'unsigned short *' to 'const char *'

这条消息的意思是:宣告strlen函式时,该函式应接收char类型的指标,但它现在却接收了一个unsigned short类型的指标。您仍然可编译并执行该程式,但您会发现iLength等於1。为什么?

字串「Hello!」中的6个字元占用16位元:

0x0048 0x0065 0x006C 0x006C 0x006F 0x0021

Intel处理器在记忆体中将其存为:

48 00 65 00 6C 00 6C 00 6F 00 21 00

假定strlen函式正试图得到一个字串的长度,并把第1个位元组作为字元开始计数,但接著假定如果下一个位元组是0,则表示字串结束。

这个小练习清楚地说明了C语言本身和执行时期程式库函式之间的区别。编译器将字串L"Hello!" 解释为一组16位元短整数型态资料,并将其保存在wchar_t阵列中。编译器还处理阵列索引和sizeof操作符,因此这些都能正常工作,但在连结时才添加执行时期程式库函式,例如strlen。这些函式认为字串由单位元组字元组成。遇到宽字串时,函式就不像我们所希望那样执行了。

您可能要说:「噢,太麻烦了!」现在每个C语言程式库函式都必须重写以接受宽字元。但事实上并不是每个C语言程式库函式都需要重写,只是那些有字串参数的函式才需要重写,而且也不用由您来完成。它们已经重写完了。

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

size_
首页 上一页 8 9 10 11 12 13 14 下一页 尾页 11/21/21
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇视窗和讯息 下一篇没有了

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: