Windows下宽字符集与char
来源:互联网 发布:政府大数据平台的建设 编辑:程序博客网 时间:2024/06/04 19:31
我们都知道如何获得字符串的长度。例如,如果我们已经像下面这样定义了一个字符串指针:
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_t __cdecl strlen (const char *) ;
而wcslen函数则说明如下:
size_t __cdecl wcslen (const wchar_t *) ;
这时我们知道,要得到宽字符串的长度可以呼叫
iLength = wcslen (pw) ;
函数将返回字符串中的字符数6。请记住,改成宽字节后,字符串的字符长度不改变,只是位组长度改变了。
您熟悉的所有带有字符串参数的C执行时期链接库函数都有宽字符版。例如,wprintf是printf的宽字符版。这些函数在WCHAR.H和含有标准函数说明的表头文件中说明。
- Windows下宽字符集与char
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- 宽字节与单字节的转换 Unicode字符集下CString与char *转换
- 宽字节与单字节的转换 Unicode字符集下CString与char *转换
- 宽字节与单字节的转换 Unicode字符集下CString与char *转换
- 宽字节与单字节的转换 Unicode字符集下CString与char *转换
- iphone应用程序开发指南
- 一个Excel导入SQL server的例子(分别使用游标、CTE、master..spt_values实现)
- JavaScript 时间、格式、转换及Date对象总结
- JS 动态控制checkbox嵌套checkbox text不用与否
- oracle 丢失日志(redoxx_xx)文件后的处理方法
- Windows下宽字符集与char
- web game 开发注意事项
- hdu 1754 I Hate It
- SQL中的系统变量一览
- C#反射浅显讲解
- Oracle三种集合数据类型(索引表,嵌套表,VARRAY 数组)的比较-PLSQL—之三
- 6个出色的基于JQuery的Tab选项卡实例
- windows 上一个.exe程序是如何运行的
- 如何实现在浏览器中打开IM聊天窗口?