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);
MessageBoxW( __in_opt HWND hWnd, __in_opt LPCWSTR lpText,
__in_opt LPCWSTR lpCaption, __in UINT uType);
一般双字符的前面要加L或者用TEXT宏,否则编译器会报错
你也可以直接使用MessageBox函数,编译器会根据当前项目的字符集来自动调用A或W。但是建议要显示调用,这样程序运行效率会提高。
还有两个关于宽字符和窄字符的函数
窄字符转宽字符:
宽字符转债字符:
为什么会有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 );
相关文章推荐
- BlockingQueue的使用
- java.lang.SecurityException: Need BLUETOOTH_PRIVILEGED permission:
- 根据内容自动调节cell的高度
- 创建圆角 抛出一个错误:二元运算符“|”不能用于两个UIRectCorner操作数
- Build.prop重要参数解释
- Java中parse()和valueOf(),toString()的区别
- 优化UITableView滚动的流畅性
- 解析request的反馈信息
- UITextField的提示文字水平居中
- UIScrollView循环滚动(前后各加一张图片)
- The request sent by the client was syntactically incorrect ()问题
- UID_PS_01_大师之路
- APUE学习之----进程通信pipe实现管道
- 队列ArrayBlockingQueue的使用
- 偶然翻出很久很久以前写的一款sqlmap UI,有点年头了
- 基于jQuey实现鼠标滑过变色(整行变色)
- django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法
- UI控件-UITextField
- [DP] Unique Binary Search Trees
- UICollectionView关于item的报错