在网上找了很久,大致的代码都是源于一个版本的,我复制到了自己的程序里去。
   步骤是这样的,首先传一个CString的参数调用url_UTFEncoder函数,例:CString c_input = _T("你好");
我用google翻译试了下,“你好”的网页url上的那种表现形式为“%E4%BD%A0%E5%A5%BD”,三个%号组成一个字,这里6个%号正正好是2个字。但是用下来发现了问题,先贴代码
CString CUTFEncoder::url_UTFEncoder(CString c_input)
{
ConvertGBKToUtf8(c_input);//按照上面所讲,这里得出的c_input长度应该是6,但运行下来是3,直接导致后面
                                       //的for循环得出“%XX%XX%XX”三个%号,这显然不是正确的结果,所以接下来我
                                       //开始检查这个函数。 std::ostrstream utf_code;
std::string outputstring; for (int i=0;i<c_input.GetLength();i++) 
{
int temp=c_input[i];
temp=temp&0xff;
utf_code<<'%';
utf_code<<hex<<temp;
}
outputstring=utf_code.str();
int i = c_input.GetLength()*3;
outputstring=outputstring.substr(0,c_input.GetLength()*3);
CString c_outputstring(outputstring.c_str());
return c_outputstring;
}
void CUTFEncoder::ConvertUtf8ToGBK(CString& cstrUtf8) 
{
string strUtf8;
WCharToChar( CP_ACP, cstrUtf8.GetBuffer(), strUtf8); int len=MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len + 1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, (LPWSTR)wszGBK, len); len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wszGBK, -1, NULL, 0, NULL, NULL); 
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, (LPCWSTR)wszGBK, -1, szGBK, len, NULL,NULL); cstrUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}void CUTFEncoder::ConvertGBKToUtf8(CString& cstrGBK) //cstrGBK == _T("你好")
{
string strGBK;
WCharToChar( CP_ACP, cstrGBK.GetBuffer(), strGBK); //strGBK == _T("你好")

int len=MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL,0);//len == 3
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, (LPWSTR)wszUtf8, len);//wszUtf8 == “你好” len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL); //len == 7
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);//这步之后szUtf8
        的之便成了三个字符的乱码,这就是url_UTFEncoder中的到的c_input的值长度是3的原因,所以我猜想问题一定是出在这个函数上了。
cstrGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
由于我对于内码的概念并不是十分了解,所以我只能把调试中得到的数据给出,望大虾们帮小弟一把,看看这些函数问题出在哪里,谢了

解决方案 »

  1.   

    如果只是处理URL 用InternetCrackUrl()API 就可以了如果处理这些基本的编码操作ATL中都包含了这些实现源码 
    ATL 中的编码操作包含在 <atlenc.h> 中
      

  2.   

    可是InternetCrackUrl()我看了下,好像是处理Url,把%格式的转换过来的,我想把汉字转成%的格式~
      

  3.   

    如果处理URL的话,SDK里提供了整套的API,拿来就能用, 如果是一些常用的编码操作,ATL基本上都给做好了,哪来就能使,都能从MSDN里找到帮助
      

  4.   

    写ConvertUtf8ToGBK(CString& cstrUtf8)之类的编码转换函数, 不要使用 CString作为过程参数和变量
    CString是版本相关的,使用基本的数据类型作为参数来进行编码处理:char 和 WCHAR