转一个一直困扰我的问题:Unicode下CString转char* 用下面的办法可以解决

来源:互联网 发布:影楼美工字体 编辑:程序博客网 时间:2024/04/27 16:57

一直觉得Unicode下的界面比较好看一些(MFC),所以一直都在Unicode环境下编程。

但是CString转char一直是个困扰人的问题。

现在终于找到了解决办法。

 

其实之所以弄了那么久都没有成功,还是源于自己的懒惰,舍不得真正花时间去寻找答案。 

所以才会在每次编程,被这么一个问题给绊住脚。

在此,希望每一个像我一样懒惰的程序员能够认识到不足。^-^

稍微废话多了一点。原谅我,我只是想记录一下此刻的心情。

 

以下给出解决办法:

 

----------------------------------------------------------------------------------------------------------------------------------

1、Unicode下CString转换为char *

方法一:使用API:WideCharToMultiByte进行转换(我用的是这种方法)

 

              CString str = _T("D://校内项目//QQ.bmp");

            //注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
              int n = str.GetLength();     // n = 14, len = 18

             //获取宽字节字符的大小,大小是按字节计算的
             int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);

             //为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
            char * pFileName = new char[len+1];   //以字节为单位

            //宽字节编码转换成多字节编码
            WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);

             pFileName[len+1] = '/0';   //多字节字符以'/0'结束

 

方法二:使用函数:T2A、W2A(没试过。。想用的请自己验证)

             CString str = _T("D://校内项目//QQ.bmp");

              //声明标识符
             USES_CONVERSION;

             //调用函数,T2A和W2A均支持ATL和MFC中的字符转换
             char * pFileName = T2A(str);  
             //char * pFileName = W2A(str); //也可实现转换

            注意:有时候可能还需要添加引用#include   <afxpriv.h>

 

 

------------------------------------------------------------华丽的分割线-----------------------------------------------------------------------------------------------------------

 

 

另外附上多字符集下的CString和char间的相互转化

 

(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('');
         s.ReleaseBuffer();                     // 使用完后及时释放,以便能使用其它的CString成员函数

         在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为ReleaseBuffer被调用之前,该 CString 对象的完整性得不到保障。

 

5.cstring 转换为unsigned char *

 BYTE *nf[4];

 //char* nf[4];

 //m_IPADD.GetAddress(nf0,nf1,nf2,nf3);

 

 

 CString resToken;

 int curPos= 0, count = 1;

 

 resToken= m_IPAddr.Tokenize(".",curPos);

 nf[0] = (BYTE*)(LPCTSTR)resToken;

 

 

----------------------------------------------------依然朴素而华丽-----------------------------------------------------------------------------------------

 

 

以上内容全部为网上转载。具体出处已不明确。

未能标明出处,请大家原谅,请作者原谅。

                             --AmL.tu_s 2011.12.16