windows核心编程 第2章 字符和字符串处理
2016-06-06 11:29
375 查看
咳咳,今天效率低了一点o(︶︿︶)o 决定先快速把这本书看完一遍主要参考:http://www.cnblogs.com/Ripper-Y/archive/2012/05/16/2505444.html
1、三种计算机字符集 计算机字符集可归类为三种,单字节字符集(SBCS)、多字节字符集(MBCS)和宽字符集(即Unicode字符集)。 单字节字符集(SBCS): 单字节字符集,称之为SBCS,它的所有字符都只有一个字节的长度。常见字符集有:ASCII码和扩展ASCII码。SBCS字符串由一个零字节结尾,数据类型是char。 多字节字符集(MBCS):汉字字符占两个字节长度而英文字母占一个字节长度。我们国家利用连续2个扩展ASCII码的扩展区域(0xA0以后)来表示一个汉字,该方法的标准叫GB-2312,之后又扩展出GBK和GB18030。后来,日文、韩文、阿拉伯文、台湾繁体...都使用类似的方法扩展了本地字符集的定义, 现在统一称为 MBCS字符集(多字节字符集,既用多个字节表示一个字符)。其实最常见的还是用2个字节表示一个字符,称为DBCS(双字节字符集)。此类常见字符集有gb2312(中国),big5(中国台湾地区),jis(日本)...。多字节字符集(MBCS)兼容单字节字符集(SBCS),通常并不区分他们。同SBCS一样,MBCS字符串也由一个零字节结尾,数据类型也是char。 但这个方法是有缺陷的,因为各个国家地区各自定义的字符集免不了会有交集。因此使用GB-2312的软件,就不能在BIG-5的环境下运行(显示乱码)。 宽字符集(Unicode字符集): 为了把全世界所有的文字符号都统一进行编码,于是制定了UNICODE字符集。标准的UNICODE字符集(即UCS-2,又称UTF-16)规定使用2个字节表示一个字符,这下终于好啦,全世界任何一个地区的软件,可以不用修改地就能在另一个地区运行了。Unicode字符数据类型有:WCHAR、_wchar_t、OLECHAR。
UTF:Unicode Transformation Format三种编码方式:UTF-8 UTF-16 UTF-32UTF-8:根据字符的分类,分别用1~4字节来表示一个字符UTF-32:所有的字符都用4字节表示UTF-16:用两字节表示大部分语言的字符,当两节字无法表示时通过surrogates四字节表示字符注:.Net FrameWork用UTF 16对所有字符进行编码,所以当需要在托管和非托管代码间传递字符或字符串时最好用UTF16统一字符的编码方式。这样可以提高程序的性能,节省内存
2、C运行期库对Unicode的支持
#include <String.h>typedef unsigned short wchar_t;wchar_t *wcscat(wchar_t*, const wchar_t*);wchar_t *wcschr(const wchar_t*, wchar_t);
所有Unicode函数均以wcs开头,wcs是宽字符串的英文缩写,若要使用Unicode函数,只需用前缀wcs来取代ANSI字符串函数的前缀str即可。
TChar.h可以帮助创建ANSI/Unicode通用源代码文件,它包含你应该用在源代码中的一组宏,而不应该直接调用str函数或者wcs函数,如果在编译源代码文件时定义了_UNICODE,这些宏就会引用wcs这组函数,如果没有定义_UNICODE,那么这些宏将引用str这组宏。
3、Windows定义的Unicode数据类型
WCHAR Unicode字符PWSTR 指向Unicode字符串的指针PCWSTR 指向一个恒定的Unicode字符串的指针PTSTR ANSI/Unicode通用数据类型,取决于是否定义了UNICODE宏
Windows字符串函数
Windows提供了一组范围很广的字符串操作函数。这些函数与C运行期字符串函数很相似,但是它们属于操作系统的一部分,建议最好使用操作系统函数,因为这将有助于稍稍提高你的应用程序的运行性能,操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用,由于这些函数使用得很多,因此,在你的应用程序运行时,它们可能已经被装入RAM。
Windows提供的字符串操作函数包括:lstrcat lstrcmp lstrcmpi lstrcpy lstrlen,要注意的是这些函数是作为宏来实现的,这些宏既可以调用函数的Unicode版本,也可以调用函数的ANSI版本。
4、在Windows头文件WinNT.h中定义: typedef char CHAR; //8-bit typedef CHAR *PCHAR; typedef CONST CHAR *PCSTR;------------------------------------------------------------------------------------------------------- typedef wchar_t WCHAR; //16-bit typedef WCHAR *PWCHAR; typedef CONST WCHAR *PCWSTR;------------------------------------------------------------------------------------------------------ 在API中经常遇到的参数类型:PCTSTR #ifdef UNICODE typedef LPCWSTR PCTSTR; #else typedef LPCSTR PCTSTR; #endif
当没有定义_UNICODE宏时,TCHAR = char 当定义了_UNICODE宏时,TCHAR = wchar_t
5、Windows中常见字符串函数 int CompareString( LCID Locale, DWORD dwCmpFlags, LPCTSTR lpString1, int cchCount1, LPCTSTR lpString2, int cchCount2 ); LCID:locale ID,32位值,用来标识一种语言,这个函数以符号当地语言习惯的方式来比较,得到更有意义的结果-------------------------------------------------------------- int CompareStringOrdinal( LPCWSTR lpString1, int cchCount1, LPCWSTR lpString2, int cchCount2, BOOL bIgnoreCase ); 这个函数执行的是码位(code-point)比较,不考虑区域设置,所以速度很快,只支持Unicode字符串;
7、TEXT是在winnt.h中定义 举例:TCHAR *ptch = TEXT("This is a const string."); 如果使用UNICODE字符集, 则TEXT("This is a const string.")相当于L"This is a const string.", 如果使用ASCII集, 则上述字符串相当于“This is a const string.”;
若程序以Unicode格式编译,则_T会把”你好,MFC“以Unicode格式保存,中英文都被处理。而另一个_L宏则是强制性的以Unicode格式保存(双字节)。_T与_L的区别就在于,一个是适配的,一个是强制的。
#ifdef _UNICODE的时候_T就是L没有#ifdef _UNICODE的时候_T就是ANSI的。
而且MS推荐你使用相匹配的字符串函数。比如处理LPTSTR或者LPCTSTR 的时候,不要用strlen ,而是要用_tcslen否则在UNICODE的编译条件下,strlen不能处理 wchar_t*的字符串。T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集?编译的时候才决定
8、Unicode与ANSI字符串转换 int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar );------------------------------------------------------------------------------------------------------- int MultiByteToWideChar( UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar );
9、判断文本是ANSI还是Unicode BOOL IsTextUnicode( const VOID *lpv, int iSize, LPINT lpiResult ); 此方法并不一定准确。
1、三种计算机字符集 计算机字符集可归类为三种,单字节字符集(SBCS)、多字节字符集(MBCS)和宽字符集(即Unicode字符集)。 单字节字符集(SBCS): 单字节字符集,称之为SBCS,它的所有字符都只有一个字节的长度。常见字符集有:ASCII码和扩展ASCII码。SBCS字符串由一个零字节结尾,数据类型是char。 多字节字符集(MBCS):汉字字符占两个字节长度而英文字母占一个字节长度。我们国家利用连续2个扩展ASCII码的扩展区域(0xA0以后)来表示一个汉字,该方法的标准叫GB-2312,之后又扩展出GBK和GB18030。后来,日文、韩文、阿拉伯文、台湾繁体...都使用类似的方法扩展了本地字符集的定义, 现在统一称为 MBCS字符集(多字节字符集,既用多个字节表示一个字符)。其实最常见的还是用2个字节表示一个字符,称为DBCS(双字节字符集)。此类常见字符集有gb2312(中国),big5(中国台湾地区),jis(日本)...。多字节字符集(MBCS)兼容单字节字符集(SBCS),通常并不区分他们。同SBCS一样,MBCS字符串也由一个零字节结尾,数据类型也是char。 但这个方法是有缺陷的,因为各个国家地区各自定义的字符集免不了会有交集。因此使用GB-2312的软件,就不能在BIG-5的环境下运行(显示乱码)。 宽字符集(Unicode字符集): 为了把全世界所有的文字符号都统一进行编码,于是制定了UNICODE字符集。标准的UNICODE字符集(即UCS-2,又称UTF-16)规定使用2个字节表示一个字符,这下终于好啦,全世界任何一个地区的软件,可以不用修改地就能在另一个地区运行了。Unicode字符数据类型有:WCHAR、_wchar_t、OLECHAR。
UTF:Unicode Transformation Format三种编码方式:UTF-8 UTF-16 UTF-32UTF-8:根据字符的分类,分别用1~4字节来表示一个字符UTF-32:所有的字符都用4字节表示UTF-16:用两字节表示大部分语言的字符,当两节字无法表示时通过surrogates四字节表示字符注:.Net FrameWork用UTF 16对所有字符进行编码,所以当需要在托管和非托管代码间传递字符或字符串时最好用UTF16统一字符的编码方式。这样可以提高程序的性能,节省内存
2、C运行期库对Unicode的支持
#include <String.h>typedef unsigned short wchar_t;wchar_t *wcscat(wchar_t*, const wchar_t*);wchar_t *wcschr(const wchar_t*, wchar_t);
所有Unicode函数均以wcs开头,wcs是宽字符串的英文缩写,若要使用Unicode函数,只需用前缀wcs来取代ANSI字符串函数的前缀str即可。
TChar.h可以帮助创建ANSI/Unicode通用源代码文件,它包含你应该用在源代码中的一组宏,而不应该直接调用str函数或者wcs函数,如果在编译源代码文件时定义了_UNICODE,这些宏就会引用wcs这组函数,如果没有定义_UNICODE,那么这些宏将引用str这组宏。
3、Windows定义的Unicode数据类型
WCHAR Unicode字符PWSTR 指向Unicode字符串的指针PCWSTR 指向一个恒定的Unicode字符串的指针PTSTR ANSI/Unicode通用数据类型,取决于是否定义了UNICODE宏
Windows字符串函数
Windows提供了一组范围很广的字符串操作函数。这些函数与C运行期字符串函数很相似,但是它们属于操作系统的一部分,建议最好使用操作系统函数,因为这将有助于稍稍提高你的应用程序的运行性能,操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用,由于这些函数使用得很多,因此,在你的应用程序运行时,它们可能已经被装入RAM。
Windows提供的字符串操作函数包括:lstrcat lstrcmp lstrcmpi lstrcpy lstrlen,要注意的是这些函数是作为宏来实现的,这些宏既可以调用函数的Unicode版本,也可以调用函数的ANSI版本。
4、在Windows头文件WinNT.h中定义: typedef char CHAR; //8-bit typedef CHAR *PCHAR; typedef CONST CHAR *PCSTR;------------------------------------------------------------------------------------------------------- typedef wchar_t WCHAR; //16-bit typedef WCHAR *PWCHAR; typedef CONST WCHAR *PCWSTR;------------------------------------------------------------------------------------------------------ 在API中经常遇到的参数类型:PCTSTR #ifdef UNICODE typedef LPCWSTR PCTSTR; #else typedef LPCSTR PCTSTR; #endif
当没有定义_UNICODE宏时,TCHAR = char 当定义了_UNICODE宏时,TCHAR = wchar_t
5、Windows中常见字符串函数 int CompareString( LCID Locale, DWORD dwCmpFlags, LPCTSTR lpString1, int cchCount1, LPCTSTR lpString2, int cchCount2 ); LCID:locale ID,32位值,用来标识一种语言,这个函数以符号当地语言习惯的方式来比较,得到更有意义的结果-------------------------------------------------------------- int CompareStringOrdinal( LPCWSTR lpString1, int cchCount1, LPCWSTR lpString2, int cchCount2, BOOL bIgnoreCase ); 这个函数执行的是码位(code-point)比较,不考虑区域设置,所以速度很快,只支持Unicode字符串;
7、TEXT是在winnt.h中定义 举例:TCHAR *ptch = TEXT("This is a const string."); 如果使用UNICODE字符集, 则TEXT("This is a const string.")相当于L"This is a const string.", 如果使用ASCII集, 则上述字符串相当于“This is a const string.”;
若程序以Unicode格式编译,则_T会把”你好,MFC“以Unicode格式保存,中英文都被处理。而另一个_L宏则是强制性的以Unicode格式保存(双字节)。_T与_L的区别就在于,一个是适配的,一个是强制的。
#ifdef _UNICODE的时候_T就是L没有#ifdef _UNICODE的时候_T就是ANSI的。
而且MS推荐你使用相匹配的字符串函数。比如处理LPTSTR或者LPCTSTR 的时候,不要用strlen ,而是要用_tcslen否则在UNICODE的编译条件下,strlen不能处理 wchar_t*的字符串。T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集?编译的时候才决定
8、Unicode与ANSI字符串转换 int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar );------------------------------------------------------------------------------------------------------- int MultiByteToWideChar( UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar );
9、判断文本是ANSI还是Unicode BOOL IsTextUnicode( const VOID *lpv, int iSize, LPINT lpiResult ); 此方法并不一定准确。
相关文章推荐
- windows核心编程 第1章 错误处理
- C++类访问控制及继承
- C++虚析构函数
- struts2与页面交互参数的3种模式
- C\\C++语言杂谈
- C++ 虚函数表解析
- C++ 实现DLL注入(一)实现
- pat-函数编程题5-2(然后是几点)
- python 迭代器(转)
- 程序自我复制(c++)
- 汉诺塔实现程序(C++)
- C#中datagridview使用tooltip控件显示单元格内容的方法
- C++面试笔记--继承和接口
- 转 Python爬虫实战二之爬取百度贴吧帖子
- Eclipse中自动添加注释(作者,时间)
- (转)编码规范系列(一):Eclipse Code Templates设置
- JAVA并发-减少锁的竞争
- java中,MD5加密
- Java的GC的内部原理
- java23种设计模式提纲