您的位置:首页 > 编程语言

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数据类型:

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, wcscatlstrcatstrcatStrCatBuff, _tcscat, _ftcscat

StringCchCatN

StringCchCatNEx

strncatStrNCat

StringCchCopy

StringCchCopyEx

strcpy, wcscpylstrcpystrcpy, _tcscpy, _ftcscpy

StringCchCopyN

StringCchCopyNEx

strncpy

StringCchGets

StringCchGetsEx

gets, _getws, _getts

StringCchPrintf

StringCchPrintfEx

sprintf, swprintfwsprintfwnsprintf, _stprintf, _snprintf, _snwprintf, _sntprintf

StringCchVPrintf

StringCchVPrintfEx

vsprintf, vswprintfwvsprintfwvnsprintf, _vstprintf, _vsnprintf, _vsnwprintf, _vsntprintf

StringCchLength

strlen

(2)下面的函数是使用字符数,而不是字节数

StringCbCat

StringCbCatEx

strcat, wcscatlstrcatstrcatStrCatBuff, _tcscat, _ftcscat

StringCbCatN

StringCbCatNEx

strncatStrNCat

StringCbCopy

StringCbCopyEx

strcpy, wcscpylstrcpystrcpy, _tcscpy, _ftcscpy

StringCbCopyN

StringCbCopyNEx

strncpy

StringCbGets

StringCbGetsEx

gets, _getws, _getts

StringCbPrintf

StringCbPrintfEx

sprintf, swprintfwsprintfwnsprintf, _stprintf, _snprintf, _snwprintf, _sntprintf

StringCbVPrintf

StringCbVPrintfEx

vsprintf, vswprintfwvsprintfwvnsprintf, _vstprintf, _vsnprintf, _vsnwprintf, _vsntprintf

StringCbLength

strlen

 

总结:

(1)由于Windows自NT后所有系统版本都是用Unicode构建,使用ANSI字符进入系统后,系统都会将其转换,从而影响时间和系统开销;并且有写转换函数有bug,所以应避免使用这些函数;

(2)尽量使用安全字符串的函数,这样尽量避免程序中出现的bug;

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: