RT。
CString str;
str=m_list.GetItemText(0,0);
file.Write(str, 2*str.GetLength());字符集unicode
list表中某一列为汉字,我这样写进去文件汉字变乱码,请问可以怎么解决。不换字符集。,谢谢

解决方案 »

  1.   

    Unicode字符写进文档,需要添加OXFF,0XFE 两个字节在文件开头
    char szHeader[] = {0xFF, 0xFE};
    file.Write(szHeader, 2);
    CString str;
    str=m_list.GetItemText(0,0);
    file.Write(str, 2*str.GetLength());
    ...
      

  2.   

    你的格式错啦,write是char* 类型,要把CString转换为char类型的!
      

  3.   

    接楼上,先用_stprintf()转换成TCHAR,在用WideCharToMultiByte()转成char
      

  4.   

    是不是 后边的长度有问题, 应该是wchar的,虽然你用了2*,换成str.GetLength()*sizeof(WCHAR)试试
      

  5.   

    1楼的方法应该是对的。用记事本打开应该不会乱码的,不知道你用什么编辑器?
    你可以试着用那个程序写入“测试文本”进一个文件。再用记事本,保存时选择编码是Unicode,写同样的文本。然后用WinHex打开看看有什么不同。可以贴出来一起讨论。
      

  6.   

    注意OXFF,0XFE一定要写在文件开头,写在其它地方是不行的。
      

  7.   


    char szHeader[] = {0xFF, 0xFE};
    char Item_name[]="序列,类型,时间,水位,电压,报警";
    file.Write(szHeader, 2);
    file.Write(Item_name,sizeof(Item_name));
    file.Write(_T("\r\n"),2);
    for(int i=0;i<m_list.GetItemCount();i++)
    {
            str=m_list.GetItemText(i,0);
    file.Write(str, 2*str.GetLength());  file.Write(_T(","),1);
    str=m_list.GetItemText(i,1);
    file.Write(str, 2*str.GetLength());  
    }
      

  8.   


    接上。我是那样写csv的。循环后面还有。可能这样看语法会错。如果我加入char szHeader[] = {0xFF, 0xFE};并写入的话。打开excel就变成这样
    如果不加。就是这样
      

  9.   

    宽字符转换不会吗!我随便写的,你看看
    CString str = L"中国欢迎您!";
    int len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL);
    char* buf = new char[len+1];
    WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), buf, len, NULL, NULL);
    buf[len+1] = '\0';
    file.Write(buf, str.GetLength()*2);
    file.Flush();
      

  10.   


    多谢你的代码。我把 str=m_list.GetItemText(i,0);获取到的变量按照你说的转换了再放进去就可以了。
    只是还有一个疑问。就是你上面的str最后是个!,加进去就会出现错误。像这样
    后面的挤到前面来了,因为是保存为csv的,所以我写完数据后都这样file.Write(_T(","),1);写个逗号进去分列。如果我把那个!去掉就不会又问题。请问这个是怎么回事?如果我要加!的话怎么做才不会出现这样的错误?
      

  11.   

    没有这样的错误,不明白你的意思,Write接受的char类的,不要用Tchar!
      

  12.   

    结合一楼的方法。
    file.Write((LPCWSTR)str, 2*str.GetLength());
    再改成这样试试
      

  13.   

    file.Write((LPCWSTR)str, 2*str.GetLength()+2);
      

  14.   

    试一下这个
    写文件之前调用这个
    setlocale( LC_CTYPE, "chs" );
    写完文件后调用这个
    free( old_locale );
      

  15.   

    其实不用这样,CStringA stra;
    stra = str;
    就自动转换成ANSI了。不过因为楼主说了不换字符集,所以我理解应该直接写Unicode。
    不过后来查了一下,发现Windows版本的Excel对于UTF-16编码的CSV文件支持不好,无论带不带BOM。不过UTF-8带BOM的识别倒是不错。
      

  16.   


    将CFile改成CStdioFile就可以搞定
      

  17.   

    wchar_t szTemp = L"hello world";char szOut[0x100] = {0};wsprintfA(szOut, "%ls", szTemp);
      

  18.   

    #ifdef UNICODE
    if (file.GetLength() == 0ULL) {
    BYTE szHeader[] = { 0xFF, 0xFE };
    file.Write(szHeader, sizeof(szHeader));
    }
    #endif
    CString str = m_list.GetItemText(0,0);
    file.Write((LPCVOID)(LPCTSTR)str, sizeof(TCHAR) * str.GetLength());
      

  19.   

    对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。