首页 > 代码库 > VC 中 字符串编程

VC 中 字符串编程

/*

#ifdef WIDECHAR//#ifdef  /#ifndef 具有在本文件内向上溯源性  在上面的可以识别  在下面的不能识别

#endif

wchar_t *pszText=L"HelloT_char";

wprintf(L"%s\n",pszText);

#else

char *pszText="HelloT_char";

printf("单%s\n",pszText);

#endif

*/

对于wchar_t 类型的字符串 要进行c语言字符串相应的操作 都要加上w


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1.ANSIC与Unicode字符

   两者区别就不多少了,一个单字节一个双字节,Unicode可以表示更多的字符,适合诸如汉字的文字系统.

   定义使用宽字符:

 2.声明Unicode字符与及字符串方法:

   _T()宏需要包含tchar.h

1     wchar_t c=L‘A‘;  
2     wchar_t szBuffer[10]=L"A String";3

WinNt.h定义了一下宏:

  #ifdef UNICODE 
    typedef WCHAR TCHAR ,*PTCHAR,PTSTR;
    typedef CONST WCHAR *PCTSTR;
     __TEXT(quote) quote
     __TEXT(quote) L##quote
 
    
    typedef CHAR TCHAR ,*PTCHAR,PTSTR;
    typedef CONST CHAR *PCTSTR;
     __TEXT(quote) quote
 
    
     __TEXT(quote) quote  TEXT(quote)

 

 可以利用以上宏来定义:在Visual Studio新建工程,一般都开启了Unicode选项,直接就可以定义宽字符。

1 TCHAR C=TXET(‘a‘);//如果定义了Unicode 则是16位字符,否则是8位2     TCHAR C=L‘a‘;3     TCHAR szBuffer[10]=TEXT("a String");4     TCHAR szBuffer[10]=_T("a String");5

3.Ansic与Unicode的转换:

 

 

 

       *c =;
     std::cout<<c<<std::endl;
           Length = MultiByteToWideChar(CP_ACP,,c,-,NULL,);
     wchar_t *pWideCharStr =  wchar_t[(wchar_t)*Length];
     MultiByteToWideChar(CP_ACP,,c,,pWideCharStr,Length*(wchar_t));
     std::wcout<<<<pWideCharStr<<std::endl;
          Length = WideCharToMultiByte(CP_ACP,,pWideCharStr,-,NULL,,NULL,NULL);
      *pMultiByte =  [Length*()] ;
     WideCharToMultiByte(CP_ACP,,pWideCharStr,-,pMultiByte,Length*(),NULL,NULL);
     std::cout<<<<pMultiByte;
 
     delete [] pWideCharStr;
     delete [] pMultiByte;

 补充:

       size_t wcstombs ( char * mbstr, const wchar_t * wcstr, size_t max );//Convert wide-character string to multibyte string

       size_t mbstowcs ( wchar_t * wcstr, const char * mbstr, size_t max );//Convert multibyte string to wide-character string

      这两个看就清楚怎么用了就不写了 比上面方法要简单

4.推荐的字符串使用方式

1).开始将文本字符串想像为字符的数组,而不是char或字节的数组
2).用通用的数据类型如用TCHAR PTSTR表示字符和字符串
3).统一用TEXT _T宏来表示字面量的字符和字符串,不要混用
4).用BYTE和 PBYTE来表示字节、字节指针和数据缓冲区
5).避免使用printf系列函数,尤其不要使用%s来进行Ansic跟Unicode的互相转换
      应该使用MultiByteToWideChar和WideCharToMutiByte,具体用法参看MSDN

6).推荐从现在开始就使用Unicode字符,理由很简单,为了程序代码的重用性:Com编程模型只支持Unicode   

      微软.Net技术,还有新的API函数都不支持ANSIC

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 char跟CString转换、string跟char转换、string 跟CString转换 还有BSTR转换成char*、char*转换成BSTR、CString转换成BSTR、BSTR转换成CString的

 

我们经常写程序比如文件路径需要用到一般都是char*类型的变量作为参数传递,有些函数参数却是string或者CString,造成了经常需要转换,在这里我总结了一下:

char跟CString转换:

 

ContractedBlock.gifExpandedBlockStart.gif代码

 CString cstr(_T());
wchar_t* wchar = cstr.GetBuffer();
* c1 =  [cstr.GetLength()+]; cstr.ReleaseBuffer();
wcstombs(c1,wchar,cstr.GetLength()+);
std::cout<<c1<<std::endl; 
delete c1;
    
CString theString(  );
LPTSTR lpsz =  TCHAR[theString.GetLength()+];
_tcscpy(lpsz, theString);
* c2 =  [theString.GetLength()+]; wcstombs(c2,lpsz,theString.GetLength()+);
std::cout<<c2<<std::endl;
delete c2;
    
* p2 = ;
wchar_t *p1 =  wchar_t[]; 
mbstowcs(p1,p2,);
std::wcout<<p1<<std::endl;
CString cstr1;
cstr1.Format(_T(),p1);
::MessageBox(NULL,cstr1,NULL,);
delete p1;

 

 

注意:

       CString 是微软提供的数据类型,其中GetBuffer()函数是重载了ANSIC跟UNICODE的,假如编译器设置开启了Unicode

       那它返回的就是宽字符类型,所以就需要wcstombs函数来转换。比如VC6下默认不支持Unicode,所以用它返回就不需要转换

string跟char转换:

 

ContractedBlock.gifExpandedBlockStart.gif代码

 s1();
* c3 =  [s1.size()+];
strcpy(c3,s1.c_str());    std::cout<<c3<<std::endl;  
delete c3;

* c4 = ;
 s2(c4);
std::cout<<s2<<std::endl;

 

 

 

注意:

      string是标准库的数据类型,其成员函数c_str()返回的是ANSIC数据类型,所以不需要转换直接就为char,假如需要宽字符,再用mbstowcs就可以了

 

 

string 跟CString转换:

 

ContractedBlock.gifExpandedBlockStart.gif代码

CString cstr2;
 s3 = ;
* c5 =  [s3.size()+];
wchar_t* c6 =  wchar_t[s3.size()+];
strcpy(c5,s3.c_str());
mbstowcs(c6,c5,s3.size()+);
cstr2.Format(_T(),c6);  ::MessageBox(NULL,cstr2,NULL,);
delete c5;
delete c6;

CString cs1();
* c7 =  [cs1.GetLength()+];
wcstombs(c7,cs1.GetBuffer(),cs1.GetLength()+);
 s(c7);
std::cout<<s<<std::endl;
delete c7;

 

 

 

注意:

      由上面两个就可以清楚知道:CString会根据环境重载ANSIC还是UNICODE版本的,而string只能是ANSIC版本的

      而string跟CString转换原理是通过都转换为传统的char类型,然后再转换到对方,因此这里有需要进行ANSIC跟UICODE的转换

      比如string接受传统的string s(char* ); 但CString.GetBuffer()返回有可能是wchar_t*类型的


BSTR转换成char*、char*转换成BSTR、CString转换成BSTR、BSTR转换成CString

(BSTR是COM里面经常会用到的数据类型,可能大家用得较少,我也没逐一进行认真分析了)

BSTR与char*转换:

 

ContractedBlock.gifExpandedBlockStart.gif代码

#include  comment(lib, "comsupp.lib")
 _tmain( argc, _TCHAR* argv[])
{
BSTR bstrText = ::SysAllocString(L);
* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); delete[] lpszText2;
 ;
}
_bstr_t b = bstrText;
* lpszText2 = b;

BSTR bstrText = ::SysAllocString(L);
BSTR bstrText = ::SysAllocStringLen(L,);
BSTR bstrText = ::SysAllocStringByteLen(,);
_variant_t strVar();
BSTR bstrText = strVar.bstrVal;
BSTR bstrText = _bstr_t(); 方法四,使用CComBSTR。例如:
BSTR bstrText = CComBSTR();
CComBSTR bstr();
BSTR bstrText = bstr.m_str;
方法五,使用ConvertStringToBSTR。
例如:
* lpszText = ;
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);

 

 

 

 

CString与BSTR转换:

 

ContractedBlock.gifExpandedBlockStart.gif代码

CString str();
BSTR bstrText = str.AllocSysString();
…
SysFreeString(bstrText); BSTR bstrText = ::SysAllocString(L);
CStringA str;
str.Empty();
str = bstrText; 或
CStringA str(bstrText);

本文出自 “日知其所无” 博客,谢绝转载!

VC 中 字符串编程