+ -
当前位置:首页 → 问答吧 → CHttpFile接受字符串转码BUG?

CHttpFile接受字符串转码BUG?

时间:2011-12-28

来源:互联网

C/C++ code

    CString res = _T("");
    CInternetSession session;
    CHttpConnection *httpConn = session.GetHttpConnection(m_strServer,0, m_iPort,0,0);
    CHttpFile *ioReader =httpConn->OpenRequest(0,
                                               requestString,
                                               NULL,
                                               1,
                                               NULL,
                                               _T("HTTP/1.1"),
                                               INTERNET_FLAG_DONT_CACHE);

    //     ioReader->SendRequest(headers, 
    //         headers.GetLength(), 
    //         strData.GetBuffer(strData.GetLength()), 
    //         (DWORD)strData.GetLength());
    ioReader->SendRequest();
    string strRes;
    char temp[1024];
    memset(temp, '\0', 1024);
    while ( 0 < ioReader->Read(temp, 1024))
    {
//        strRes = strRes + temp;
        strRes.append(temp, strlen(temp)-4);
        memset(temp, '\0', 1024);
    }

CString Utf8ToWchar(string a, int arrLen)
{ 
    CString res = _T("");
    int len = MultiByteToWideChar(CP_UTF8, 0, a.c_str(), 0, NULL, 0);
    wchar_t *temp = new wchar_t[arrLen + 1];
    char *buf = new char[arrLen + 1];
    memset(buf, '\0', arrLen + 1);
    memset(temp, '\0', arrLen+1);

    MultiByteToWideChar(CP_UTF8, 0, a.c_str(), arrLen+1, temp, arrLen);
    WideCharToMultiByte(CP_ACP, 0, temp, arrLen+1, buf, arrLen+1, NULL, NULL);
//    res.Format("%s",temp);
//    res.ReleaseBuffer();

    res.Format("%s",buf);
    delete temp;
    delete buf;
    return res;
}



代码基本是这样,当返回正常值,里面含有汉字时,转码正常.
但是当返回值为"success0",这个值,也就是strRes里,转码后,字符串的后面多了一节乱码,现在完全想不明白,请高手解答

作者: dyfxpu0215   发布时间: 2011-12-28

是否正确处理结束符,多出的乱码估计是结束符处理不正确

作者: oyljerry   发布时间: 2011-12-28

引用 1 楼 oyljerry 的回复:
是否正确处理结束符,多出的乱码估计是结束符处理不正确

那个接受到的时候,本来后面有 10 13 10 13四个字符,strRes.append的时候,没拷贝进去,事实我拷贝进去也是出错.你仔细看Utf8ToWchar里面,空间都是指定长度的,但是转换完,后面就多出了乱码,长度也变了,不知道为什么.

作者: dyfxpu0215   发布时间: 2011-12-28

memset(temp, '\0', arrLen+1);

换成
memset(temp, '\0', (arrLen+1) * sizeof(wchar_t));

试试

作者: cuidx   发布时间: 2011-12-28