我在记事本中输入"你好啊"三个字(不包含"),用ultraedit打开,转到16位查看界面
得到这三个字的16进制数据"O}YJ"然后我想把这些乱码转换位unicode编码,让他们正常显示,下面的我的代码:
char *buf="O}YJU";size_t cLen=strlen(buf);
size_t wLen=MultiByteToWideChar(CP_ACP,0,buf,cLen+1,NULL,0);
wchar_t *wcharSorc=new wchar_t[wLen+1];
MultiByteToWideChar(CP_ACP,0,buf,cLen+1,wcharSorc,wLen);
wcharSorc[wLen]=L'\0';CString str;
str.Format(L"%s",wcharSorc);
AfxMessageBox(str);
delete []wcharSorc;
但是没有成功,得到的还是乱码
我用的是vs2008,unicode编码

解决方案 »

  1.   

    你这个乱码映射之后当然还是乱码。
    使用memcpy试试
      

  2.   

    另外需要注意的是,你这数据前两个字节是Unicode的文件头(Unicode标识"\xFF\xFE")
      

  3.   

    "O}YJ"不是"你好啊"的Unicode,也不是多字节编码,是“乱码”。真正的编码是:
    WCHAR buf1[4] = {0x4f60,0x597d,0x554a,0}; // L"你好啊"
    char buf2[7] = {0xc4,0xe3,0xba,0xc3,0xb0,0xa1,0}; // "你好啊"
      

  4.   

    用ultraedit打开,转到16位查看界面得到这三个字的16进制数据"O}YJ" ,这一步有问题
    "O}YJ"  本来已经是6个字符了再转的话怎么可能转成3个字符呢?
      

  5.   

    "O}YJ" 即{0xfeff,0x4f60,0x597d,0x554a} ("\xff\xfe\x60\x4f\x7d\x59\x4a\x55")
    标蓝部分为Unicode 标识头
      

  6.   

    char *buf="O}YJU"; size_t cLen=strlen(buf); 
    size_t wLen=cLen \ 2; 
    wchar_t *wcharSorc=new wchar_t[wLen+1];
    memcpy(wcharSorc,buf,cLen);
    wcharSorc[wLen]=L'\0'; CString str; 
    str.Format(L"%s",wcharSorc); 
    AfxMessageBox(str); 
    delete []wcharSorc; 
    注意:最好去掉前面两个字符
      

  7.   

    谢谢上面几位大哥。
    但是如果我用CFile这个类来访问我建立的文本,跳过开始的两个字节,然后用Read来读取后面的内容,得到的也是那些乱码,我怎么才能把这些乱码还原呢?
      

  8.   

    当你读取到前两个字节为"\xff\xfe",正常情况下,就已经可以认为是一个Unicode文件,只段按双字节读入内存,如果不需要ANSI字节码处理的话,直接交给wchar_t *即可,如果需要ANSI处理,则再通过WideCharToMultiByte转换。