CString、TCHAR*、char*转换

2012CSDN博客之星评选正式上线     2000元大奖征异构开发博文      Q14年互联网产品进化史

CString、TCHAR*、char*转换

分类: .Net编程常见格式转换 939人阅读 评论(1) 收藏 举报

<1>CString 转化为 char*
view plain copy to clipboard print ?
  1. CString strData = _T("ni hao");  
  2. int len = WideCharToMultiByte(CP_ACP, 0, strData, -1, NULL, 0, NULL, NULL);  
  3. char* szTarget = new char[len + 1];  
  4. memset(szTarget, 0, len + 1);  
  5. WideCharToMultiByte (CP_ACP, 0,strData, -1, szTarget, len, NULL,NULL);  
  6. delete[] szTarget;  
CString->TCHAR*的转化可以用函数GetBuff()
函数原型为:LPTSTR GetBuffer( int nMinBufLength );
view plain copy to clipboard print ?
  1. CString str("CString");  
  2. TCHAR* szMsg = new TCHAR[100];  
  3. //其参数为CString字符串的长度  
  4. szMsg = str.GetBuffer(str.GetLength());  
  5. str.ReleaseBuffer();  
  6. delete []szMsg;  
  7. szMsg = NULL;  
 
  1. CString str("CString");  
  2. TCHAR* szMsg = new TCHAR[100];  
  3. //其参数为CString字符串的长度  
  4. szMsg = str.GetBuffer(str.GetLength());  
  5. str.ReleaseBuffer();
自己的话:后两行代码把szMsg又清空了,
 
 
TCHAR*->CString的转化
view plain copy to clipboard print ?
  1. TCHAR szTchar[18] = L"TCHAR";    
  2. CString str;    
  3. str.Format(_T("%s"),szTchar);    
<2>
char 转换TCHAR未写  
char*、TCHAR*转换CString  
CString str(****)  
下面详细写一下其它转换  
view plain copy to clipboard print ?
  1. /*  
  2. ***********************************************************************  
  3. * 函数: TransCStringToTCHAR  
  4. * 描述:将CString 转换为 TCHAR*  
  5. * 日期:2003-05-30 King  
  6. ***********************************************************************  
  7. */   
  8. TCHAR* CPublic::CString2TCHAR(CString &str)   
  9. {   
  10. int iLen = str.GetLength();   
  11. TCHAR* szRs = new TCHAR[iLen];   
  12. lstrcpy(szRs, str.GetBuffer(iLen));   
  13. str.ReleaseBuffer();   
  14. return szRs;   
  15. }   
  16. /*  
  17. ***********************************************************************  
  18. * 函数: THCAR2Char  
  19. * 描述:将TCHAR* 转换为 char*  
  20. * 日期:2003-05-30 King  
  21. ***********************************************************************  
  22. */   
  23. char* CPublic::THCAR2char(TCHAR* tchStr)   
  24. {   
  25. int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度   
  26. char* chRtn = new char[iLen+1]   
  27. wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值   
  28. return chRtn;   
  29. }   
  30. /*  
  31. ***********************************************************************  
  32. * 函数: CString2char  
  33. * 描述:将CString转换为 char*  
  34. * 日期:2003-05-26 King  
  35. ***********************************************************************  
  36. */   
  37. char* CPublic::CString2char(CString &str)   
  38. {   
  39. int len = str.GetLength();   
  40. char* chRtn = (char*)malloc((len*2+1)*sizeof(char));//CString的长度中汉字算一个长度   
  41. memset(chRtn, 0, 2*len+1);   
  42. USES_CONVERSION;   
  43. strcpy((LPSTR)chRtn,OLE2A(str.LockBuffer()));   
  44. return chRtn;   
  45. }   
  46. //参考   
  47. ///////////////////////   
  48. //Pocket PC上的UNICODE和ANSI字符串   
  49. //By Vassili Philippov, September 26, 2001.   
  50. //杨方思歧 译   
  51. ////////////////////////   
  52. /*  
  53. ***********************************************************************  
  54. * 函 数 名:GetAnsiString  
  55. * 描 述:将CString(unicode)转换为char*(ANSI)  
  56. * 参 数:CString &s 要转换的CString  
  57. * 返 回 值:返回转换结果  
  58. * 日期、作者:创建日期:2003-5-30 King  
  59. * 最后修改:2003-5-30 King  
  60. ***********************************************************************  
  61. */   
  62. char* GetAnsiString(const CString &s)   
  63. {   
  64. int nSize = 2*s.GetLength();   
  65. char *pAnsiString = new char[nSize+1];   
  66. wcstombs(pAnsiString, s, nSize+1);   
  67. return pAnsiString;   
  68. }  
==========================================================================
evc vc字符串转换处理

1.头文件中要定义宏;  
      #define   UNICODE  
      #define   _UNICODE   
  ////////////////////

char   buf[128];  
  memset(buf,0,128);  
  strcpy(buf,"你好");  
  WCHAR   pCName[128];  
  memset(pCName,0,128);  
  MultiByteToWideChar(CP_THREAD_ACP,MB_USEGLYPHCHARS,buf,strlen(buf),pCName,128);   
   至于WCHAR   转换到CHAR,则用  
  WideCharToMultiByte

//////////////////////////


  2.char转换成wchar
  
      const   char   *pFilePathName   =   "c://aa.dll";  
      int   nLen   =   strlen(pFilePathName)   +   1;  
      int   nwLen   =   MultiByteToWideChar(CP_ACP,   0,   pFilePathName,  
nLen,   NULL,   0);  
   
      TCHAR   lpszFile[256];  
      MultiByteToWideChar(CP_ACP,   0,   pFilePathName,   nLen,   lpszFile,  
nwLen);  
   
  3.wchar转换成char  
        char   *pFilePathName;  
        TCHAR   lpszFile[256];  
      _tcscpy(lpszFile,   _T("c://aa.dll"));  
   
      int   nLen   =   wcslen(wstr)+1;    
      WideCharToMultiByte(CP_ACP,   0,   lpszFile,   nLen,   pFilePathName,  
2*nLen,   NULL,   NULL);
  

char*和CString转换
CString 是一种很特殊的 C++ 对象,它里面包含了三个值:一个指向某个数据缓冲区的指针、一个是该缓冲中有效的字符记数(它是不可存取的,是位于
CString 地址之下的一个隐藏区域)以及一个缓冲区长度。
有效字符数的大小可以是从0到该缓冲最大长度值减1之间的任何数(因为字符串结尾有一个NULL字符)。字符记数和缓冲区长度被巧妙隐藏。

(1) char*转换成CString
  若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:
         char chArray[] = "Char  test";
         TCHAR * p = _T("Char  test");( 或LPTSTR p = _T("Char  test");)
         CString theString = chArray;
         theString.Format(_T("%s"), chArray);
         theString = p;

(2) CString转换成char*

  若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:

  方法一,使用强制转换。例如:

       CString theString( (_T("Char test "));
        LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;

  方法二,使用strcpy。例如:

       CString theString( (_T("Char test "));
       LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
        _tcscpy(lpsz, theString);

  需要说明的是,strcpy(或可移值的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char*
(ANSI),系统编译器将会自动对其进行转换。

  方法三,使用CString::GetBuffer。
        如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。
如果你只是打算修改字符或者截短字符串,例如:
       CString s(_T("Char test "));
        LPTSTR p = s.GetBuffer();
        LPTSTR dot = strchr(p, ''.'');
         // 在这里添加使用p的代码
          if(p != NULL)
         *p = _T('/0');
         s.ReleaseBuffer();                     // 使用完后及时释放,以便能使用其它的CString成员函数
         在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为
ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。

CString ,BSTR ,LPCTSTR之间关系和区别

CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。

                              CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。
                              typedef OLECHAR FAR* BSTR;
                              typedef const char * LPCTSTR;

                              vc++中各种字符串的表示法
                              首先char*
                              是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
                              LP的含义是长指针(long
                              pointer)。LPSTR是一个指向以‘/0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。
                              而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
                              1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.
                              2.C表示const
                              3.T是什么东西呢,我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char.
                              为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
                              LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。
                              然后为了实现两种编码的通用,提出了TCHAR的定义:
                              如果定义_UNICODE,声明如下:
                              typedef wchar_t TCHAR;
                              如果没有定义_UNICODE,则声明如下:
                              typedef char TCHAR;
                              LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。
                              CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。
                              LPCTSTR:
                                   #ifdef _UNICODE
                                      typedef const wchar_t * LPCTSTR;
                                   #else
                                      typedef const char * LPCTSTR;
                                   #endif
                              VC常用数据类型使用转换详解
                              
                              先定义一些常见类型变量借以说明
                              int i = 100;
                              long l = 2001;
                              float f=300.2;
                              double d=12345.119;
                              char username[]="女侠程佩君";
                              char temp[200];
                              char *buf;
                              CString str;
                              _variant_t v1;
                              _bstr_t v2;
                 一、其它数据类型转换为字符串
                              短整型(int)
                                     itoa(i,temp,10);    
                              //将i转换为字符串放入temp中,最后一个数字表示十进制
                                     itoa(i,temp,2);      //按二进制方式转换
                              长整型(long)
                                     ltoa(l,temp,10);

                 二、从其它包含字符串的变量中获取指向该字符串的指针
                              CString变量
                              str = "2008北京奥运";
                              buf = (LPSTR)(LPCTSTR)str;
                              BSTR类型的_variant_t变量
                              v1 = (_bstr_t)"程序员";
                              buf = _com_util::ConvertBSTRToString((_bstr_t)v1);
                 三、字符串转换为其它数据类型
                              strcpy(temp,"123");
                              短整型(int)
                                    i = atoi(temp);
                              长整型(long)
                                    l = atol(temp);
                              浮点(double)
                                    d = atof(temp);
                   四、其它数据类型转换到CString
                              使用CString的成员函数Format来转换,例如:
                              整数(int)
                                    str.Format("%d",i);
                              浮点数(float)
                                    str.Format("%f",i);
                              字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值
                                    str = username;
                      五、BSTR、_bstr_t与CComBSTR
                              CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
                              char *转换到BSTR可以这样: BSTR
                              b=_com_util::ConvertStringToBSTR("数据");    
                              //使用前需要加上头文件comutil.h
                              反之可以使用char *p=_com_util::ConvertBSTRToString(b);

                        六、VARIANT 、_variant_t 与 COleVariant
                              VARIANT的结构可以参考头文件VC98/Include/OAIDL.H中关于结构体tagVARIANT的定义。
                              对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
                              VARIANT va;
                              int a=2001;
                              va.vt=VT_I4;    //指明整型数据
                              va.lVal=a;      //赋值
                              对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG
                              FAR*
                              pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
                              unsigned char bVal; VT_UI1
                              short iVal; VT_I2
                              long lVal;  VT_I4 
                              float fltVal;  VT_R4
                              double dblVal;  VT_R8 
                              VARIANT_BOOL boolVal;  VT_BOOL
                              SCODE scode;  VT_ERROR
                              CY cyVal;  VT_CY
                              DATE date;  VT_DATE
                              BSTR bstrVal;  VT_BSTR
                              IUnknown FAR* punkVal;  VT_UNKNOWN
                              IDispatch FAR* pdispVal;  VT_DISPATCH
                              SAFEARRAY FAR* parray;  VT_ARRAY|*
                              unsigned char FAR* pbVal;  VT_BYREF|VT_UI1
                              short FAR* piVal;  VT_BYREF|VT_I2
                              long FAR* plVal;  VT_BYREF|VT_I4
                              float FAR* pfltVal;  VT_BYREF|VT_R4
                              double FAR* pdblVal; VT_BYREF|VT_R8
                              VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL
                              SCODE FAR* pscode;  VT_BYREF|VT_ERROR
                              CY FAR* pcyVal;  VT_BYREF|VT_CY
                              DATE FAR* pdate; VT_BYREF|VT_DATE
                              BSTR FAR* pbstrVal;  VT_BYREF|VT_BSTR
                              IUnknown FAR* FAR* ppunkVal;  VT_BYREF|VT_UNKNOWN
                              IDispatch FAR* FAR* ppdispVal;
                              VT_BYREF|VT_DISPATCH
                              SAFEARRAY FAR* FAR* pparray;  VT_ARRAY|*
                              VARIANT FAR* pvarVal;  VT_BYREF|VT_VARIANT
                              void FAR* byref;  VT_BYREF
                              _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
                              例如:
                              long l=222;
                              ing i=100;
                              _variant_t lVal(l);
                              lVal = (long)i;
                              COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
                              COleVariant v3 = "字符串", v4 = (long)1999;
                              CString str =(BSTR)v3.pbstrVal;
                              long i = v4.lVal;

你可能感兴趣的:(.Net编程常见格式转换)