您的位置:首页 > 产品设计 > UI/UE

Uincode和ASCLL

2015-12-07 16:20 393 查看
我的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
);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: