Windows编程-1-字符和字符串处理相关知识点总结
来源:互联网 发布:sql注入布尔型攻击 编辑:程序博客网 时间:2024/05/21 20:57
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数据类型:
typedef char CHAR;
typedef CHAR *PCHAR, *LPCH, *PCH;//字符指针
typedef CHAR *NPSTR, *LPSTR, *PSTR;//字符串指针
typedef CONST CHAR *LPCSTR, *PCSTR;//指向常变量的指针变量
16位字符的数据类型以及指针类型,Windows数据类型:
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;//指向常变量的指针变量
WinNT.h为了使两者统一还定义了下面的宏:
#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
因此无论是ANSI还是UNICODE都可以用TCHAR来定义实现编译;
下面是一些应用列子:
//(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");
说明: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)下面的函数是使用字符数,而不是字节数
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
(2)下面的函数是使用字符数,而不是字节数
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编程-1-字符和字符串处理相关知识点总结
- Windows核心编程:字符和字符串处理
- 字符和字符串处理 《Windows核心编程》
- Windows核心编程:字符和字符串处理
- Windows核心编程 字符和字符串处理
- 【Windows 核心编程】Windows 核心编程 -- 字符和字符串处理
- windows编程中字符和字符串的处理
- windows编程中字符和字符串的处理
- windows核心编程心解--字符和字符串处理
- windows编程中字符和字符串的处理
- Windows核心编程(二)字符和字符串处理
- 《Windows核心编程5》第二章-字符和字符串处理
- Windows核心编程笔记——字符和字符串处理
- windows核心编程学习日记-字符和字符串处理 上篇
- Windows核心编程002-字符和字符串处理
- windows编程中字符和字符串的处理
- windows核心编程 第2章 字符和字符串处理
- 《Windows核心编程》读书笔记二 字符和字符串处理
- SystemServer进程启动过程源码分析
- jquery js 常用正则表达式
- Hessian矩阵
- windows和linux(ubuntu13.04)双系统安装教程
- java访问远程共享文件
- Windows编程-1-字符和字符串处理相关知识点总结
- 黑马程序员_两种遍历集合的方法Iterator接口和foreach循环
- 批量SSH key-gen无密码登陆认证脚本
- ArcGIS Web API 接入天地图瓦片
- 返回select行數
- 指针篇之十一 函数指针
- Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before
- 推荐给大家一个php代码格式化在线工具
- “ImageCLEF 2012 plant overview” 摘要