#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轉多字節
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';
pRst = pStr;
delete[]pTmp;
pTmp = nullptr;
delete[]pStr;
pStr = nullptr;
}
C++常見字符轉換
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.