C++常見字符轉換

#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章