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;
LPSTR
lpStr = strFileName.GetBuffer();
strFileName.ReleaseBuffer();
2.CString strFileName;
LPSTR
lpStr = (
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
- MFC CString类型转换 Unicode意识
- MFC Unicode字符集下 CString类型转换为char*类型
- [MFC]CString类型转换
- [MFC]CString类型转换
- [MFC]CString类型转换
- MFC Cstring unicode 转换为utf8
- Unicode下CString类型转换真是烦!
- [MFC]CString与其他类型的转换
- MFC 中 CString 转换为 int 类型
- [MFC]CString与其他类型的转换
- [MFC]CString与其他类型的转换
- [MFC]CString与其他类型的转换
- MFC CString转换为string类型
- 【MFC】将CString类型的十六进制数字,转换成整形(在使用Unicode字符集的情况)
- MFC:UNICODE下CString与char* ,string类型
- MFC,unicode下CString类型及UTF8问题
- VC/MFC unicode下CString转换为char*
- MFC Unicode 含中文 CString,LPCTSTR 转换成std::string
- Oracle 分区表相关视图
- API通用设计原则
- IOS Event Handling
- 编译Linux版本飞鸽传书的不完全解决办法
- ORACLE用PL/SQL提交数据后执行回滚的方法
- MFC CString类型转换 Unicode意识
- maven私服-nuxus安装
- 数据库为何要建立索引
- Java中abstract和interface的区别
- sizeof的内幕
- android 服务,进程以及应用程序
- objective-c中通过类的属性的名字获取属性的类型(谢绝转载)
- 裤子尺寸参考与衣服尺寸参考
- 关于数据库的学习