MFC CString类型转换 Unicode意识

来源:互联网 发布:淘宝客微商城 编辑:程序博客网 时间:2024/06/14 14:48

      新手用VS2010编写一个MFC工具所遇到的问题。

      在之前做MFC用的都是用VC6,没有遇到太多问题,鉴于不太喜欢思考原因,所以一直糊里糊涂的用,现在想想,vc6新建MFC工程时应该默认的是非unicode编码吧。而VS2010编写一个MFC默认的是unicode的编码。

      unicode编码时CString默认的是双字节的类型,也就是CString是与wchar_t* 相互转化,当我们传入char[ ]或char*时可能自动转换成双字节类型,也可能需要我们手动来转换,否则会报错,此时_T()也是有很大作用的(关于_T()在下文介绍)。当我们要将CString字符写入文件时,也要注意将其转换成char类型,以便可以直观的查阅,当然也可以不转,看起来就比较费事了,读取的时候也要记得是unicode的编码类型。

       非unicode编码时,CString是与char*可较为直接的相互转化,一般常用有2种方式:

1. CString strFileName; 

LPSTRlpStr = strFileName.GetBuffer();

strFileName.ReleaseBuffer();

2.CString strFileName;

LPSTRlpStr = (LPSTR)(LPCSTR)strFileName;


LPSTR和LPWSTR(unicode编码时)是Win32和VC++所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的32位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的64位双字节字符数组指针。CString与LPSTR转换。
'L'代表Long,'P'代表Pointer(指针),'STR'表示String。在MSDN中typedef LPSTR char*;

    

   百度了CString,里面对_T()有这样的解释:

CString s;
s.Format(_T("%d"),total);
我总是对我的字符串使用_T()宏,这是为了让我的代码至少有Unicode的意识,当然,关于Unicode的话题不在这篇文章的讨论范围。_T()宏在8位字符环境下是如下定义的:
#define _T(x) x // 非Unicode版本(non-Unicode version)
而在Unicode环境下是如下定义的:
#define _T(x) L##x // Unicode版本(Unicode version)
所以在Unicode环境下,它的效果就相当于:
s.Format(L"%d",total);
也就是说_T()的使用让代码有unicode的意识,不论在unicode还是非unicode的环境下都不至于出错。平时编码unicode的意识,可以用一些方法来隐藏Unicode的一些细节,比如在我需要获得字符长度的时候,我会用一个叫做DIM的宏,这个宏是在我的dim.h文件中定义的,我会在我写的所有程序中都包含这个文件:#define DIM(x) (sizeof((x)) / sizeof((x)[0]))(此段摘自别处,觉得有用就贴上便于自己学习)
若要将unicode编码类型的cstring转换成char*或将char*转换成cstring,这里提供一段代码
将char*转换成unicode编码类型的cstring
int SMGCmdFactory::MultiByteToWChar(const char* pBuf, CString& csBuf){csBuf = _T("");DWORD dwMinSize;int nMsgBodyLen = strlen(pBuf) + 1; // 以\0结尾,strlen没有加此一个字节的长度?若不加1,字符串最后会有乱码dwMinSize = MultiByteToWideChar (CP_ACP, 0, pBuf, -1, NULL, 0);if(nMsgBodyLen < dwMinSize){return -1;}wchar_t* pwBuf = csBuf.GetBuffer(dwMinSize);dwMinSize = MultiByteToWideChar (CP_ACP, 0, pBuf, nMsgBodyLen, pwBuf, dwMinSize); if (dwMinSize == 0){return -1;}csBuf.ReleaseBuffer();return dwMinSize;}
            将unicode编码类型的cstring转换成char*
int SMGCmdFactory::WCharToMultiByte(CString& csBuf, char** pBuf) {DWORD dwMinSize;int len = csBuf.GetLength();dwMinSize = WideCharToMultiByte(CP_ACP,0,(LPCTSTR)csBuf,csBuf.GetLength(),NULL,0,NULL,FALSE);    *pBuf = new char[dwMinSize + 1]; // 若不加1,字符串最后会有乱码    memset(*pBuf, 0, dwMinSize + 1);dwMinSize = WideCharToMultiByte(CP_ACP,0,(LPCTSTR)csBuf,len,*pBuf,dwMinSize,NULL,FALSE);if (dwMinSize == 0){return -1;}return 0;}

释放上面函数开辟的空间函数
void SMGCmdFactory::CmdFactoryFree(void *pMsgBody){delete []pMsgBody;return;} 
举例:
  char* pReq = null;    CString csReq = _T("aaaaaaa");    int nRet = WCharToMultiByte(csReq, &pReq);if (nRet != 0){MessageBox(_T("转换请求失败!"));return;}                     CmdFactoryFree(pReq);

0 0
原创粉丝点击