hur.cn - 华软网

 热门搜索

关于CRichEditView 文件保存乱码的问题

  作者:未知    来源:网络    更新时间:2011/2/22
由于一些原因
我重写了函数
void CRTLMutiDoc::Serialize(CArchive& ar)
{
CRichEditCtrl &pmyRichEditCtrl = ((CRichEditView*)m_viewList.GetHead())->GetRichEditCtrl();
    CString strTmp(_T(""));

    if (ar.IsStoring())
{

        m_strFile = "";
        ((CRichEditView*)m_viewList.GetHead())->GetWindowText(m_strFile);
        ar.Write(m_strFile, m_strFile.GetLength());
    
}
else
{
        m_strFile = "";
        
        while(ar.ReadString(strTmp))
        {            
            m_strFile += strTmp + _T("\n");
            
        }
        m_strFile.Replace("\t", "    ");
        //AfxMessageBox(strText);
        ((CRichEditView*)m_viewList.GetHead())->SetWindowText(m_strFile);


}
//CRichEditDoc::Serialize(ar);    
}

但是文件保存的时候出现乱码
比如一个测试文件内容:hehe
稍微修改好(比如随便 加一个空格)然后保存,内容变为各种乱码
ÐÏࡱá                >  þÿ                                þÿÿÿ       ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                hehe                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            þÿÿÿ    ýÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿR o o t   E n t r y                                               ÿÿÿÿÿÿÿÿ                                          ¤      C O N T E N T S                                                  ÿÿÿÿÿÿÿÿÿÿÿÿ                                        ¤                                                                          ÿÿÿÿÿÿÿÿÿÿÿÿ                                                                                                                    ÿÿÿÿÿÿÿÿÿÿÿÿ                                                                            
   þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿR o o t   E n t r y                                               ÿÿÿÿÿÿÿÿ                               @ú\DÒË   À      C o n t e n t s                                                  ÿÿÿÿÿÿÿÿÿÿÿÿ                                        §                                                                          ÿÿÿÿÿÿÿÿÿÿÿÿ                                                                                                                    ÿÿÿÿÿÿÿÿÿÿÿÿ                                                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿýÿÿÿþÿÿÿ    þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                            
   þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿhehe                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               请问怎么 解决呢,谢谢                                                                                                             
                    
---华软 网友回答---
没有环境,不知道怎么回事。我个人猜测
((CRichEditView*)m_viewList.GetHead())->GetWindowText(m_strFile);
获得的字串末没有加上'\0'
或者是下一句ar.Write(m_strFile, m_strFile.GetLength());没有算上'/0'的长度
/C++ar.Write(m_strFile + '\0', m_strFile.GetLength() + 1);

字串换行要用'\r\n'吧
/C++while(ar.ReadString(strTmp))
{   
    m_strFile += strTmp + _T("\r\n");
}

我也不知道行不行,没有测试,望其他大牛解答
---华软网友回复---
可能是写文件的时候出错了
---华软网友回复---
应该不是这个问题,,呵呵,我觉得是和richviewedit有关。。不过不知道在哪调整:(
---华软网友回复---
引用 3 楼 hustxsh 的回复:
应该不是这个问题,,呵呵,我觉得是和richviewedit有关。。不过不知道在哪调整:(


是的

ar.Write(m_strFile, m_strFile.GetLength());
这条语句之前,,我看m_strFile, length都没问题
写完后就出问题了


---华软网友回复---
引用 4 楼 hustxsh 的回复:
引用 3 楼 hustxsh 的回复:
应该不是这个问题,,呵呵,我觉得是和richviewedit有关。。不过不知道在哪调整:(


是的

ar.Write(m_strFile, m_strFile.GetLength());
这条语句之前,,我看m_strFile, length都没问题
写完后就出问题了


那你在读取 richedit 内容后,先用MessageBox显示一部分,然后,看看显示的是否正常,如果显示的都不正常,那写入文件后肯定也不正常啊。那就从你把字符串显示到 richedit 和从 richedit 读取 的这两个过程中找错误。

而如果从 richedit 获取的字符串,显示时是正常的,那可能就是你写入文件过程中出错了。
---华软网友回复---
引用 5 楼 tandyt 的回复:
引用 4 楼 hustxsh 的回复:
引用 3 楼 hustxsh 的回复:
应该不是这个问题,,呵呵,我觉得是和richviewedit有关。。不过不知道在哪调整:(


是的

ar.Write(m_strFile, m_strFile.GetLength());
这条语句之前,,我看m_strFile, length都没问题
写完后就出问题了


那你在读取 ri……


是啊,保存时候在ar.Write(m_strFile, m_strFile.GetLength()) MessageBox都没什么问题

肯定是写入的时候出错了,还真不知道为什么会出错。
---华软网友回复---
ar.Write(m_strFile.[color=#FF0000]GETBUFFER()/color], m_strFile.GetLength());
or 
ar<<m_strFile

---华软网友回复---
都不行啊,哎,,搞不定。
---华软网友回复---
cstring str;
str = _T("test");
ar.Write(str, m_strFile.GetLength());
我感觉应该是写入的问题,试试看是否这样能保存
---华软网友回复---
引用 9 楼 zyrr159487 的回复:
cstring str;
str = _T("test");
ar.Write(str, m_strFile.GetLength());
我感觉应该是写入的问题,试试看是否这样能保存


直接写都是乱码,,,这是什么原因呢。。
---华软网友回复---
write 的原型是  
void Write(
   const void* lpBuf,//注意这个参数是把一个指针指向的内存区域写入,而你把cstring类型指针赋给它,他会把那个类对象写入,而不是那个类对象里面的字符串.
   UINT nMax 
);
 

---华软网友回复---
引用 11 楼 hdt 的回复:
write 的原型是  
void Write(
  const void* lpBuf,//注意这个参数是把一个指针指向的内存区域写入,而你把cstring类型指针赋给它,他会把那个类对象写入,而不是那个类对象里面的字符串.
  UINT nMax 
);

也不是这个问题。。。还是不行,,,啊。。
会不会是其他地方的问题,比如ar这个对象。
---华软网友回复---
你的项目是unicode ????
---华软网友回复---
引用 11 楼 hdt 的回复:
write 的原型是  
void Write(
  const void* lpBuf,//注意这个参数是把一个指针指向的内存区域写入,而你把cstring类型指针赋给它,他会把那个类对象写入,而不是那个类对象里面的字符串.
  UINT nMax 
);

我也认为是这样的,把字串的缓冲区传进去看看或者
C++">ar.Write("hello", strlen("hello"));

这样看看,如果不行我想可能也是编码问题
---华软网友回复---
引用 13 楼 hdt 的回复:
你的项目是unicode ????


没有使用unicode,呵呵

而且我这样试了下

    if (ar.IsStoring())
{
        char str[10] = "hehe";
        CFile* fp = ar.GetFile();
        fp->SetLength(0);
        fp->SeekToBegin();
        fp->Write(str,5);
        fp->Close();

也是同样的结果。。。。我其实没做什么操作
打开文件,然后就保存了
---华软网友回复---
你看看生成的文件的编码是什么啊
---华软网友回复---
void CNoverReaderDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
ar.Write("hello", strlen("hello"));
}
else
{
// TODO: 在此添加加载代码
}

// 调用基类 CRichEditDoc 将启用
//  容器文档的 COleClientItem 对象的序列化。
// TODO: 如果作为文本进行序列化,则设置 CRichEditDoc::m_bRTF = FALSE
CRichEditDoc::Serialize(ar);
}
这句话帮助很大:
TODO: 如果作为文本进行序列化,则设置 CRichEditDoc::m_bRTF = FALSE

出现乱码后,网上没有人回答,我自己看了下在Doc类的构造函数中加入了
m_bRTF = FALSE
后保存为文本就好了      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。