VC2008中CString转换为Char和wchar_t的函数

    最近编程,需要把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

猜你喜欢

转载自blog.csdn.net/dreamofnous/article/details/7215302