C++常见字符转换

本文详细介绍了不同字符编码之间的转换方法,包括多字节到宽字节、宽字节到多字节、UTF8到多字节等转换过程,并演示了CString、string与wchar_t之间的相互转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<windows.h>
#include<atlstr.h>
#include <locale.h>
#include<string>


using std::wstring;
using std::string;
using std::cout;
using std::wcout;
using std::endl;


void MultiByte2Wide(char* pSrc, wchar_t *pRst);

void Wide2MultiByte(wchar_t *pSrc, char* pRst);

void Utf2MultiByte(char *pSrc, char *pRst);

void MultiByte2Utf8(char *pSrc, char *pRst);

int main()
{
	wcout.imbue(std::locale("chs"));//输出含有汉字的宽字符
	//setlocale(LC_ALL, "");//输出wchar_t  
	//宽字节转多字节
	wchar_t wszData[] = L"你好啊";
	wcout << wszData << endl;
	char pData[20] = { 0 };
	Wide2MultiByte(wszData, pData);
	cout << pData << endl;

	//多字节转宽字节
	wchar_t wsaRst[20] = { 0 };
	MultiByte2Wide(pData, wsaRst);
	wcout << wsaRst << endl;
	
	//UTF8转多字节
	char szData[20] = "helee";
	Utf2MultiByte(szData, pData);
	cout << pData << endl;

	//CString转string
	CString cstrData(L"在?");
	string strData = (CW2A)cstrData;
	wcout << cstrData.GetBuffer() << endl;
	//string转CString
	cstrData = (CA2W)strData.c_str();

	//wstring转string
	wstring wstrData(L"在干嘛呢");
	strData = (CW2A)wstrData.c_str();
	cout << strData << endl;

	//char转CString
	CString cstrRst = szData;
	wcout << cstrRst.GetBuffer() << endl;

	//CString 转char
	ZeroMemory(szData, 10);
	sprintf_s(szData, "%S", cstrRst.GetBuffer());
	cout << szData << endl;

	system("pause");
	return 0;
}

//多字节转宽字节
void MultiByte2Wide(char * pSrc, wchar_t *pRst)
{
	int nLen = MultiByteToWideChar(CP_ACP, 0, pSrc, -1, NULL, 0);
	wchar_t *pWstr = new wchar_t[(nLen + 1) * sizeof(wchar_t)];
	MultiByteToWideChar(CP_ACP, 0, pSrc, -1, pWstr, nLen);
	pWstr[nLen] = L'\0';
	wcscpy_s(pRst, nLen, pWstr);
	delete[]pWstr;
	pWstr = nullptr;
}

//宽字节转多字节
void Wide2MultiByte(wchar_t *pSrc, char * pRst)
{
	int nLen = WideCharToMultiByte(CP_ACP, 0, pSrc, -1, NULL, 0, NULL, NULL);
	char *pStr = new char[(nLen + 1) * sizeof(char)];
	WideCharToMultiByte(CP_ACP, 0, pSrc, -1, pStr, nLen, NULL, NULL);
	pStr[nLen] = '\0';
	strcpy_s(pRst, nLen + 1, pStr);
	delete[]pStr;
	pStr = nullptr;
}

//UTF8转多字节
void Utf2MultiByte(char *pSrc, char *pRst)
{
	//转换为wide
	int nLen = MultiByteToWideChar(CP_UTF8, 0, pSrc, -1, NULL, 0);
	wchar_t *pWstr = new wchar_t[(nLen + 1) * sizeof(wchar_t)];
	MultiByteToWideChar(CP_UTF8, 0, pSrc, -1, pWstr, nLen);
	pWstr[nLen] = L'\0';
	//wide转多字节
	nLen = WideCharToMultiByte(CP_ACP, 0, pWstr, -1, NULL, 0, NULL, NULL);
	char *pStr = new char[(nLen + 1) * sizeof(char)];
	WideCharToMultiByte(CP_ACP, 0, pWstr, -1, pStr, nLen, NULL, NULL);
	pStr[nLen] = '\0';
	strcpy_s(pRst, nLen + 1, pStr);
	delete[]pWstr;
	pWstr = nullptr;

	delete[]pStr;
	pStr = nullptr;
}

//多字节转UTF8
void MultiByte2Utf8(char * pSrc, char * pRst)
{
	int nLen = MultiByteToWideChar(CP_ACP, 0, pSrc, -1, NULL, 0);
	wchar_t *pTmp = new wchar_t[(nLen + 1) * sizeof(wchar_t)];
	MultiByteToWideChar(CP_ACP, 0, pSrc, -1, pTmp, nLen);
	pTmp[nLen] = L'\0';
	nLen = WideCharToMultiByte(CP_UTF8, 0, pTmp, -1, NULL, 0, NULL, NULL);
	char *pStr = new char[(nLen + 1) * sizeof(char)];
	WideCharToMultiByte(CP_UTF8, 0, pTmp, -1, pStr, 0, NULL, NULL);
	pStr[nLen] = '\0';
	strcpy_s(pRst, nLen + 1, pStr);
	delete[]pTmp;
	pTmp = nullptr;

	delete[]pStr;
	pStr = nullptr;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值