您的位置:首页 > 编程语言 > Java开发

java客户端和vc程序通信时的编码问题

2015-10-23 10:40 671 查看
java客户端使用utf-8编码,而vc程序默认是gbk编码格式,两者通信时,如果含有中文,将出现乱码。

解决方式1:java客户端使用GBK编码

可参照:
http://www.cnblogs.com/kenkofox/archive/2010/04/25/1719649.html
1    byte[] responseBuffer = newClientRequestHandler(message).response().getBytes("GB2312");

2    out.write(responseBuffer, 0,responseBuffer.length);

解决方式2:vc程序进行utf-8和gbk编码的转换

string CCommonHelper::ConvertGBKToUtf8(CString& strGBK) {

    int len=MultiByteToWideChar(CP_ACP, 0, (char*)CStrToStr(strGBK).c_str()/*(LPCTSTR)strGBK*/, -1, NULL,0);

    unsigned short * wszUtf8 = new unsigned short[len+1];

    memset(wszUtf8, 0, len * 2 + 2);

    MultiByteToWideChar(CP_ACP, 0, (char*)CStrToStr(strGBK).c_str()/*(LPCTSTR)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);

    strGBK = szUtf8;

    //delete[] szUtf8;

    delete[] wszUtf8;

    return szUtf8;

}

void CCommonHelper::ConvertUtf8ToGBK(CString& strUtf8) {

    int len=MultiByteToWideChar(CP_UTF8, 0, (char*)CStrToStr(strUtf8).c_str()/*(LPCTSTR)strUtf8*/, -1, NULL,0);

    unsigned short * wszGBK = new unsigned short[len+1];

    memset(wszGBK, 0, len * 2 + 2);

    MultiByteToWideChar(CP_UTF8, 0, (char*)CStrToStr(strUtf8).c_str()/*(LPCTSTR)strUtf8*/, -1, (LPWSTR)wszGBK, len);

    len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);

    char *szGBK=new char[len + 1];

    memset(szGBK, 0, len + 1);

    WideCharToMultiByte (CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, len, NULL,NULL);

    strUtf8 = szGBK;

    delete[] szGBK;

    delete[] wszGBK;

}

调用:string strUtf8 = ConvertGBKToUtf8(Command);

另附上Unicode和utf-8之间的转换:

int CCommonHelper::Unicode2Utf8(const char* unicode, char *szUtf8, int _iMaxLen)  

{  

    __try

    {

        int len;  

        len = WideCharToMultiByte(CP_UTF8, 0, (const wchar_t*)unicode, -1, NULL, 0, NULL, NULL);

        if (_iMaxLen < len)

        {

            len = _iMaxLen - 1;

        }

        memset(szUtf8, 0, len + 1);  

        WideCharToMultiByte(CP_UTF8, 0, (const wchar_t*)unicode, -1, szUtf8, len, NULL,NULL);  

        return len;  

    }

    __except(1)

    {

        return 0;

    }    

}

//UTF8转成Unicode

wchar_t * CCommonHelper::UTF8ToUnicode( const char* str )

{

    int    textlen = 0;

    wchar_t * result;

    textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1,    NULL,0 );  

    result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));  

    memset(result,0,(textlen+1)*sizeof(wchar_t));  

    MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen );  

    return    result;  

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vc java 通信 乱码