windows中的字符串类型

上传人:平*** 文档编号:14352423 上传时间:2017-10-30 格式:DOCX 页数:18 大小:42.52KB
返回 下载 相关 举报
windows中的字符串类型_第1页
第1页 / 共18页
windows中的字符串类型_第2页
第2页 / 共18页
windows中的字符串类型_第3页
第3页 / 共18页
windows中的字符串类型_第4页
第4页 / 共18页
windows中的字符串类型_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《windows中的字符串类型》由会员分享,可在线阅读,更多相关《windows中的字符串类型(18页珍藏版)》请在金锄头文库上搜索。

1、Windows 字符串类型C+主要使用的是 C-Style 字符串,而 M$在 Windows 中又增加了很多 C-Style 字符串的变体。这个一多嘛,就容易乱所谓字符串,就是由字符组合而成,所以我们先来将将字符类型。首先,存在两种最基本的字符类型:char 和 wchar_t。char 大家都很熟悉了,我就跳过。至于 wchar_t,是应用于 UNICODE 的宽字符,即一个字符 2Bytes,16Bits。事实上,Windows 中利用typedef unsigned short wchar_t定义 wchar_t然后为了书写方便(MS 我也没觉得有多大差别),M$又把那两个基本字符类型

2、重新的给他 typedef 了一遍,即:typedef char CHARtypedef wchar_t WCHAR为了使得兼容性更加,M$又定义了 TCHAR 数据类型:#ifdef UNIOCDEtypedef WCHAR TCHAR#elsetypedef CHAR TCHAR#endif这样,你不用关心是要使用 ANSI 字符串还是 Unicode,编译器会自动根据你的 OS 来选择。然后,M$又利用上面的几种基本数据类型,定义了一些字符串指针类型。LPSTR 和 LPCSTR:LPSTR 是指向以 0 结尾的 ANSI 字符串的指针,后者是 const 指针typedef CHAR*

3、 LPSTRtypedef const CHAR* LPCSTRLPWSTR 和 LPCWSTR:LPWSTR 是指向以 0 结尾的 UNICODE 字符串的指针,后者是const 指针typedef WCHAR* LPWSTRtypedef const WCHAR* LPCWSTR同样,为了摆脱对 ANSI 还是 UNICODE 的选择麻烦,M$也增加了 LPTSTR 和 LPCTSTR 两个字符串指针类型。他们被如下定义:typedef TCHAR* LPTSTR#ifdef UNICODEtypedef LPWSTR LPTSTR#elsetypedef LPSTR LPTSTR#end

4、if/typedef const TCHAR* LPCTSTR#ifdef UNICODEtypedef LPCWSTR LPCTSTR#elsetypedef LPCSTR LPCTSTR#endifps:你会在某些地方看到存在 PSTR/PWSTR/PTSTR 等等,与上面的只却一个 L 的字符串指针类型。实际上,这个是长指针和短指针问题。LPXX 是长指针,PXX 是短指针。不过在32Bit 的系统上,二者已经没有区别。然后说说两个比较成熟好用的字符串类型:String 和 CStringString 是 C+的标准字符串,需要 string(不带.h)头文件和 std 名字空间支持。C

5、String 是 M$为 MFC 设计的字符串,功能更加强大,而且这玩意儿是安全的。需要atlstr.h 文件和 MFC DLL 的支持。不过目前已经有人将此类型从 MFC 中分离为了增强程序的通用性,还必须注意以下几点:1、既然程序里不能出现 char,那表示字符串时,就不能再习惯性的用 char*了。应该改为TCHAR*,或者是 PTSTR。后一种是 windows 的变量,类似的有:PSTR、PTSTR 、LPTSTR、LPSTR、PCTSTR 等等等等。这也是让人一开始接触会头大的地方。其实并非如此恐怖,我以 PCTSTR 为例做个解释:P 代表指针( 和 LP 是一个东西,LP的本意

6、是 Long Pointer,16 位 windows 时代的遗留物。) ,C 代表 const,T 代表TCHAR,STR 代表字符串。所以 PCTSTR 其实就是 const TCHAR* 的意思。而 PSTR 也就是 char* 的意思。所以我们在表示字符串时也不能使用 PSTR 等不带 T 的变量类型名。2、表示字符串常量时,不能简单的用双引号括起来,因为那代表 ascii 字符串。同样也不能在前面加 L,因为那代表 unicode。我们的程序要做到的是通用性,即不是 ascii 也不是unicode。所以我们在字符串前应该加的是 TEXT,比如 MessageBox(NULL,TEX

7、T(Fypher),TEXT(FF),MB_OK)。TEXT 还可用于字符。比如 TCHAR m=TEXT(A);3、TCHAR FF50。FF 能装多少字符?哈!不要习惯性的 sizeof(FF)了,应该_countof(FF)或者 sizeof(FF)/sizeof(TCHAR)。因为我们不确定 TCHAR 到底是 char 还是 wchar_t。4、该和一堆老朋友说再见了我们不能再使用以前的字符串处理函数或者字符处理函数了。比如 strlen、strcat、strcmp 等等等等 因为这些是 ascii 专用的,通通改成使用 T 家族的吧。前缀都换成_tcs。比如_tcslen、_tcs

8、cat、_tcscmp 等等顺便补充一下 wcs 前缀是 wchar_t 使用的。恩,还有大家用得超爽的 sprintf,今后就改成 _stprintf 了吧呵呵。补充:swprintf 是 wchar_t 它家的。对了,windows 认为 _tcscpy、_tcscat 等不安全,所以使用这些函数编译器会报警。可以改用 windows 推出的 _tcscpy_s、_tcscat_s 等“安全”函数,其实就是多了个参数用来指明缓冲区大小(记得用_countof 哦!_ )。windows 还推出了形如 StringCchCat 的一套字符串处理函数,我没怎么用过。windows 也有一个字符

9、串比较函数 CompareString。功能比 _tcscmp 强大多了。比如可以设置忽略大小写等。5、IsTextUnicode 函数可以用过一系列统计学的方法判断某个字符串是不是 unicode 字符串。 MultiByteToWideChar 和 WideCharToMultiByte 函数可实现 Ascii 和 Unicode 字符串的相互转化。这些的使用场合都不大。因为我们的程序应该做到“没有”ascii 和 unicode。6、虽然绝大多数情况下应该使用 TCHAR,但是记住 GetProcAdress 这个特殊的函数吧,它的参数只能是 char*。因为在导出函数表里函数名是用 a

10、scii 码写的7、最后一点,记得要#include 哦!呵呵 由于 windows 内核采用的是UNICODE,UNICODE 版的程序必然比 ASCII 版的程序效率高(比如不用在调用函数时在堆里分配空间把参数转成 UNICODE,然后再调用 UNICODE 版的函数),所以我们最好是在程序的开头加上#define UNICODE 和#define _UNICODE,把程序转换成 UNICODE 版的。如果程序的字符串处理完全按照上面的通用性要求做了是不会出错的。8、注意:str 前缀与 wcs 前缀都是标准 C 函数,需要有标准 C 运行库才能够使用。而 lstr前缀的是 window

11、提供的原生函数,不需标准 C 运行库。9、如何对 Unicode 进行操作? 字符集 特性 实例 ANSI 操作函数以 str 开头 strcpy Unicode 操作函数以 wcs 开头 wcscpy MBCS 操作函数以_mbs 开头 _mbscpy ANSI/Unicode 操作函数以_tcs 开头 _tcscpy( C 运行期库) ANSI/Unicode 操作函数以 lstr 开头 lstrcpy(Windows 函数) 所有新的和未过时的函数在 Windows2000 中都同时拥有 ANSI 和 Unicode 两个版本。ANSI 版本函数结尾以 A 表示;Unicode 版本函数

12、结尾以 W 表示。Windows 会如下定义:#ifdef UNICODE #define CreateWindowEx CreateWindowExW #else #define CreateWindowEx CreateWindowExA #endif / !UNICODEVC+中 TCHAR、MBCS 等字符类型Visual C+支持多字节字符集 (MBCS)多字节字符集 (MBCS) 是一种替代 Unicode 以支持无法用单字节表示的字符集(如日文和中文)的方法。为国际市场编程时应考虑使用 Unicode 或 MBCS,或使程序能够通过更改开关来生成支持两种字符集之一的程序。最常见的

13、 MBCS 实现是双字节字符集 (DBCS)。一般来说, Visual C+(尤其是 MFC)完全支持 DBCS。有关示例,请参见 MFC 源代码文件。对于语言使用大字符集的市场所使用的平台,代替 Unicode 的最佳方法是 MBCS。MFC 通过使用可国际化的数据类型和 C 运行时函数来支持 MBCS。您也应在自己的代码中这样操作。在 MBCS 下,字符被编码为单字节或双字节。在双字节字符中,第一个字节(即前导字节)表示它和下一个字节将被解释为一个字符。第一个字节来自留作前导字节的代码范围。哪个范围的字节可以用作前导字节取决于所使用的代码页。例如,日文代码页 932 使用0x81 到 0x

14、9F 范围内的字节作为前导字节,而朝鲜语代码页 949 则使用其他范围的字节。在 MBCS 编程中需考虑下列所有因素。环境中的 MBCS 字符MBCS 字符可以出现在文件名和目录名等字符串中。编辑操作MBCS 应用程序上的编辑操作应在字符上操作,而非在字节上操作。插入符号不应拆分字符,向右键应向右移动一个字符等。Delete 应删除一个字符; Undo 则应将字符重新插入。字符串处理在使用 MBCS 的应用程序中,字符串处理引起特殊问题。两种宽度的字符混合在一个字符串中;因此必须记住检查前导字节。运行时库支持C 运行时库和 MFC 支持单字节、MBCS 和 Unicode 编程。单字节字符串用

15、 str 运行时函数族处理,MBCS 字符串用相应的 _mbs 函数处理,而 Unicode 字符串用相应的 wcs 函数处理。MFC 类成员函数的实现使用可移植运行时函数,这些可移植运行时函数在正常情况下映射到标准 str 函数族、MBCS 函数或 Unicode 函数,如“MBCS/Unicode 可移植性” 中所述。MBCS/Unicode 可移植性使用 Tchar.h 头文件可以用同一个源生成单字节的 MBCS 应用程序和 Unicode 应用程序。Tchar.h 定义以 _tcs 为前缀的宏,这些宏根据相应的情况映射到 str、 _mbs 或 wcs 函数。若要生成 MBCS,请定义 _MBCS 符号。若要生成 Unicode,请定义 _UNICODE 符号。默认情况下,为 MFC 应用程序定义的是 _MBCS。有关更多信息,请参见 Tchar.h 中的一般文本映射。Tchar.h 中的一般文本映射为简化代码传输以方便国际使用,Microsoft 运行时库为许多数据类型、例程和其他对象提供 Microsoft 特定的“一般文本”映射。您可以使用 T

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号