表单提交过程: lpszFieldName == 表单名 lpszFieldValue == 表单值(可能要接收中文)
HRESULT 
CParseNetPage::CUploader::UploadField( HINTERNET hRequest, string strBoundary, 
                                       LPCTSTR lpszFieldName, LPCTSTR lpszFieldValue )

  string fieldHeader = GenerateFieldHeader(strBoundary, lpszFieldName);  DWORD dwBytesWritten;
  if (!InternetWriteFile( hRequest, (LPCVOID)fieldHeader.data(), 
     (DWORD)fieldHeader.size(), &dwBytesWritten) )
  {
    char buff[100];
    wsprintf( buff, "InternetWriteFile Header failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
    MessageBox( NULL, (LPCTSTR)fieldHeader.data(), "FieldHeader", MB_OK );
    return HRESULT_FROM_WIN32(GetLastError());
  }
 
  string fieldValue = lpszFieldValue;  // fieldValue 这个字段会接收中文
  if (!InternetWriteFile( hRequest, (LPCVOID)(LPCTSTR)fieldValue.data(),
     (DWORD)fieldValue.size(), &dwBytesWritten) )
  {
    char buff[100];
    wsprintf( buff,"InternetWriteFile value failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
    MessageBox( NULL, (LPCTSTR)fieldValue.data(), "FieldValue", MB_OK );
    return HRESULT_FROM_WIN32(GetLastError());
  }  string fieldTrailer = GenerateFieldTrailer();
  if (!InternetWriteFile( hRequest, (LPCVOID)fieldTrailer.data(),
    (DWORD)fieldTrailer.size(), &dwBytesWritten ) )
  {
    char buff[100];
    wsprintf( buff,"InternetWriteFile trailer failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
    MessageBox( NULL, buff, "FieldTrailer", MB_OK );
    return HRESULT_FROM_WIN32(GetLastError());
  }  return S_OK;
}

解决方案 »

  1.   

    UP.这么强.你用MFC写CGI啊?
    我用apache+libcgi写cgi的没有遇到这种情况
      

  2.   

    修改成unicode 还是不行啊: 测试代码如下HRESULT 
    CParseNetPage::CUploader::UploadField( HINTERNET hRequest, string strBoundary, 
                                           LPCTSTR lpszFieldName, LPCTSTR lpszFieldValue )

      .....
      if( fieldValue.compare( "11.doc" ) != 0 ) {
        MessageBox( NULL, (LPCTSTR)(LPWSTR)fieldValue.data(), "ling", MB_OK );
        if (!InternetWriteFile( hRequest, (LPCVOID)(LPWSTR)fieldValue.data(),
          (DWORD)fieldValue.size(), &dwBytesWritten) )
        {
          char buff[100];
          wsprintf( buff,"InternetWriteFile value failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
          MessageBox( NULL, (LPCTSTR)fieldValue.data(), "FieldValue", MB_OK );
          return HRESULT_FROM_WIN32(GetLastError());
        }
      } else {
        MessageBox( NULL, (LPCTSTR)(LPWSTR)fieldValue.data(), "1111111", MB_OK );
        wchar_t *w = (wchar_t*)"1中国人工智能1.doc";
        if (!InternetWriteFile( hRequest, (wchar_t*)w/*fieldValue.data()*/,
            (DWORD)fieldValue.size(), &dwBytesWritten) )
        {
          char buff[100];
          wsprintf( buff,"InternetWriteFile value failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
          MessageBox( NULL, (LPCTSTR)fieldValue.data(), "FieldValue", MB_OK );
          return HRESULT_FROM_WIN32(GetLastError());
        }
        MessageBox( NULL, (LPCTSTR)(wchar_t*)w, "asdfsssssssss", MB_OK );
      }
    .................
      return S_OK;
    }
      

  3.   

    可能是编码问题,如果服务器端这边是java的话,用的是utf8编码,VC是GB2312
      

  4.   

    服务器端这边是java的这段代码是将多字节转成unicode...
    void MultiByteToUTF8( LPCTSTR pszSrc, int cchSrc, LPSTR lpDestStr,
                          int cchDest, UINT nCodePage = 950 )
    {
      WCHAR * pws = new WCHAR[cchSrc];
      memset(pws, 0, (cchSrc)*sizeof(WCHAR));
      memset(lpDestStr, 0, cchDest);
      
      int nLen = MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, NULL, NULL);
      int cchWChar = MultiByteToWideChar( nCodePage, 0, pszSrc,cchSrc, pws, nLen );
      LdapUnicodeToUTF8( pws, cchWChar, lpDestStr, cchDest ); 
      wsprintf( buff, "cchwchar= %d  lstrlen: %d", cchWChar, lstrlen( lpDestStr ) );
      // "当pszSrc = "工人.doc"时 cchWChar == lstrlen( lpDestStr ) - 2
      MessageBox( NULL, buff, "22222222", MB_OK );
      delete[] pws;
    }
    使用:
      char DestStr[100];
      memset( DestStr, 0, sizeof( DestStr ) );
      int  size = (int)fieldValue.size();
      MultiByteToUTF8( (LPCTSTR)fieldValue.data(), size, DestStr, size, 936 ); 当我将 fieldValue = "工人.doc 放入表面提交后, 在页面上显示为 "工人.d"根据汉字的多少, 会少一些字节..... 怎么做才能让它我转入的数据正确的在页面上显示呢.
      

  5.   

    1、建议程序中字符串定义TCHAR类型,可以免去转换之苦,
    定义了_UNICODE,TCHAR定义为WCHAR,
    定义了_MBCS,TCHAR定义为char
    字符串处理函数用<tchar.h>中定义的各种对应函数,如_tcscpy取代strcpy...
    2、也可以用常用的转换函数:
    char--wchar 
    MultiByteToWideChar(CP_ACP,0,srcstr,-1,destwstr,buflen)
    wchar--char
    WideCharToMultiByte(CP_ACP,0,srcwstr,-1,deststr,buflen,NULL,NULL)