C++ CStdioFile读取文件时编码出现问题

C++ CStdioFile读取文件时编码出现问题,c++,visual-c++,unicode,file-io,mfc,C++,Visual C++,Unicode,File Io,Mfc,我无法使用CStdioFile正确读取文件 我打开notepad.exe,键入aè236;òùèèèèèèèèèèèèèèèèèèèèè 然后我尝试用下面的代码块从MFC读取它 BOOL ReadAllFileContent(const CString &FilePath, CString *fileContent) { CString sLine; BOOL isSuccess = false; CStdioFile input; isSuccess

我无法使用CStdioFile正确读取文件

我打开notepad.exe,键入
aè236;òùèèèèèèèèèèèèèèèèèèèèè

然后我尝试用下面的代码块从MFC读取它

BOOL ReadAllFileContent(const CString &FilePath, CString *fileContent)
{
    CString sLine;
    BOOL isSuccess = false;

    CStdioFile input;
    isSuccess = input.Open(FilePath, CFile::modeRead);
    if (isSuccess) {
        while (input.ReadString(sLine)) {
            fileContent->Append(sLine);
        }
        input.Close();
    }
    return isSuccess;
}
当我调用它时,使用ANSI文件我得到了预期的结果 但当我试图读取UTF8编码的文件时,我得到了

我希望我的函数能够处理所有文件,而不考虑编码

为什么我需要实施

。编辑。

  • 不幸的是,在真正的应用程序中,文件来自外部应用程序,因此无法更改文件编码。我必须能够读取UTF-8和CP-1252文件
  • 任何文件都是有效的
    ANSI
    ,记事本告诉我们的
    ANSI
    实际上是
    Windows-1252
    encode
  • 根据提供的示例,我找到了正确阅读
    UTF-8
    CP-1252
    的方法。虽然它工作,我需要通过文件编码,我不知道提前

Thnks

我个人使用此处广告中的类:

它非常支持读取和写入各种编码的文本文件,包括各种风格的unicode


我对它没有任何问题。

几年前,我记得MFC
CStdioFile
是有限的,不能很好地使用Unicode。我在CodeProject上找到了更好的替代品:。你可能想看看它;它在几个项目中运行良好。我不知道更现代的MFC版本是否改进了
CStdioFile
“我希望我的函数能够处理所有文件,而不管编码是什么。”——由于纯文本文件格式的限制,这样的函数根本不可能实现,因为纯文本文件格式没有提供定义编码的标准方法。如果幸运的话,该文件以Unicode BOM开头,但对于ANSI文件,则运气不佳。您可以假设操作系统定义的“非Unicode程序的当前代码页”,或者让用户显式输入代码页。我相信这可能是处理Unicode文件的最佳方法,但我希望尽可能避免使用外部库。它是一个源文件和头文件。不是图书馆。回顾来源,了解他们是如何做到的。否则,你基本上是在重新发明轮子。我已经测试这个库好几天了,但不幸的是,CTextFileDocument没有自动检测编码那么好。若文件并没有BOM表,它将始终检测为ASCII。尽管自动检测能力很差(请参见
ReadDOM()
),但在我看来,它是一个很好的包装类,它简化了大量编码工作,但它并不能解决我的问题。