MFC/WTL字符串轉換(CString - char)

CString:

當VS編碼環境爲Unicode時,CString就是CStringW。當VS編碼環境爲多字節時,CString就是CStringA。

在C/C++中同樣存在着兩種環境的字符串:char 和 wchar_t。

本文的目的是:轉換他們。

Code Start :

class UStrToAscChar		//CStringW + wchar_t* -> char*
{
public:
	UStrToAscChar(const CStringW cs)
	{
		int n = WideCharToMultiByte(CP_ACP,0,cs,-1,NULL,0,NULL,NULL);
		if(n <= 0)
			buff = NULL;
		buff = new char[n];
		memset(buff,0,n);
		WideCharToMultiByte(CP_ACP,0,cs,-1,buff,n,NULL,NULL);
	}
	~UStrToAscChar()
	{
		delete buff;
	}
	const char* operator &()	//注意這是成員函數重載了運算符,友元函數重載需要參數
	{
		return buff;
	}
private:
	char* buff;
};

class UStrToWChar		//CStringW ->wchar_t*
{
public:
	UStrToWChar(const CStringW cs)
	{
		int n = cs.GetLength();
		if(n <= 0)
			buff = NULL;
		buff = new wchar_t[n + 1];
		wmemset(buff,0,n + 1);
		for(int i = 0; i < n; i++)
			buff[i] = cs[i];
	}
	~UStrToWChar()
	{
		delete buff;
	}
	const wchar_t* operator &()
	{
		return buff;
	}
private:
	wchar_t* buff;
};

class AStrToAscChar		//CStringA -> char*
{
public:
	AStrToAscChar(const CStringA cs)
	{
		int n = cs.GetLength();
		if(n <= 0)
			buff = NULL;
		buff = new char[n + 1];
		memset(buff,0,n + 1);
		for(int i = 0; i < n; i++)
			buff[i] = cs[i];
	}
	~AStrToAscChar()
	{
		delete buff;
	}
	const char* operator &()
	{
		return buff;
	}
private:
	char* buff;
};

class AscCharToWChar	//char* -> wchar_t*
{
public:
	AscCharToWChar(const char* ac)
	{
		if(ac == NULL || strlen(ac) <= 0)
			buff = NULL;
		int n = MultiByteToWideChar(CP_ACP,0,ac,-1,NULL,0);
		buff = new wchar_t[n];
		wmemset(buff,0,n);
		MultiByteToWideChar(CP_ACP,0,ac,-1,buff,n);
	}
	~AscCharToWChar()
	{
		delete buff;
	}
	const wchar_t* operator &()
	{
		return buff;
	}
private:
	wchar_t* buff;
};

Unicode和多字節之間的轉換是通過WIN API完成的。

Unicode和Unicode之間、以及多字節和多字節之間,是通過字符拷貝完成的。

使用方法:

CStringW cs = L"中文English";

UStrToAscChar us(cs);

printf_s("%s \n",&us);  //在控制檯輸出字符串
關於如何在MFC程序中打開控制檯:

class Console
{
public:
	Console()
	{
		AllocConsole();
		freopen_s(&fp,"conout$","w",stdout);	//打開控制檯

		setlocale(LC_ALL,"chs");
	}
private:
	FILE *fp;
};

只要添加一個變量即可:Console sole;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章