Uincode和ASCLL

来源:互联网 发布:javascript怎么发音 编辑:程序博客网 时间:2024/06/06 17:33

我的Windows学习之路–Unicode和ASCLL的区别和用法

为什么会有Unicode编码?因为ASCLL字符集无法表示所有的字符,它只能表示255个字符,所以Unicode就顺势而出了。

首先Unicode是双子节编码,它可以表示6W多种字符,足以表示世界上的字符。
从VS2010开始默认支持Unicode字符集(其它编译器我不知道),但VS2010以下的编译器你要手动设置当前项目的字符集。如下图所示:

以上是简单的了解。

Unicode编码的是双字节,也就是在C语言中就是宽字符,一个字符用两个字节编码

例如:char szAscll[]=”abcd”;
它是以单字节形式编码的,所以它的大小是4个字节
而 wchar_t szUnicode[]=L”abcd”;
它是以双字节编码的,所以它的大小是8个字节
它们两者在内存中的形式如下:
61 62 63 64 00
61 00 62 00 63 00 64 00 00
很明显,Unicode是用2个字节存储一个字符的,低位优先存储,然后再到高位,然而内存监视器把低位放前面高位放后面,理解就好。
接下来计算出它们的长度。
ASCLL用 size_t nSizeAscll=strlen(szAscll);来计算长度其中size_t是C语言中的数据类型,表示无符号整形
Unicode用 size_t nSizeUnicode=wcslen(szUnicode);来计算长度,其中wcslen是宽字符版的计算长度函数。size_t __cdecl wcslen (const wchar_t *) ;
注:千万不能用strlen来计算宽字符的长度,因为遇到00就会截止计算,这样就不能返回正确结果。

符号L的意思:L(LONG)是标识符,告诉编译器要用双字节编码存储。例如:
MessageBoxA( __in_opt HWND hWnd, __in_opt LPCSTR lpText,
__in_opt LPCSTR lpCaption, __in UINT uType);

         A就是ASCLL字符,所以LPCSTR lpText 的类型是单字符的

MessageBoxW( __in_opt HWND hWnd, __in_opt LPCWSTR lpText,
__in_opt LPCWSTR lpCaption, __in UINT uType);

       W就是宽字符(Unicode编码),所以LPCWSTR lpText 的类型是双字符的

一般双字符的前面要加L或者用TEXT宏,否则编译器会报错

你也可以直接使用MessageBox函数,编译器会根据当前项目的字符集来自动调用A或W。但是建议要显示调用,这样程序运行效率会提高。

还有两个关于宽字符和窄字符的函数
窄字符转宽字符:

int MultiByteToWideChar(  UINT CodePage,  //代码页一般填CP_ACP,详细看,MSDN  DWORD dwFlags,  //一般为0,详细看MSDN         LPCSTR lpMultiByteStr, //指向要转换的窄字符串的指针  int cbMultiByte,       //转换长度(字节数)  LPWSTR lpWideCharStr,//指向存放转换后款字符串的指针  int cchWideChar  //转换长度      );

宽字符转债字符:

int WideCharToMultiByte(  UINT CodePage, //代码页一般填CP_ACP,详细看,MSDN  DWORD dwFlags, //一般为0,详细看MSDN    LPCWSTR lpWideCharStr,//指向要转换的宽字符串的指针  int cchWideChar, //转换长度  LPSTR lpMultiByteStr, //指向接收被转换字符串的指针  int cbMultiByte,//指向的缓冲区最大值  LPCSTR lpDefaultChar,//遇到一个不能转换的宽字符,函数便会使用pDefaultChar参数指向的字符      LPBOOL lpUsedDefaultChar//至少有一个字符不能转换为其多字节形式,函数就会把这个变量设为TRUE);
1 0
原创粉丝点击