RT
txt文档编码格式为UTF8,以前只做过ANSI的,谁有这方面的例子或者链接告诉我一下呗
谢谢

解决方案 »

  1.   

    参考:// CEditStringDoc serialization
    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);
    }
    }
    }
      

  2.   

    CFile file(L"C:\\utf8.txt",CFile::modeRead);
    char *pBuf=new char[file.GetLength()+1];
    file.Read(pBuf,file.GetLength());//读文件到字符串
    pBuf[file.GetLength()]=0;//最后一位0结束
    CString strTxt=CA2W(pBuf,CP_UTF8); 
      

  3.   

    http://www.codeproject.com/Articles/4119/CStdioFile-derived-class-for-multibyte-and-Unicode
      

  4.   

    fopen_s(&fp, "XXX.txt", "rw, ccs=UTF-8"); 
      

  5.   

    或者干脆二进制读写,自写BOM
      

  6.   

    这里就是个字符编码问题。
    将UTF8的Buffer转化一下就可以了