额。。在仿照win7记事本做一个差不多的记事本。在读取文本文件时出问题了。。如果只有英文的话读取没问题,如果有中文就乱码了。我知道是编码方式的问题,但是不知道该怎么解决。。求教
这是打开文件的代码:void CTextEditorView::OnFileOpen() 
{
CEdit& m_edit = GetEditCtrl();
isModified = m_edit.GetModify();
CString string;
int Choice;
m_edit.GetWindowText(string);
if(isNew && string.IsEmpty());
else if(isModified)
{
Choice = MessageBox(_T("是否将更改保存到 "+CurPath+"?"),_T("记事本"),
MB_YESNO|MB_ICONQUESTION);
if(Choice==IDYES)OnFileSave();
}
CString strText=_T("");
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
_T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"),AfxGetMainWnd());
if(dlg.DoModal() == IDOK)
{
CurPath=dlg.GetPathName();
CFile file(CurPath,CFile::modeReadWrite);
char read[50000];
memset(read,0,sizeof(read));
file.Read(read,file.GetLength());
for(unsigned i=0;i<file.GetLength();i++)
strText += read[i];
file.Close();
m_edit.SetFont(&font);
m_edit.SetWindowTextW(strText);
m_edit.SetModify(FALSE);
isNew=FALSE;
}
}还有一个问题就是,怎么更改ceditview文本输入界面的字体,那字体真心不太好额,貌似还加粗了MFC乱码

解决方案 »

  1.   

    char read[50000];
    memset(read,0,sizeof(read));--- 用wchar数组
      

  2.   

    “在读取文本文件时”
    要知道 编码是 什么:
    查文件头几个字节:/*
    EF BB BF    UTF-8  
    FE FF     UTF-16/UCS-2, little endian  
    FF FE     UTF-16/UCS-2, big endian  
    FF FE 00 00  UTF-32/UCS-4, little endian.  
    00 00 FE FF  UTF-32/UCS-4, big-endian.
    */
      

  3.   


    void CEditStringDoc::Serialize(CArchive& ar)
    {
    BOOL    FirstLine=TRUE;
    WCHAR   wBuf[2048];
    char    szBuf[2048];
    int     i=0;
    BOOL    LineEnd=FALSE;
    char    type[10];
    char    dummy[10];
    char    *pLine=0;
    char    UniHead[4]={(char)0xEF,(char)0xBB,(char)0xBF,(char)0};
    char    UtfHead[3]={(char)0xFF,(char)0xFE,(char)0};
    /*
    EF BB BF    UTF-8  
    FE FF     UTF-16/UCS-2, little endian  
    FF FE     UTF-16/UCS-2, big endian  
    FF FE 00 00  UTF-32/UCS-4, little endian.  
    00 00 FE FF  UTF-32/UCS-4, big-endian.
    */
    CFile *pFile=ar.GetFile();
    CString name=pFile->GetFileTitle();//
    if((name.Find(".htm")==-1) && (name.Find(".txt")==-1))
    {
    AfxMessageBox("Only suports *.htm or *.txt files!");
    return;
    }
    //
    memset(type,0,10);
    memset(dummy,0,10);
    //
    if (ar.IsStoring())
    {
    // TODO: add storing code here
    int all=m_TextArray.GetSize();
    for (int kk=0;kk<all;kk++)
    {
    strcpy(szBuf,m_TextArray[kk].GetBuffer(2048));
    strcat(szBuf,"\r\n");
    if(FirstLine)
    {
    if (m_UTF8) ar.Write(UniHead,3);
    else if (m_UNICODE) ar.Write(UtfHead,2);
    }// end 1st line
    if(m_UTF8)
    {
    MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
    WideCharToMultiByte(CP_UTF8,0,wBuf,-1,szBuf,2048,0,0);
    ar.Write(szBuf,strlen(szBuf));
    }
    if(m_UNICODE)
    {
    MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
    ar.Write(wBuf,2*wcslen(wBuf));
    }
    else
    {
    ar.Write(szBuf,strlen(szBuf));
    }
    FirstLine=FALSE;
    }// end for
    }// end save
    else
    {// if UTF8 file the 1st 3 chars are: EFh,BBh,BFh
     // if UNICODE file the 1st 2 chars are :FFh,FEh
     // TODO: add loading code here
    m_TextArray.RemoveAll();
    memset(szBuf,0,sizeof(szBuf));
    while(ar.Read(&szBuf[i],1))
    {//
    if(FirstLine)
    {
    if( (szBuf[0]!=(char)0xEF) && 
    (szBuf[0]!=(char)0xBB) &&
    (szBuf[0]!=(char)0xBF) &&
    (szBuf[0]!=(char)0xFF) &&
    (szBuf[0]!=(char)0xFE) )
    {// normal file
    m_UTF8=FALSE;
    m_UNICODE=FALSE;
    FirstLine=FALSE;
    i++;
    continue;
    }
    if( szBuf[0]==(char)0xEF)
    {
    type[0]=szBuf[0];
    continue;
    }
    if( szBuf[0]==(char)0xBB)
    {
    type[1]=szBuf[0];
    continue;
    }
    if( szBuf[0]==(char)0xBF)
    {
    type[2]=szBuf[0];
    }
    // Is UTF8 file ?
    if( (type[0]==(char)0xEF) && 
    (type[1]==(char)0xBB) &&
    (type[2]==(char)0xBF)  )
    {// UTF8 file
    m_UTF8=TRUE;
    m_UNICODE=FALSE;
    FirstLine=FALSE;
    continue;//i=0
    }
    // Is UNICODE file ?
    if( szBuf[0]==(char)0xFF)
    {
    type[0]=szBuf[0]; 
    continue;
    }
    if( szBuf[0]==(char)0xFE)
    {
    type[1]=szBuf[0];
    }
    if( (type[0]==(char)0xFF) && 
    (type[1]==(char)0xFE) )
    {
    m_UNICODE=TRUE;
    m_UTF8=FALSE;
    FirstLine=FALSE;
    continue;//i=0
    }
    }// end firstline
    // check line end
    if(szBuf[i]==0x0D)
    {// 
    LineEnd=TRUE;
    szBuf[i]=0;
    ar.Read(dummy,1);//00 or 0a 
    if(m_UNICODE)
    {
    szBuf[i+1]=0;
    ar.Read(dummy,2);//0a 00
    }
    }
    //
    if(LineEnd)
    {
    if(m_UTF8)
    {// utf8 file
    MultiByteToWideChar(CP_UTF8,0,szBuf,-1,wBuf,2048);
    WideCharToMultiByte(CP_ACP,0,wBuf,-1,szBuf,2048,0,0);
    pLine=szBuf;
    }
    else if(m_UNICODE)
    {// Unicode file
    WideCharToMultiByte(CP_ACP,0,(WCHAR *)szBuf,-1,(char *)wBuf,2048,0,0);
    pLine=(char *)wBuf;
    }
    else
    {// normal file
    pLine=szBuf;
    }
    LineEnd=FALSE;// new line
    i=-1;// +1=0 szBuf[0]
    //add 
    m_TextArray.Add(pLine);
    memset(szBuf,0,sizeof(szBuf));
    }// end LineEnd
    i++;//from 0
    }// end while
    // if file end but no LF
    if(szBuf[0]!=0) m_TextArray.Add(szBuf);// last line  
    if(m_TextArray.GetSize()!=0)
    {
    UpdateAllViews(0);
    }
    }
    }
      

  4.   

    上面代码 是 VC6 mbcs
      

  5.   

    谢谢。。那个m_TextArray是不是CString类型的?
      

  6.   

    谢谢哈!不过貌似在vs2012中有问题。。m_TextArray没有add函数,UpdateAllViews(0);这个也没有定义,我用的是vs2012