////////////////////////////////////////////////////////////////////
/*
功能:编码转换
参数:源字符串
返回:转换后的字符串
*/
CString CHttp::EncodeHTML(CString &str)
{
//如果当前未设置编码
if (m_CodePage == -1)
{
//根据标签,设置编码
int pos1 = str.Find("charset");
if (pos1 == -1)
pos1 = str.Find("encoding");
if (pos1 > -1)
{
int pos2 = str.Find('>', pos1);
CString CodePageStr;
CodePageStr = str.Mid(pos1, pos2 - pos1);
CodePageStr.MakeUpper();
if (CodePageStr.Find("UTF-8") > -1)
m_CodePage = CP_UTF8;
else
if (CodePageStr.Find("GB2312") > -1)
m_CodePage = CP_ACP;
else
if (CodePageStr.Find("BGK") > -1)
m_CodePage = CP_ACP;
}
} //如果设置了其他编码,则转换编码
if (m_CodePage == CP_UTF8)
{
//把字符串转换为UNICODE编码
CStringW strW;
//获取UNICODE编码所需的长度
int len = ::MultiByteToWideChar(m_CodePage, NULL, str.GetBuffer(), str.GetLength(), NULL, NULL);
//注意别忘了,拷贝字符串结束符
strW.GetBuffer(len + 1);
::MultiByteToWideChar(m_CodePage, NULL, str.GetBuffer(), str.GetLength() + 1, strW.GetBuffer(), len + 1);
strW.ReleaseBuffer(); //把UNICODE编码转化为GB2312编码
CString strA;
BOOL succ;
//获取GB2312编码所需的长度
len = ::WideCharToMultiByte(CP_ACP, NULL, strW.GetBuffer(), strW.GetLength(), NULL, NULL, NULL, &succ);
//注意别忘了,拷贝字符串结束符
strA.GetBuffer(len + 1);
::WideCharToMultiByte(CP_ACP, NULL, strW.GetBuffer(), strW.GetLength() + 1, strA.GetBuffer(), len + 1, NULL, &succ);
strA.ReleaseBuffer();

return strA;
} //不需转换,则返回原串
return str;
}////////////////////////////////////////////////////////////////////
/*
功能:POST数据编码转换
参数:源字符串
返回:转换后的字符串
*/
CString CHttp::EncodePOST(CString &str)
{
//如果设置了其他编码,则转换编码
if (m_CodePage == CP_UTF8)
{
//把GB2312编码转换为UNICODE编码
CStringW strW;
//获取UNICODE编码所需的长度
int len = ::MultiByteToWideChar(CP_ACP, NULL, str.GetBuffer(), str.GetLength(), NULL, NULL);
//注意别忘了,拷贝字符串结束符
strW.GetBuffer(len + 1);
::MultiByteToWideChar(CP_ACP, NULL, str.GetBuffer(), str.GetLength() + 1, strW.GetBuffer(), len + 1);
strW.ReleaseBuffer(); //把UNICODE编码转化为目标编码
CString strA;
//获取GB2312编码所需的长度
len = ::WideCharToMultiByte(m_CodePage, NULL, strW.GetBuffer(), strW.GetLength(), NULL, NULL, NULL, NULL);
//注意别忘了,拷贝字符串结束符
strA.GetBuffer(len + 1);
::WideCharToMultiByte(m_CodePage, NULL, strW.GetBuffer(), strW.GetLength() + 1, strA.GetBuffer(), len + 1, NULL, NULL);
strA.ReleaseBuffer();

return strA;
} //不需转换,则返回原串
return str;
}以上是网上找来的源码,用到了CStringW,但是在VC6下通不过,还有getbuffer的用法也有误,求改动一下。
功能是把网页的编码 转换

解决方案 »

  1.   

    工程默认的字符集不同。
    改工程设置或者将CString的地方,如int pos1 = str.Find("charset");改为str.Find(_T("charset"));
      

  2.   

    此处如何改呢
    CStringW strW;         //获取UNICODE编码所需的长度       
      int len = ::MultiByteToWideChar(m_CodePage, NULL, str.GetBuffer(), str.GetLength(), NULL, NULL);         
      

  3.   

    编码转换,忌用编码关联的数据类型(CString),最好使用WCHAR  char