【发布时间】:2018-07-16 18:37:20
【问题描述】:
我无法使用 CStdioFile 正确读取文件。
我打开notepad.exe,输入àèìòùáéíóú并保存两次,一次将编码设置为ANSI(真的是CP-1252),其他设置为UTF-8。
然后我尝试使用以下代码块从 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 编码文件时,我得到了à èìòùáéÃóú
我希望我的函数适用于所有文件,无论编码如何。
为什么我需要实施?
.EDIT.
- 很遗憾,在实际应用中,文件来自外部应用,因此无法更改文件编码。我必须能够同时读取 UTF-8 和 CP-1252 文件。
- 任何文件都是有效的
ANSI,记事本告诉ANSI实际上是Windows-1252编码。 - 根据here 提供的示例,我找到了一种阅读
UTF-8和CP-1252的方法。虽然可行,但我需要传递我事先不知道的文件编码。
谢谢!
【问题讨论】:
-
几年前,我记得 MFC
CStdioFile是有限的,不能很好地与 Unicode 配合使用。我在 CodeProject 上找到了更好的替代品:CStdioFileEx。你可能想看看它;它在几个项目中运行良好。我不知道更现代的 MFC 版本是否改进了CStdioFile。 -
“我希望我的函数适用于所有文件,无论编码如何。” -- 由于纯文本文件格式的限制,这样的函数根本不可能,它不提供定义编码的标准方法。如果幸运的话,该文件以 Unicode BOM 开头,但对于 ANSI 文件,您就不走运了。您可以假设操作系统定义的“非 Unicode 程序的当前代码页”,或者让用户明确输入代码页。
标签: c++ visual-c++ unicode file-io mfc