Windows编程-1-字符和字符串处理相关知识点总结
2013-12-11 09:05
609 查看
1:Windows常用的字符编码:
(1)ANSI单字节编码,就是以0结尾的字符串;
(2)Unicode(UTF-16)编码,始终是双字节;
特别建议:(1)在windows编程中使用UTF-16编码,因为windows内部都是使用Unicode进行编码,而使用ANSI编码进行数据处理时,windows内部都会将其转化为Unicode,再进行处理,影响效率;(2)因为C#使用的UTF-16,C#托管的代码和本地代码之间进行数据通信时,使用UTF-16会改进性能和减少内存消耗;
2:Windows中的ANSI和Unicode字符以及字符串数据类型定义
为了和传统C区分,在windows中,头文件 WinNT.h中重新定义了下面数据类型;
8位字符的数据类型以及指针类型,传统C数据类型:
16位字符的数据类型以及指针类型,Windows数据类型:
WinNT.h为了使两者统一还定义了下面的宏:
因此无论是ANSI还是UNICODE都可以用TCHAR来定义实现编译;
下面是一些应用列子:
说明:L的含义是告诉编译器当前字符串编译为一个Unicode字符串;上面程序是在MFC中实现测试的;
3:Windows工程中如何设置默认宽字符还是Unicode字符;
资源视图中,右键选择工程属性,在常规的字符集中进行选择;
4:Windows中Unicode函数和ANSI函数的区别
(1)一般如函数CreatWindowEx有两个版本,CreatWindowExA表示接受ANSI版本,CreatWindowExW表示接受Unicode字符串,W就是wide;
(2)传统的常用字符操作函数:取字符串长度函数:ANSI中使用的strelen、Unicode中为wcslen;ANSI中使用的strcpy、Unicode中为wcscpy;无论是传统的ANSI函数还是扩展的Unicode函数,这些函数在操作内存时时不安全的,因为没有指定缓冲区的长度;
(3)微软定义了新的函数在StrSafe.h中,使用这些函数是安全的,使用时将这个文件包含在其他都头文件最后既可;
5::微软提供的安全字符串操作函数
其中Cch就是采用字符计数处理字符串,Cb就是采用的是字节计数处理字符串;
(1)下面的函数是使用字符数,而不是字节数
(2)下面的函数是使用字符数,而不是字节数
总结:
(1)由于Windows自NT后所有系统版本都是用Unicode构建,使用ANSI字符进入系统后,系统都会将其转换,从而影响时间和系统开销;并且有写转换函数有bug,所以应避免使用这些函数;
(2)尽量使用安全字符串的函数,这样尽量避免程序中出现的bug;
(1)ANSI单字节编码,就是以0结尾的字符串;
(2)Unicode(UTF-16)编码,始终是双字节;
特别建议:(1)在windows编程中使用UTF-16编码,因为windows内部都是使用Unicode进行编码,而使用ANSI编码进行数据处理时,windows内部都会将其转化为Unicode,再进行处理,影响效率;(2)因为C#使用的UTF-16,C#托管的代码和本地代码之间进行数据通信时,使用UTF-16会改进性能和减少内存消耗;
2:Windows中的ANSI和Unicode字符以及字符串数据类型定义
为了和传统C区分,在windows中,头文件 WinNT.h中重新定义了下面数据类型;
8位字符的数据类型以及指针类型,传统C数据类型:
typedef char CHAR; typedef CHAR *PCHAR, *LPCH, *PCH;//字符指针 typedef CHAR *NPSTR, *LPSTR, *PSTR;//字符串指针 typedef CONST CHAR *LPCSTR, *PCSTR;//指向常变量的指针变量 |
typedef unsigned short WCHAR; // wc, 16-bit UNICODE character typedef wchar_t WCHAR; // wc, 16-bit UNICODE character typedef WCHAR *PWCHAR, *LPWCH, *PWCH;//字符指针 typedef WCHAR *NWPSTR, *LPWSTR, *PWSTR;//字符串指针 typedef CONST WCHAR *LPCWCH, *PCWCH;//指向常变量的指针变量 |
#ifdef UNICODE typedef WCHAR TCHAR, *PTCHAR; typedef CONST WCHAR *PCTCHAR; typedef WCHAR TBYTE , *PTBYTE ; #define __TEXT(quote) L##quote // r_winnt #else /* UNICODE */ // r_winnt typedef CHAR TCHAR, *PTCHAR; typedef CONST CHAR *PCTCHAR; typedef unsigned char TBYTE , *PTBYTE ; #define __TEXT(quote) quote // r_winnt #endif /* UNICODE */ // r_winnt #define TEXT(quote) __TEXT(quote) // r_winnt |
下面是一些应用列子:
//(1)默认熟悉的ANSI的8为数据类型:char,表示为一个8位的ANSI字符 char ch8_1='A';//一个字节 CHAR ch8_2='B'; char buff8_1[10]="A string";//9个8位的ANSI的字节,和一个字节的0结束符 PSTR buff8_2="B string"; //(2)微软定义的UTF-16的数据类型:wchar_t,表示一个16位的UTF-16字符 wchar_t ch16_1=L'A'; WCHARch16_2=L'B'; wchar_t buff16_1[10]=L"A string";//9个16位的UTF-16字符,和一个16位的0结束符 PWSTR buff16_2=L"B string"; //(3)使用TCHAR TCHAR ch=TEXT('A'); TCHAR chbuff_1[10]=TEXT("A string"); PTCHARchbuff_2=TEXT("C string"); |
3:Windows工程中如何设置默认宽字符还是Unicode字符;
资源视图中,右键选择工程属性,在常规的字符集中进行选择;
4:Windows中Unicode函数和ANSI函数的区别
(1)一般如函数CreatWindowEx有两个版本,CreatWindowExA表示接受ANSI版本,CreatWindowExW表示接受Unicode字符串,W就是wide;
(2)传统的常用字符操作函数:取字符串长度函数:ANSI中使用的strelen、Unicode中为wcslen;ANSI中使用的strcpy、Unicode中为wcscpy;无论是传统的ANSI函数还是扩展的Unicode函数,这些函数在操作内存时时不安全的,因为没有指定缓冲区的长度;
(3)微软定义了新的函数在StrSafe.h中,使用这些函数是安全的,使用时将这个文件包含在其他都头文件最后既可;
5::微软提供的安全字符串操作函数
其中Cch就是采用字符计数处理字符串,Cb就是采用的是字节计数处理字符串;
(1)下面的函数是使用字符数,而不是字节数
Strsafe.h function | Replaces |
StringCchCat StringCchCatEx | strcat, wcscat, lstrcat, strcat, StrCatBuff, _tcscat, _ftcscat |
StringCchCatN StringCchCatNEx | strncat, StrNCat |
StringCchCopy StringCchCopyEx | strcpy, wcscpy, lstrcpy, strcpy, _tcscpy, _ftcscpy |
StringCchCopyN StringCchCopyNEx | strncpy |
StringCchGets StringCchGetsEx | gets, _getws, _getts |
StringCchPrintf StringCchPrintfEx | sprintf, swprintf, wsprintf, wnsprintf, _stprintf, _snprintf, _snwprintf, _sntprintf |
StringCchVPrintf StringCchVPrintfEx | vsprintf, vswprintf, wvsprintf, wvnsprintf, _vstprintf, _vsnprintf, _vsnwprintf, _vsntprintf |
StringCchLength | strlen |
StringCbCat StringCbCatEx | strcat, wcscat, lstrcat, strcat, StrCatBuff, _tcscat, _ftcscat |
StringCbCatN StringCbCatNEx | strncat, StrNCat |
StringCbCopy StringCbCopyEx | strcpy, wcscpy, lstrcpy, strcpy, _tcscpy, _ftcscpy |
StringCbCopyN StringCbCopyNEx | strncpy |
StringCbGets StringCbGetsEx | gets, _getws, _getts |
StringCbPrintf StringCbPrintfEx | sprintf, swprintf, wsprintf, wnsprintf, _stprintf, _snprintf, _snwprintf, _sntprintf |
StringCbVPrintf StringCbVPrintfEx | vsprintf, vswprintf, wvsprintf, wvnsprintf, _vstprintf, _vsnprintf, _vsnwprintf, _vsntprintf |
StringCbLength | strlen |
总结:
(1)由于Windows自NT后所有系统版本都是用Unicode构建,使用ANSI字符进入系统后,系统都会将其转换,从而影响时间和系统开销;并且有写转换函数有bug,所以应避免使用这些函数;
(2)尽量使用安全字符串的函数,这样尽量避免程序中出现的bug;
相关文章推荐
- windows核心编程心解--字符和字符串处理
- Windows编程-2-内核对象相关知识点总结
- 【Windows 核心编程】Windows 核心编程 -- 字符和字符串处理
- windows编程中字符和字符串的处理
- Windows核心编程--错误处理/字符/字符串
- VC++ Windows平台字符透明编程大总结(转)
- PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
- 关于Windows系统下编程之字符处理
- VC++ Windows平台字符透明编程大总结
- Oracle 存储过程总结 二、字符串处理相关函数
- 关于Windows系统下编程之字符处理
- JavaScript第六章知识点总结——JavaScript常用DHTML对象 Document相关对象 事件处理
- 串的处理 在实际的开发工作中,对字符串的处理是最常见的编程任务。本题目即是要求程序对用户输入的串进行处理。具体规则如下: 1. 把每个单词的首字母变为大写。 2. 把数字与字母之间用下划线字符(_)分
- Windows平台字符透明编程大总结
- windows字符和字符串处理
- windows字符和字符串处理
- Oracle存储过程总结(二、字符串处理相关函数) .
- windows编程中的单字符和宽字符使用 总结
- 求解,windows编程中,win32程序,如何将字符串按一个一个字符逐个动态输出?
- 关于socket编程相关知识点总结