新手做windows开发首先的一个问题就是把字符串搞懂。
一. 字符集简史
字符是一个独立于计算机的概念,没有计算机仍然有字符,字符是文字符号,英语汉语日语还有各种标点符号都是字符。
字符串就是字符组成的数组。
早先,计算机使用一个字节来表示一个字符,字节Byte是8位无符号数字,单字节编码ASCII可以表示大小写英文与一些标点符号。
后来为了显示汉字日语等亚洲文字,制定了双字节编码,使用两个或一个字节来表示一个字符。
而且使用了代码页,两个字节在不同的代码页中,所代表的字符也是不同的,简体中文代码页是GBK,繁体中文是BIG5等等。
这样一个字符串中,既有单字节的字符,又有双字节字符,很难统计一个字符串中的字符数量。
再后来有了UNICODE,UNICODE编码体系中的UTF-16标准,规定一律使用两个字节表示一个字符,这样可以表示世界上各种语言中的字符,不用代码页进行区分了,他们在UTF-16编码系统中都有了自己的16位编码了,虽然存储空间增大了,但效率提升是明显的。
二 各种字符串处理函数库
1 C运行库对字符串的处理:
str*系列: C运行库早期使用strlen strcpy等str*系列函数对char类型的字符串进行处理。
wcs*系列: C编译器内置了wchar_t这个16位宽字节类型后,使用新的wcslen wcscpy等wcs*系列的函数对wchar_t类型的字符串进行处理。
_tcs*系列: C运行库定义了宏_tcslen _tcscpy等_tcs*系列的宏定义,_tcs*系列函数在编译时根据是否预定义了宏_UNICODE而确定是采用wcs*系列函数,否则采用str*系列函数。
_tcs*_s系列: C运行库的最新安全字符串函数,为了防止缓冲区溢出而定义的新函数。
2 windows开发团队对字符串的处理:
Windows开发团队在winnt.h中定义了新的数据类型CHAR(char), WCHAR(wchar_t), TCHAR,TCHAR最终在编译时根据是否预定义了UNICODE宏而确定是CHAR还是WCHAR。
lstr*a系列: 在windows操作系统的Kernel32.dll中定义,处理CHAR类型的字符串,其实是对lstr*w的一层包装。
lstr*w系列: 在windows操作系统的Kernel32.dll中定义,处理WCHAR类型的字符串。
lstr*系列: lstr*系列函数也是在编译时才根据是否预定义了UNICODE宏来确定采用lstr*a系列函数,还是lstr*w系列函数。
其实我比较常用的是lstr*系列,因为这个是windows api,这样写出来的程序可以不用把C运行库链接进来。
有个需要注意的是,C运行库的_UNICODE和Windows的UNICODE,两个宏,要么同时定义,要么同时不定义。C运行库前缀下划线是为了遵守那个该死的C++标准(对于不属于C++标准的宏加下划线),而Windows没有遵守那个标准。
========================================
尽管字符串处理看起来很乱,但是抓住一个用就可以了,虽然目前推荐的标准是_tcs*_s系列,但是大家按自己的需要来使用,没有介绍stl库和mfc库中的字符串类型,因为那两个库是C++库,不是C库。
一. 字符集简史
字符是一个独立于计算机的概念,没有计算机仍然有字符,字符是文字符号,英语汉语日语还有各种标点符号都是字符。
字符串就是字符组成的数组。
早先,计算机使用一个字节来表示一个字符,字节Byte是8位无符号数字,单字节编码ASCII可以表示大小写英文与一些标点符号。
后来为了显示汉字日语等亚洲文字,制定了双字节编码,使用两个或一个字节来表示一个字符。
而且使用了代码页,两个字节在不同的代码页中,所代表的字符也是不同的,简体中文代码页是GBK,繁体中文是BIG5等等。
这样一个字符串中,既有单字节的字符,又有双字节字符,很难统计一个字符串中的字符数量。
再后来有了UNICODE,UNICODE编码体系中的UTF-16标准,规定一律使用两个字节表示一个字符,这样可以表示世界上各种语言中的字符,不用代码页进行区分了,他们在UTF-16编码系统中都有了自己的16位编码了,虽然存储空间增大了,但效率提升是明显的。
二 各种字符串处理函数库
1 C运行库对字符串的处理:
str*系列: C运行库早期使用strlen strcpy等str*系列函数对char类型的字符串进行处理。
wcs*系列: C编译器内置了wchar_t这个16位宽字节类型后,使用新的wcslen wcscpy等wcs*系列的函数对wchar_t类型的字符串进行处理。
_tcs*系列: C运行库定义了宏_tcslen _tcscpy等_tcs*系列的宏定义,_tcs*系列函数在编译时根据是否预定义了宏_UNICODE而确定是采用wcs*系列函数,否则采用str*系列函数。
_tcs*_s系列: C运行库的最新安全字符串函数,为了防止缓冲区溢出而定义的新函数。
2 windows开发团队对字符串的处理:
Windows开发团队在winnt.h中定义了新的数据类型CHAR(char), WCHAR(wchar_t), TCHAR,TCHAR最终在编译时根据是否预定义了UNICODE宏而确定是CHAR还是WCHAR。
lstr*a系列: 在windows操作系统的Kernel32.dll中定义,处理CHAR类型的字符串,其实是对lstr*w的一层包装。
lstr*w系列: 在windows操作系统的Kernel32.dll中定义,处理WCHAR类型的字符串。
lstr*系列: lstr*系列函数也是在编译时才根据是否预定义了UNICODE宏来确定采用lstr*a系列函数,还是lstr*w系列函数。
其实我比较常用的是lstr*系列,因为这个是windows api,这样写出来的程序可以不用把C运行库链接进来。
有个需要注意的是,C运行库的_UNICODE和Windows的UNICODE,两个宏,要么同时定义,要么同时不定义。C运行库前缀下划线是为了遵守那个该死的C++标准(对于不属于C++标准的宏加下划线),而Windows没有遵守那个标准。
========================================
尽管字符串处理看起来很乱,但是抓住一个用就可以了,虽然目前推荐的标准是_tcs*_s系列,但是大家按自己的需要来使用,没有介绍stl库和mfc库中的字符串类型,因为那两个库是C++库,不是C库。