void CREditView::LoadFile(CString strFile)
{
SetWindowText(_T(""));
CRichEditCtrl &RCtrl = GetRichEditCtrl(); CFile* pInputFile = NULL;
try
{
pInputFile = new CFile(strFile, CFile::modeRead | CFile::shareDenyNone);

EDITSTREAM strm;
strm.dwCookie = (DWORD) pInputFile;
strm.pfnCallback = EditStreamCallbackReadFromFile;

long lResult = RCtrl.StreamIn(SF_TEXT, strm);

pInputFile->Close();
}
catch (CFileException* pEx)
{
pEx->Delete();
}
delete pInputFile;

RCtrl.SetModify(FALSE);
return;
}
 DWORD CALLBACK EditStreamCallbackReadFromFile(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CFile* pFile = (CFile*) dwCookie;
ASSERT_KINDOF(CFile, pFile); *pcb = pFile->Read(pbBuff, cb); return 0;
}问题描述:
       CRichEditCtrl的StreamIn方法是从指定的输入流中获得的文本来替换CRichEditCtrl对象中的文本。这个LoadFile函数可以从指定的文件名来读取文本到RichEdit中,当文本文件为Ansi编码时,无乱码。当为Unicode、UTF-8编码时,会出现乱码。我知道要根据文件内部编码头几个字节来判断,但是对于上面的代码不知该如何修改

解决方案 »

  1.   

    Unicode开头是:0xFF, 0xFE
    UTF开头是:0xEF, 0xBB, 0xBF
      

  2.   

    DWORD CALLBACK EditStreamCallbackReadFromFile(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
    {
        CFile* pFile = (CFile*) dwCookie;
        ASSERT_KINDOF(CFile, pFile);    *pcb = pFile->Read(pbBuff, cb);    return 0;
    }
    判断头 在这边吗 ?
      

  3.   

    俺不会用,所以一直使用fread,其实都一样吧。
      

  4.   

    怎么这么多人问编码格式啊。运行时的环境只能是UNICODE或ansi编码的一种,你用的是ansi,文件里面是什么编码就很难说了,可能是UNICODE,GB2312,也可能是UTF8(很多html文件喜欢用UTF8),UNICODE还分LE BE两种编码方式,文件开头还可能有签名。所以,直接读到内存里面以某种编码显示肯定不行,兼容性很差。最好的办法是用IMultiLanguage2进行检测,IE自动检测编码的功能,就是这么做的,分析出编码的格式来,进行编码转换后再显示。iconv可能也有类似功能。
      

  5.   

    读到内存2个或者3个字节,就可以判断是否是UTF8
      

  6.   

    我再好好自己弄弄吧·· 谢谢各位了。。
    以下是可以自动判断文本文件编码的工程http://blog.csdn.net/akof1314/archive/2011/01/02/6113038.aspx