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