大大们帮忙。。为什么使用Unicode字符集的时候,无法往txt文件中写入汉字?
IDE:VC8SP1;
系统:VistaSP1
问题代码:CStdioFile file;
file.Open(_T("C:\\a.txt"),CFile::typeText|CFile::modeReadWrite|CFile::modeCreate);CString str(_T("我爱你"));
file.WriteString(str);问题描述:1、字符集使用UNICODE:
a、str内容为“我爱你”三个汉字,打开a.txt,文件为空,大小为0字节。NND,什么也没写进去。
b、str内容改为“iloveu”,6个字母,打开a.txt,文件显示正确,大小为6字节。疑问1:既然字符集是unicode了,字母也应该是按双字节来处理的,6个字母应该是12字节,这里为什么还是6字节?2、字符集使用MBCS:
a、写入汉字正常
b、写入英文更正常。。
另:1a的情况下,我自己跟踪跟进fputws.c,到55行: while (length--)
        {
            if (_putwc_nolock(*string++, stream) == WEOF)  //如果内容*string为汉字的话这里总是返回WEOF,然后直接break了。什么也没写入
            {
                retval = -1;
                break;
            }
        }
求大大们帮助。。万分感谢。百分奉上~~虽说改字符集MBCS可以解决问题。。但总不是那么回事。不搞明白很不舒服。
                 

解决方案 »

  1.   

    不要用CStdioFile,代码如下:
    CFile file;
    if(!file.Open(_T("C:\\test.txt"), CFile::modeCreate | CFile::modeReadWrite| CFile::modeNoTruncate))
    {
    AfxMessageBox(_T("打开失败!"));
    return FALSE;
    }
    WORD wSignature = 0xFEFF;
    file.Write(&wSignature, 2);
    WCHAR * tem = L"VC测试\r\nVC测试";
    file.Write(tem, sizeof(tem)*sizeof(WCHAR));
    file.Close();
      

  2.   

    CStdioFile 类好像有些 BUG,可以使用 CFile 类代替。CFile file; 
    CString str = _T("xxxxx"); //先将数据保存到 strText(换行使用 "\r\n")。if (file.Open(_T("C:\\a.txt"), CFile::modeCreate | CFile::modeWrite)) 

       file.WriteHuge(strText, strText.GetLength() * sizeof(TCHAR)); 
       file.Close(); 

      

  3.   

    CStdioFile的WriteString内部调用的是fputs或者fputws,
    fputws本身是不能直接写Unicode字串,解决方法就是像1楼所讲,直接用CFile
    fputws写Unicode字符需要使用binary模式以及设置正确的Locale才可以,很麻烦。
    用CFile反而简单明了。
      

  4.   

    SO DAS NEI.....按照2位的方法,都可以。
    那么,讲讲为什么呢?
    1、WORD wSignature = 0xFEFF; 是行尾标志还是?我有时候打开中文文档会提示行尾标准化,难道这就是标准行尾?
    2、用fstream<wchar_t,...>的时候,写汉字的时候也是不行。
      

  5.   

    0xFEFF是表示UNICODE的格式,这种是常用的标准Unicode,如果是0xFFFE,则表示Unicode Big Endian
    关于Unicode的详细解释需要一大堆的内容,你用Notepad打开一个文本文件,然后另存为,在下面有一个编码选择,每种编码分别保存一个文本,然后用Binary的方式打开文件查看文件头,就明白了!