openURL("http://XXX.XXX.XXX/user?user=sunshine&message=中文测试")
服务器发送的消息都是“.....”
而我在IE的地址栏中“http://XXX.XXX.XXX/user?user=sunshine&message=中文测试”服务器却可以发送的消息“中文测试”。请指点一下,谢谢

解决方案 »

  1.   

    chinese string has to be encoded before send to http server
    IE does it automatically, while you have to do it in your program.http://codeguru.earthweb.com/cpp_mfc/URLEncode.html
      

  2.   

    你必须首先转换成unicode或者utf-8的BOOL
    CADlg::DoUrlEncode(CString csSrcData, CString &csDstData)
    {
    long lngLength;
    long lngPos;
    char chSrc;
    LPCTSTR strSrc;
    char *strEr;
    CString csHexCode;
    CString csSource; csSource.Empty();
    lngLength = csSrcData.GetLength();
    strSrc = (LPCTSTR)csSrcData;
    for (lngPos = 0; lngPos < lngLength; lngPos++) {
    chSrc = *(strSrc + lngPos);
    if (chSrc != '%') {
    csSource += chSrc;
    } else {
    if (lngPos + 2 < lngLength) {
    csHexCode.Empty();
    csHexCode += *(strSrc + (++lngPos));
    csHexCode += *(strSrc + (++lngPos));
    csSource += (unsigned char)strtoul(csHexCode, &strEr, 16);
    if (*strEr != 0) {
    //throw(cderException);
    return 0;
    };
    } else {
    //throw(cderException);
    return 0;
    };
    };
    };
    //AfxMessageBox( csSource );
    csDstData = csSource;
    //if (IsJisConvert) {
    // csSrc = csSource;
    // ConvJisToSJis();
    // csSource = csDst;
    //};
    return 0;
    }
      

  3.   

    我用sniffer把发送到服务器的包抓下来了好像不是编码的差别,因为两个软件发送的数据包中“测试”都是b2 e2 ca d4但是好像自己的程序发送的没有Accept-Language: zh-cn 和Accept-Encoding: gzip, deflate等内容,我应该怎么才能加上这些呢?是不是不能用openURL了?下面是sniffer得到的一些数据
    IE发送的:
    HTTP:
    HTTP: 1:GET /muser?user=selfuser&message=测试&destinationAddr=13600000000&messageSave= HTTP/1.1
    HTTP: 2:Accept: */*
    HTTP: 3:Accept-Language: zh-cn
    HTTP: 4:Accept-Encoding: gzip, deflate
    HTTP: 5:User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)
    HTTP: 6:Host:xxx.xxx.com.cn
    HTTP: 7:Connection: Keep-Alive
    Http: 8:Cookie:JSESSIONID=...................
    HTTP: 9:而我的程序却发送的是:
    HTTP:
    HTTP: 1:GET /muser?user=selfuser&message=测试&destinationAddr=13600000000&messageSave= HTTP/1.1
    HTTP: 2:User-Agent: pim
    HTTP: 3:Host: xxx.xxx.com.cn
    HTTP: 4:Cookie: JSESSIONID=..................
    HTTP: 5:
      

  4.   

    具体的我也说不明白,这是从鬼子那里找到的,上边我的程序也是这么改写的//----------------------------------------------------------------------------
    //
    //  娭悢柤   : CUrlEncode::EnCode
    //
    //  婡擻     : URL僄儞僐乕僪
    //
    //  婡擻愢柧 : csSource偵懳偟偰URL僄儞僐乕僪張棟傪峴偄丄寢壥傪csCode偵弌椡偡傞丅
    //
    //----------------------------------------------------------------------------
    void CUrlEncode::EnCode(bool IsMsgHeader, bool IsJisConvert)
    {
    int iCodeType;
    int iPrevCodeType = 0;
    char strBuf[10]; // 嶌嬈僶僢僼傽
    CString csTarget; // 曄姺懳徾暥帤楍
    CString csConverted; // 曄姺屻偺暥帤楍
    LPCTSTR strSrc = (LPCTSTR)csSource;
    csCode.Empty();
    // 僔儞僌儖僶僀僩僐乕僪丒儅儖僠僶僀僩僐乕僪暘棧
    csTarget.Empty();
    for (;;) {
    iCodeType = GetSJisChar(strSrc, strBuf);
    strSrc += iCodeType;
    if (iCodeType < 0) break; // 僄儔乕
    if (iPrevCodeType != iCodeType && iPrevCodeType != 0) {
    // 僔儞僌儖僶僀僩<->儅儖僠僶僀僩偺嫬栚
    csConverted.Empty();
    if (iPrevCodeType == 2) {
    DoUrlEncode(csTarget, csConverted, IsJisConvert, NULL);
    } else {
    DoUrlEncode(csTarget, csConverted, false, (LPCTSTR)m_csExcept);
    };
    csCode += csConverted;
    csTarget.Empty();
    };
    if (iCodeType == 0) break;
    csTarget += strBuf;
    iPrevCodeType = iCodeType;
    };
    }void CUrlEncode::DoUrlEncode(CString csSrcData, CString &csDstData, bool IsJisConvert, LPCTSTR strExcept)
    {
    long lngLength; // 僆儕僕僫儖暥帤楍(csSource)偺挿偝
    long lngPos; // 張棟埵抲
    char chSrc; // 張棟懳徾僐乕僪(1byte)
    LPCTSTR strSrc; // 僆儕僕僫儖暥帤楍傊偺億僀儞僞
    char strBuf[10]; // 僐乕僪->16恑悢曄姺梡嶌嬈僶僢僼傽
    bool IsExcept;
    // 僐乕僪曄姺
    if (IsJisConvert) {
    csSrc = csSrcData;
    ConvSJisToJis();
    csSrcData = csDst;
    };
    // UrlEncode
    lngLength = csSrcData.GetLength();
    strSrc = (LPCTSTR)csSrcData;
    for (lngPos = 0; lngPos < lngLength; lngPos++) {
    chSrc = *(strSrc + lngPos);
    IsExcept = false;
    if (strExcept != NULL) {
    for (long lngPos = 0; *(strExcept + lngPos) != 0; lngPos++) {
    if (*(strExcept + lngPos) == chSrc) {
    IsExcept = true;
    break;
    };
    };
    };
    if (('0' <= chSrc && chSrc <= '9')
    || ('a' <= chSrc && chSrc <= 'z')
    || ('A' <= chSrc && chSrc <= 'Z')
    || IsExcept) {
    // 塸悢帤憡摉偺僐乕僪傑偨偼曄姺懳徾奜僐乕僪偼偦偺傑傑
    csDstData += chSrc;
    } else if (chSrc == ' ') {
    // 僗儁乕僗偼'+'偵曄姺偡傞
    csDstData += '+';
    } else {
    // 僄僗働乕僾('%')亄16恑悢昞帵偵抲偒姺偊傞
    sprintf(strBuf, "%0.2X", (unsigned char)chSrc);
    csDstData += "%";
    csDstData += strBuf;
    };
    };
    }//----------------------------------------------------------------------------
    //
    //  娭悢柤   : CUrlEncode::DeCode
    //
    //  婡擻     : URL僨僐乕僪
    //
    //  婡擻愢柧 : csSource偵懳偟偰URL僨僐乕僪張棟傪峴偄丄寢壥傪csCode偵弌椡偡傞丅
    //
    //----------------------------------------------------------------------------
    void CUrlEncode::DeCode(bool IsMsgHeader, bool IsJisConvert)
    {
    long lngLength; // 僄儞僐乕僪暥帤楍(csCode)偺挿偝
    long lngPos; // 張棟埵抲
    char chSrc; // 張棟懳徾僐乕僪(1byte)
    LPCTSTR strSrc; // 僄儞僐乕僪暥帤楍傊偺億僀儞僞
    char *strEr; // strtoul梡僄儔乕弌椡
    CString csHexCode; // 16恑昞婰
    csSource.Empty();
    lngLength = csCode.GetLength();
    strSrc = (LPCTSTR)csCode;
    for (lngPos = 0; lngPos < lngLength; lngPos++) {
    chSrc = *(strSrc + lngPos);
    if (chSrc != '%') {
    // 僄僗働乕僾('%')偑側偄応崌偼偦偺傑傑捛壛丅
    csSource += chSrc;
    } else {
    // 僄僗働乕僾('%')亄16恑悢->捠忢偺暥帤僐乕僪偵曄姺偡傞丅
    if (lngPos + 2 < lngLength) {
    csHexCode.Empty();
    csHexCode += *(strSrc + (++lngPos));
    csHexCode += *(strSrc + (++lngPos));
    csSource += (unsigned char)strtoul(csHexCode, &strEr, 16);
    if (*strEr != 0) {
    throw(cderException);
    return;
    };
    } else {
    throw(cderException);
    return;
    };
    };
    };
    if (IsJisConvert) {
    csSrc = csSource;
    ConvJisToSJis();
    csSource = csDst;
    };
    }
      

  5.   

    现在我是想让我的程序和IE一样能够也发送出
    HTTP: 2:Accept: */*
    HTTP: 3:Accept-Language: zh-cn
    HTTP: 4:Accept-Encoding: gzip, deflate
    HTTP: 5:User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)
    HTTP: 6:Host:xxx.xxx.com.cn
    HTTP: 7:Connection: Keep-Alive
    然后再看看行不行,我感觉肯能不是编码的问题。
    不过还是要谢谢你:)
      

  6.   

    有谁知道如何让我的程序和IE一样能够
    除了发送出
    HTTP:
    HTTP: 1:GET /muser?user=selfuser&message=测试&destinationAddr=13600000000&messageSave= HTTP/1.1同时发送出
    HTTP: 2:Accept: */*
    HTTP: 3:Accept-Language: zh-cn
    HTTP: 4:Accept-Encoding: gzip, deflate
    HTTP: 5:User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)
    HTTP: 6:Host:xxx.xxx.com.cn
    HTTP: 7:Connection: Keep-Alive
      

  7.   

    问题已经解决,把那些加上后就可以用中文了
    file =(CHttpFile*)p_http->OpenRequest(1,"\user?username="+loginname+"&_password="pwd);
    file->AddRequestHeaders("Accept: */*");
    file->AddRequestHeaders("Accept-Language: zh-cn");
    file->AddRequestHeaders("Accept-Encoding: gzip, deflate");
    file->AddRequestHeaders("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)");
    file->SendRequest();