我程序是使用VC2008开发的默认的是Unicode的。
读取txt文件如果是Unicode的话就不会乱码。
但是读取UTF-8或者ANSI的都会乱码...
这种问题怎么解决?是不是要转编码。
还是写两种读取的代码。如果文件是Unicode就用Unicode的读。如果是ANSI的就用ANSI的标准读

解决方案 »

  1.   

    没错, 如果文件编码不同要用不同的ReadFile ,  ReadFileW 或者ReadFileA, 项目的编码可以不用改
      

  2.   

    你把TEXT确定为一种编码保存格式格式。
      

  3.   

    通常
    读取文件的方式无需区分
    读取后,
    1、解析BOM,就是文件数据的前2-3个字节,确定文本编码类型:ansi,utf-8,unicode(big or little)
    2、根据需要对于文本数据进行编码转换后再使用
      

  4.   

    用IsTextUnicode来判断下,尽管这个方法也不太准确
      

  5.   

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

  6.   

    最简单的解决方法,自己建一个TXT文本,用UE打开看看,就会发现UTF-8前面多了两个字节,读入时把那两个字节去掉就OK了,
      

  7.   

    如下为一个csv类的初始化代码,其中包含了对于文本类型的判断,供参考
    注意,其默认目标编码为ansi(GBK)BOOL CCSVHlpr::DoInit(LPCTSTR pszFileName,int iField)
    {
    CFile f;
    if(!f.Open(pszFileName,CFile::modeRead)) 
    {
    _tcscpy(m_szLastError,_T("文件打开错误。"));
    return FALSE;
    }
    int n = f.GetLength();
    if(n > MAX_CSV_LEN)
    {
    f.Close();
    _stprintf(m_szLastError,_T("文件太大,超过%d 字节。"),MAX_CSV_LEN);
    return FALSE;
    }
    m_pszData = new char[n+2];
    if(m_pszData == NULL)
    {
    f.Close();
    _tcscpy(m_szLastError,_T("内存不足(文件太大?)。"));
    return FALSE;
    }
    ZeroMemory(m_pszData,n+2);
    f.ReadHuge(m_pszData,n);
    f.Close();
    BYTE *p=(BYTE *)m_pszData;
    if(p[0] == 0xEF && p[1] == 0xBB && p[2] == 0xBF) 
    {
    //UTF-8
    strcpy(m_pszData,m_pszData+3);
    CCPConvert::UTF82Ansi(m_pszData);
    }
    else if((p[0] == 0xFF && p[1] == 0xFE) || (p[0] == 0xFE && p[1] == 0xFF))
    {
    //--UNICODE --XX00XX00--Litle Endian
    //--UNICODE --00XX00XX--Big Endian
    WCHAR *pw = (WCHAR *)m_pszData;
    char *psz = new char[n+2];
    memset(psz,'\0',n+2);
    CCPConvert::Unicode2Ansi(pw+1,psz);
    strcpy(m_pszData,psz);
    delete psz;
    }
    m_pszCur = m_pszData;
    //-- pars fields
    //char *b=m_pszData; return TRUE;}
      

  8.   

    我正好也在做这个,VS2008里面的属性里面的只支持Unicode,你把它改为未设置。