天天看點

tinyxml中文亂碼(記憶體模式)

本文介紹的是記憶體中使用tinyxml的中文亂碼情況

直接上幹貨

1、對方發送的utf-8格式資料,本地接收時中文亂碼:utf-8 轉 unicode即可

wstring UTF8ToUTF16( const char *szIn )
{
    wstring strResult;

    if( szIn )
    {
        wchar_t *wszUTF16;
        int len = MultiByteToWideChar( CP_UTF8, 0, ( LPCSTR )szIn, -1, NULL, 0 );
        wszUTF16 = new wchar_t[len + 1];
        memset( wszUTF16, 0, len * 2 + 2 );
        MultiByteToWideChar( CP_UTF8, 0, ( LPCSTR )szIn, -1, ( LPWSTR )wszUTF16, len );
        strResult = wstring( wszUTF16 );
        delete []wszUTF16;
    }

    return strResult;
}
           

2、發送給對方時對方中文顯示亂碼,對方utf-8轉unicode也不行,本地需要先轉換下再發送

void GBKToUTF8(char* &szOut)
{
     char* strGBK = szOut;

     int len=MultiByteToWideChar(CP_ACP, 0, (LPCSTR)strGBK, -1, NULL,0);
     unsigned short * wszUtf8 = new unsigned short[len+1];
     memset(wszUtf8, 0, len * 2 + 2);
     MultiByteToWideChar(CP_ACP, 0, (LPCSTR)strGBK, -1, (LPWSTR)wszUtf8, len);

     len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
     char *szUtf8=new char[len + 1];
     memset(szUtf8, 0, len + 1);
     WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);

     //szOut = szUtf8;
     memset(szOut,'/0',strlen(szUtf8)+1);
     memcpy(szOut,szUtf8,strlen(szUtf8)+1);

     delete[] szUtf8;
     delete[] wszUtf8;
}
           

繼續閱讀