先是定义了一个CString aa; 
然后给CString赋值了aa = _T("这里是中文");然后建一个CStdioFile类,用打开文件不截断和写入方式打开。
然后用write函数写入对应的txt文件CStdioFile oufile;
//然后打开文件
outfile.open("1.xtx",CFILE::modecreat | CFILE::modewrite);
outfile.write(aa,_tcslen(aa));
outfile.close();
但是打开文件以后,里面的确实乱码~~~不是“这里是中文这句话”~~这是怎么回事呢~~???是不是unicode编码之类的问题~~之前在VC6的时候挺好的~~后来装了VS2010~~~就不行了~~一直不太懂unicode和原来的ASIC的区别啥的~~是内存再用的区别么~~??希望能说的通俗一些~~谢谢了~~

解决方案 »

  1.   

    应该是UNICODE编码的问题,你试试将字符集改成多字节试试。
      

  2.   


    char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );
    setlocale( LC_CTYPE, "chs" );CStdioFile oufile;
    //然后打开文件
    outfile.open("1.xtx",CFILE::modecreat | CFILE::modewrite);
    outfile.write(aa,_tcslen(aa));
    outfile.close();setlocale( LC_CTYPE, old_locale );
    free( old_locale );
      

  3.   

    VS2005以后fopen某人都是以Unicode方式创建文件,这个时候需要给文件加一个BOM头,否则记事本无法识别文件格式。
    unsigned short int bom=0xfeff;   
    m_LogFile.Write(&bom,sizeof(short int));
    在文件头写一次就够了。以后版本的MFC估计会提供相应的功能控制。
    或者你可以用C函数库,fopen可以添加参数ccs指定打开文件的格式,但是它只能做到打开时识别,写入时不会自动写BOM,还得手动来。
      

  4.   

    fopen("abc.txt", "rw, ccs=UNICODE");
    这样它就会打开文件时自动识别文件BOM了,但是写入文件时必须制定是UTF-8还是UTF-16LE、UTF-16BE,否则还是以ANSI方式写入的。对应的BOM头必须手动写入。
      

  5.   

    你调用的_tcslen需要使用_tsetlocale才能正确获取, 在你的write前面加上:_tsetlocale(LC_CTYPE, _T("chs"));
      

  6.   


    CString strText(_T("这里是中文"));
    try
    {
    CStdioFile file;
    file.Open(_T("F:\\11.txt"), CFile::modeCreate|CFile::modeWrite);

    BYTE buf[] = {0xFF, 0xFE};
    file.Write(buf, sizeof(buf));
    file.Write(strText, strText.GetLength() * sizeof(TCHAR));

    file.Close(); }
    catch (CException* e)
    {
    e->ReportError();
    e->Delete();
    }
      

  7.   


    写入那个buf是为了什么呢???还有就是如果我把字符集改成了多字节的~~那是不是可以像以前再vc六里面操作~~字符常量也不用用_T来转换了??那用多字节变法写出的程序会和unicode有什么不同吗~~~比如说是不是放到英文版的系统上会有乱码啥的~~~??
    谢谢了
      

  8.   


    _tsetlocale这个事设置什么的???
    最后想问问vs2010里面的MSDN文档是不是改成了web版的了~~~??