MFC CString类型转换 Unicode意识

在VS2010中,MFC的CString在Unicode编码环境下与char*交互时需要注意转换。Unicode的CString对应wchar_t*,可能需要手动转换避免错误。使用_T()宏在字符串处理中有重要作用,涉及文件读写时,需留意字符类型转换。
部署运行你感兴趣的模型镜像

      新手用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编码时)是Win32VC++所使用的一种字符串数据类型。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);

您可能感兴趣的与本文相关的镜像

ComfyUI

ComfyUI

AI应用
ComfyUI

ComfyUI是一款易于上手的工作流设计工具,具有以下特点:基于工作流节点设计,可视化工作流搭建,快速切换工作流,对显存占用小,速度快,支持多种插件,如ADetailer、Controlnet和AnimateDIFF等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值