[转space]Unicode and non-Unicode

有别于 ASCII, Unicode 使用16位存储方式。
如下, ASCII 就是个char吧, whar_t用来表示Unicode的类型,它的定义是:
typedef unsigned short wchar_t;
Unicode的最大好处是只有一个字符集。当然Unicode也有缺点,Unicode占用的内存是ASCII码的两倍。
wchar_t *p = L“Hello!”;
在”Hello!”前有一个大写字母L(代表long)。这将告诉编译器该字符串按宽字符保存。即每个字符占用2个字符。存贮该字符串需要14个字节。字符串末尾还有一个/0也需要2个字节。
C语言的函数无法正确处理宽字符。如下:

wchar_t *pw = L”Hello!”;
iLength = strlen(pw);

strlen()的参数应该是char类型的指针,但是现在却接受了一个unsigned short类型的指针。编译后您会发现iLength等于1

why?   字符串”Hello!”中的6个字符宽字符代码如下:

0x0048 0x0065 0x006c 0x006c 0x006f 0x0021

Intel处理器在内存中将其存为:

48 00 65 00 6c 00 6c 00 6f 00 21 00

strlen()的工作过程是遇到0就结束。因为0表示一个字符串的结束。当读完”48″后strlen()遇到的是0,所以strlen()返回1。

strlen()的宽字符版本是wcslen(),并且在STRING.H中和WCHAR.H中均有声明.现在我们知道,要得到宽字符串的长度,可以调用

iLength = wcslen(pw);

该函数返回将返回字符串中的字符数6。请记住,改成宽字节后字符串的字符长度不变,只是字节长度改变了。千万不要混淆。
以_tcslen()为例, 如果定义了_UNICODE的标识符,并且程序中包含了TCHAR.H,那么_tcslen()就定义为wcslen():

#define _tcslen wcslen

如果没有定义_UNICODE,则_tcslen()被定义为strlen()。

#define _tcslen strlen

评论关闭。