最近编程,需要把CString类型的字符串转换成Char型的字符串,经过一番折腾、参考了一些网上资料,终于解决了,结果与大家分享。
下面的工作是在VC2008中完成的.
1.程序代码
//c++流库
#include <iostream>
//CString类的头文件
#include "atlstr.h"
//程序功能
// 将CString型变量转换成对应的短字符串char变量和宽字符串wchar_t变量
//输入
// CString cstSource - 待转换的CString型变量
// char* &pcOut - 转换后的短字符串
// wchar_t* &pwcOut - 转换后的宽字符串
//输出
// void
//注意
// 1. "&" 是引用,通过引用可以传递内存空间的地址
// 2. 不用预先给pcOut和pwcOut分配内存空间,本函数执行时会自动完成这一操作
// 3. pcOut和pwcOut使用后需要释放内存空间,方法为
// if(!pwcOut)
// {
// delete []pwcOut;
// }
// if(!pcOut)
// {
// delete []pcOut;
// }
void CStringToCharWchar(CString cstSource, char* &pcOut, wchar_t* &pwcOut)
{
//初始化指针
pcOut = NULL;
pwcOut = NULL;
//获取CString所包含宽字符串的字符个数,不含结束符
int ilength = cstSource.GetLength();
//转换为字符串后所占的宽字符(1个字符占2个字节)个数
int isizeOfString = ilength + 1;
//从CString中提取宽字符串
pwcOut = new wchar_t[isizeOfString];
_tcscpy_s(pwcOut, isizeOfString, cstSource);
//在将宽字符串转换成短字符(1个字符占1个字节)串之前,计算宽字符串对应的短字符串
//的短字符个数.
//为了实现这一功能,WideCharToMultiByte的第6个参数cbMultiByte必须为0,第5个参数lpMultiByteStr不
//起作用.这样WideCharToMultiByte的返回值就是宽字符对应的短字符串的字符个数.
//关于函数WideCharToMultiByte的详细解释下面的网址:
//http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx
DWORD dwFileNameCharNum = WideCharToMultiByte(CP_OEMCP,NULL,pwcOut,-1,NULL,0,NULL,FALSE);
//开辟内存空间,用于存放短字符串
pcOut = new char[dwFileNameCharNum];
//将宽字符串转换成短字符(1个字符占1个字节)串
WideCharToMultiByte (CP_OEMCP,NULL,pwcOut,-1,pcOut,dwFileNameCharNum,NULL,FALSE);
}
//测试用主函数,子程序测试完毕后,将main改为其它名称即可
void main()
{
CString cszImageFileName;
//字符串赋值
cszImageFileName = "c:\\123.bmp";//2个反斜杠连写可以输出后一个反斜杠
//短字符串
char *pcFileName;// = NULL;
//宽字符串
wchar_t *pwFlieName;// = NULL;
//将CString型为短字符串和宽字符串
CStringToCharWchar(cszImageFileName, pcFileName, pwFlieName);
std::cout<<"输出的短字符串为:"<<std::endl;
while((*pcFileName)!='\0')
{
std::cout<<*(pcFileName++);
}
//输出回车换行符
std::cout<<std::endl;
std::cout<<std::endl;
std::cout<<"输出的宽字符串为:"<<std::endl;
while((*pwFlieName)!='\0')
{
std::cout<<*(pwFlieName++)<<" ";
}
std::cout<<std::endl;
std::cout<<std::endl;
//释放宽字符串所占用的内存空间
if(!pwFlieName)
{
delete []pwFlieName;
}
//释放短字符串所占用的内存空间
if(!pcFileName)
{
delete []pcFileName;
}
}
测试程序的运行结果如下图:
2. 函数说明
(1)CStringToCharWchar通过字符串指针的引用&来传递指针,关于这方面内容请参考下面2个网址的介绍,其中第1个介绍的更全面
http://hi.baidu.com/seuwind7/blog/item/8f2467144636d019c93d6dda.html
http://lgy-047.blog.163.com/blog/static/61346565201053061936887/
(2)函数WideCharToMultiByte可以把宽字符转换成短字符
详细解释可参考下面的网址 http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx
编写CStringToCharWchar时关于WideCharToMultiByte的用法还参考了下面的网址给出的方法
http://blog.csdn.net/norains/article/details/1461174
(3)宽字符(wide-character)
宽字符是unsigned short (16-bit)的,也就是说存放时一个字符要占用2个字节,wchar_t是宽字符的关键字(keyword)
关于宽字符的介绍,请参考 ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/midl/midl/wchar_t.htm
CString中的字符就是以宽字符形式存放的.
(4)短字符char
我们常用的char是8-bit 的,也就是说存放时一个字符占用1个字节,所以相对宽字符来说是短字符.
3. 程序工程(Project)说明
调试函数CStringToCharWchar时使用的是VC2008,建立的是Win32控制台(Win32 Console Application)类型的空工程(empty project).
空工程中加入一个空的*.cpp文件,把上述代码拷入保存就可以了.
4. 输出结果说明
从程序运行结果可以看出:
(1)char短字符串的输出结果是字符本身.
(2)宽字符串的输出结果是字符的ASCII码.可以通过查找ASCII码表比对验证这一结论.
ASCII码表可在这个网址上查找http://moodle.hsshn.pudong-edu.sh.cn/file.php/99/resource/ASCII.htm