【数据类型】字符串

字符串数组

所有的string类都是以C-style字符串为基础的。C-style字符串是字符数组,char*只提供首地址,以'\0'或'\00'判断结尾。

字符集

字符数组常用的有2种字符集:多字节MBCS 和双字节 UNICODE

编译选项加入 _UNICODE 和UNICODE 选项,保证相关的库文件可以拷贝到system32下。

CRunTime头文件使用了_UNICODE宏,Windows头文件使用UNICODE宏。自己写的函数考虑 UNICODE下的两种情况可能也是常态。

多字节字符集使用_MBCS 编译选项。

UNICODE字符集通信时也需要转换为网络字节序:WORD = ntohs(*(reinterpret_cast<WORD*>(&UNICODE)));

因为超出1BYTE,在不同机器上也会有不同的机器字节序

Unicode打开中文环境,也可以用STL里的类设定区域

std::locale::global(std::locale(""));   //设为系统默认区域
std::locale::global(std::locale("C")); //设为C区域

    

字符串操作

http:\\C\C++字符串操作

C和STL提供了直接处理字符数组的操作,但没有一个统一的宏。

     strlen(); //返回char数           strcpy(p1,p2);//遇'\0'结束

     wcslen();//返回wchar数       wcscpy(p1,p2);//遇'\00'结束

如果要想Windws那样使用要自定义T宏。(自己写的函数考虑 UNICODE的两种情况)

Win32定义了TCHAR相关宏,其中每个与字符串相关的API和message都有两个版本A和W,由一个宏判断UNICODE和_UNICODE选择用哪个函数。

   

字符串类

字符串类封装了字符串数组,提供的方法实际是在操作内部的这个数组。

STL:  basic_string<char\wchar>    string\wstring;

           所以使用string要包含<string>,它实际上是一个容器。作为一个STL容器,它可以直接构造和赋值对应的 "A和W字符串",通过c_str()返回封装字符串的首地址。

http:\\STL字符串类basic_string< TCHAR >

MFC: CString是一个好用的字符串封装类,它的构造函数可以接受"A和W字符串",不用费心选择是用string还是wstring,确定字符集选项,传_T()即可。重载了LPCTSTR类型转换符,可以隐式转换为const字符串。

注意,STL与MFC字符串类返回的内部字符串首地址都是const的,其字符操作基本也不直接操作内部,而是返回一个拷贝。外部若是直接接收内部字符串首址:TCHAR*,除非保证是只读操作,否则准备好空间拷贝被封装的内部字符串:

      char* = new char[string.length()];                   

      strcpy(char*, string.c_str())

http:\\MFC字符串类CString

要注意字符串类操作,对内部字符数组变量的改变,有可能重新分配控件,导致原地址失效。有时间可以看看源码,但只要关注这部分就可以了

  

ATL转换宏

ATL:ATL封装类针对远端传输,内部字符串数组为C-style与Pasical风格的结合,封装类为CComBSTR和CComVariant。

   值得一提的是ATL转换宏:

#include <atlbase.h>  <atlconv.h>   

Uses_Conversion //定义一些变量

A W T OLE BSTR              ""=X2X("")这样

ATL宏实际上也是用API:MultiByteToWideChar()

http:\\VC中一个关于宏的使用问题(转)

http:\\谨慎使用A2W等字符转换宏

posted on 2011-01-30 09:59  cvbnm  阅读(1272)  评论(0)    收藏  举报

导航