下面的代码对于英文没有问题,但是中文就出问题。如:m_addname是d:\myfile,
TRACE("s = %ws\n",s)就显示是d:\myfile;如果m_addname是d:\文件,
TRACE("s = %ws\n",s)就显示是d:\,后面的中文全都不见了,我觉得是什么字符给截断了,问怎么解决。
CHAR file[260];
strcpy(file,m_addname.GetBuffer(m_addname.GetLength()));//m_addname是一个CString类型
m_addname.ReleaseBuffer(0);

int widecharlen=MultiByteToWideChar(  //计算从Ansi转换到Unicode后需要的字节数
CP_ACP,
MB_COMPOSITE,
file,  //要转换的Ansi字符串
-1,  //自动计算长度
0,
0
);
wchar_t* s = new wchar_t[widecharlen];
MultiByteToWideChar(  //从Ansi转换到Unicode字符
CP_ACP,
MB_COMPOSITE,
file,
-1,
s,  //转换到tmpstr
widecharlen  //最多转换widecharlen个Unicode字符
); TRACE("s = %ws\n",s);

解决方案 »

  1.   

    貌似是TRACE的bug,你用OutputDebugStringW输出看看
      

  2.   

    wchar_t* s = new wchar_t[widecharlen]; //widecharlen + 1 try
      

  3.   

    TRACE没问题,我是和驱动通讯的,在驱动层看到的也是这样,所以我很纳闷
      

  4.   

    OutputDebugStringW能构显示出来,可是为什么trace不行,我是定义了下面的结构:
    typedef struct _INFILE
    {
    ULONG size;
    PWSTR PFileName;
    }File;FileInfo f;
    f.PFileName = s;
    把PFileName指向s,然后传送下去。
    英文可以正常显示,中文就不行,我一定要PFileName指向带中文的unicode字符串的,可就是不对阿
      

  5.   

    就用OutputDebugStringW吧,反正TRACE也还是用它输出。
    记得是codecomments上有人发文说过TRACE把%s和%S给弄错了的
      

  6.   

    不是这个问题,我用memory查看的时候
    英文如下:  d:\sss
    64 00 3A 00 5C 00 73     d.:.\.s
    00 73 00 73 00 00 FF     .s.s...  
    中文如下:  d:\文件 
    64 00 3A 00 5C 00 87     d.:.\.. 
    65 F6 4E 00 00 FF FF     eXX..其中XX是一个乱码。看到从87那里截断了,烦躁阿
      

  7.   

    转化为unicode的问题,我建议你在单独赋字符串的时候,用  _T("")英文如下: d:\sss
    64 00 3A 00 5C 00 73 d.:.\.s
    00 73 00 73 00 00 FF .s.s... 
    这就是ASCII在UNICODE下的双字节编码!系统默认会显示统一的unicode编码,除了这个,系统主要是用了默认的字符及编码,
    比如简体中文版的XP,会用CP936编码,来处理ascii和多字节的编码,而且当字符的
    编码是多字节的时候,你就不能用字节的取值来得到字符串,要用得到字符的函数,这个
    windows API中有!所以中文如下: d:\文件
    64 00 3A 00 5C 00 87 d.:.\..
    65 F6 4E 00 00 FF FF eXX..中 65 F6 4E 00 00 中都是"文件"的多字节编码,就不能用逐个字节取值得到字符串,
    而需要将这放在一个数组中,用 MultiByteToWideChar 设置相应的字符集,将其字节串值
    转换为这种字符集下的字符。