感觉比较奇怪,下面代码是在网上的例子上修改的,结果正确,但不明白为什么。高手给讲下所以然。         CString strSource = _T("Hello");
wchar_t *temp;
CString strTemp;

USES_CONVERSION;
W2A(strSource.LockBuffer());
strSource.UnlockBuffer(); strTemp.Format(_T("%s"), temp);
AfxMessageBox(strTemp);

解决方案 »

  1.   

    晕死了,这样一样得到“Hello”?????CString strSource = _T("Hello"); 
    char *temp; 
    CString strTemp; /*USES_CONVERSION; 
    W2A(strSource.LockBuffer()); 
    strSource.UnlockBuffer(); */strTemp.Format(_T("%s"), temp); 
    AfxMessageBox(strTemp);
      

  2.   

    看看
    http://www.cppblog.com/greatws/archive/2008/08/31/60546.html
      

  3.   

    纠正一下链接里的名词解释,其实UTF8也是一种Unicode。容易理解的正确的划分应该如下:Ansi,英文占一个字节,汉字2个字节微软的双字节(wchar_t): 每个字符都占2个字节.这是微软为支持多语言,又为了方便编程时的字符串操作而搞的方法(等长字符容易做字符换位等操作)因为双字节不够支持那么多语言,于是加了个地区码才能正确显示本地文字(Windows的语言设置里的地区设置),而且微软的文字显示类API,和处理类API都需要两套。UTF8一种国标的多字节Unicode字符集:它是一种变长表示法,从1字节到4字节,最多8字节都可以,汉字在UTF8中占3个字节。这也是LINUX系统选择的国际化路线,所有和文字相关API统一不变,只有一套,字符串处理和字符显示无关,要做字符串处理,请转换为等长字符串,处理后,请转换回变长字符,如果你都采用1字节的字母文字,那和传统英文开发完全一样。比较这两种方法,使用UTF8支持多语言,使LINUX向下兼容性非常好,老程序不支持多语言的,因为API都是老的,直接在新版本LINUX下照跑无误。开发多语言版本程序只要记住,多语言是变长字符串,做字符串操纵需要转换为等长的,而其他的东西都是和传统的一样。微软则需要维护两套W/A系列的API,同时还需要知道语言地区设置,还有_T()的自动宏,还有令人迷惑的_UNICODE_标记(此标记应该叫等长双字节支持标记),如果需要存储字符串,请记住,推荐转换为UTF8格式,否则换个语言地区设置的Windows就不能正常显示了。所有的设计初衷其实是为了方便字符串处理,可是却为未来留下了繁重的包袱,这一切都因为短视的双字节等长字符集。
      

  4.   

    你给出的代码,因为没有明示_UNICODE_标记,又采用了_T()自动转换ANSI/WCHAR宏,所以比较难确定错在哪里,只能猜测了。你根据上面的提示看看,你的Hello是ANSI还是WCHAR的,然后看看W2A是转换了WCHAR到ANSI还是把ANSI又转了一次到WCHAR。而注释后,是不是AfxMessageBox调用的是AfxMessageBoxW,而_T()却定义为ANSI了。
      

  5.   

    需要使用如下变换:
    WCHAR *tmp = NULL;
    tmp = new WCHAR[nCount + 1];
    int n = MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCSTR)text, nCount, tmp, nCount);