工程是多字节字符集,将一个CString转为UTF8,利用了如下方法: int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);


len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL); 
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);

strGBK = szUtf8;
delete[] szUtf8;
         delete[] wszUtf8;其中大部分转换是正确的。比如strGBK="http://192.168.0.121/中文路径/test.txt";
可是少数汉字就会被转出“?”(UTF8转换中不能转换的部分似乎用“?”代替),比如strGBK="http://192.168.0.121/江苏省/test.txt";经过比对,问题出在这个“省”字。
在网上找了半天没有找到解决办法。希望各位帮忙,不想把问题留到2011~~呵呵

解决方案 »

  1.   

    试试这个。string unicode_2_utf8(const wchar_t *p_in)
    {
    int nLen = WideCharToMultiByte(CP_UTF8, 0, p_in, -1, NULL, 0, NULL, FALSE);
    char *p_out = new char[nLen];
    memset(p_out, 0, nLen);
    WideCharToMultiByte(CP_UTF8, 0, p_in, -1, p_out, nLen, NULL, FALSE);
    string s_out(p_out);

            delete p_out;
            p_out = NULL;
    return s_out;
    }
      

  2.   

    正常的话不会出来这事。你转成utf8之后,你是怎么查找,得到有?的呢?
      

  3.   

    // 江苏省-gb格式
    0xBD, 0xAD, 0xCB, 0xD5, 0xCA, 0xA1, // 江苏省-utf8格式
    0xE6, 0xB1, 0x9F, 0xE8, 0x8B, 0x8F, 0xE7, 0x9C, 0x81, // 江苏省-utf16 little 格式
    0x5F, 0x6C, 0xCF, 0x82, 0x01, 0x77, 
      

  4.   

    你怎么得到是?,不是使用AfxMessageBox输出来看的吧
      

  5.   

    输出需要使用UNICODE版本的函数或创建UNICODE版本工程,否则即使解码正确,仍会由于一些特殊字符得不到正确的输出结果。
      

  6.   

    楼主多试几种方法,比如直接使用MultiByteToWideChar(CP_UTF8,...),不经过MultiByteToWideChar(CP_ACP,...)经过自己试验后的结果,比网上找的理解深刻得多,也比网上找得时间短。
      

  7.   

    在vc6下的确出现这个问题,解决方法:创建vs2008工程,采用默认的unicode字符集,不必对中文再进行字符转换了。
      

  8.   

    经过元旦假期的研究,找到了问题的根结。问题的关键不是这个“省”字,而是汉字的奇偶数。当汉字是奇数时就会出错。原因现在看来应该是因为UTF-8以三个字节来表示一个汉字,服务器端会自动截取最后一个字节,使URL解析失败。因为当前工作急需,我将工程字符集转为UNICODE问题得以临时解决。如果再有时间,应该将URL在本地进行编码,即转为"%形式",这样理论上会解决汉字奇偶数的问题,因为暂时没有找到合适的URLEncode,先暂时搁置了。待日后解决,我会另外开帖或写博文说明解决过程。
    这里特别感谢chilli,她虽然只回复了很少的内容,但在私下给了我大量的帮助,并且问题的根结也是她找到的。同时感谢各位关注这一问题的兔子党、其他党以及无党派人士。