/*

#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<
<
<<<
<
<<<

复制代码

 补充:

       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<
<
<
<
<
<

复制代码

 

 

注意:

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

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

string跟char转换:

 

ContractedBlock.gifExpandedBlockStart.gif代码

复制代码

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

复制代码

 

 

 

注意:

      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<<

复制代码

 

 

 

注意:

      由上面两个就可以清楚知道: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);

复制代码