之前在做一个POST程序。目标网站是用.net写的。  试验了N次没能成功。好像是编码格式不对,要转化为URLCODE, 于是在网上找URLEncode函数,用了之后还是不对,被经理吵,被同事BS,郁闷到想辞职! 整整用了两天才研究出来,现在和大家一起分享下,为了我们可爱的C++......问题已解决CString  UTF8Convert(CString  str,  int  sourceCodepage,  int  targetCodepage)  
{  
int  len=str.GetLength();  

int  unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0);  

wchar_t            *  pUnicode;  
pUnicode=new  wchar_t[unicodeLen+1];  

memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));  


MultiByteToWideChar(sourceCodepage,0,str,-1,(LPWSTR)pUnicode,unicodeLen);  

BYTE  *  pTargetData;  
int  targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char  *)pTargetData,0,NULL,NULL);   pTargetData=new  BYTE[targetLen+1];  
memset(pTargetData,0,targetLen+1);  

WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char  *)pTargetData,targetLen,NULL,NULL);  

CString  rt;  
rt.Format("%s",pTargetData);  

delete  pUnicode;  
delete  pTargetData;  
return  rt;  

}  
class URLClass
{
public:
inline BYTE toHex(const BYTE &x)
{
return x > 9 ? x + 55: x + 48;
}

inline BYTE toByte(const BYTE &x)
{
return x > 57? x - 55: x - 48;
}

CString URLDecode(CString sIn)
{
CString sOut;
const int nLen = sIn.GetLength() + 1;
register LPBYTE pOutTmp = NULL;
LPBYTE pOutBuf = NULL;
register LPBYTE pInTmp = NULL;
LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);

pOutBuf = (LPBYTE)sOut.GetBuffer(nLen);

if(pOutBuf)
{
pInTmp   = pInBuf;
pOutTmp = pOutBuf;

while (*pInTmp)
{
if('%'==*pInTmp)
{
pInTmp++;
*pOutTmp++ = (toByte(*pInTmp)%16<<4) + toByte(*(pInTmp+1))%16;
pInTmp++;
}
else if('+'==*pInTmp)
*pOutTmp++ = ' ';
else
*pOutTmp++ = *pInTmp;
pInTmp++;
}
*pOutTmp = '\0';
sOut.ReleaseBuffer();
}
sIn.ReleaseBuffer();

return sOut;
}
CString URLEncode(CString sIn)
{
CString sOut;
const int nLen = sIn.GetLength() + 1;
register LPBYTE pOutTmp = NULL;
LPBYTE pOutBuf = NULL;
register LPBYTE pInTmp = NULL;
LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);

pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3);

if(pOutBuf)
{
pInTmp   = pInBuf;
pOutTmp = pOutBuf;

while (*pInTmp)
{
if(isalnum(*pInTmp) || '-'==*pInTmp || '_'==*pInTmp || '.'==*pInTmp||'&'==*pInTmp||'='==*pInTmp)
*pOutTmp++ = *pInTmp;
else if(isspace(*pInTmp))
*pOutTmp++ = '+';
else
{
*pOutTmp++ = '%';
*pOutTmp++ = toHex(*pInTmp>>4);
*pOutTmp++ = toHex(*pInTmp%16);
}
pInTmp++;
}
*pOutTmp = '\0';
sOut.ReleaseBuffer();
}
sIn.ReleaseBuffer();

return sOut;
}
};CString str="中国";
str=UTF8Convert(str,0,65001);
URLClass uc;
str=uc.URLEncode(str);
这样就OK了。。