c++ - 在 MFC 中序列化为 Unicode 文本文件 - 错误的文件头

标签 c++ serialization unicode mfc byte-order-mark

我正在尝试序列化一个对象列表。对象本身只包含 CString 成员。对文本文件进行序列化以创建人类可读的日志文件。 问题是为了编写 Unicode 字符串,文件需要具有用于 Unicode 编码的 BOM(字节顺序标记)。

FILE *fStream = NULL;

VERIFY( _tfopen_s( &fStream, _T( "D:\\Test.txt" ), _T( "wt,ccs=UNICODE" ) ) == 0 );

CStdioFile theFile;

theFile.m_pStream = fStream;

CArchive archive( &theFile, CArchive::store );

ListContainingObject.Serialize( archive );

Serialize() 中,我尝试写入元素的数量,以便使用列表的大小调用 CArchive::WriteCount()。 这会弄乱 BOM,如果文件是在记事本中打开的,例如, - 符号显示在文件的开头。

在 HEX 查看器中,文件头如下所示:ff fe 06 00。 我知道 06 是我写的列表的容量。我也知道 - 的 ASCII 值可能是 ff fe 06 00 问题是:

有什么方法可以让我在文件的开头写下一个整数,而不用字节顺序标记把它弄乱,这样文本编辑器中就不会显示任何符号了吗?

最佳答案

哦,这一切都将变得一团糟。如果您序列化 CString 对象,它们也会像列表一样写入长度计数。

如果您只有一个字符串列表,则使用 wsprintf() 或 CString::Format() 将计数转换为字符串...将计数写为字符串并以换行符 ("\n").将所有剩余的字符串写成以换行符结尾的字符串。如果您的字符串中有换行符,那么您将不得不以某种方式将其转义。您可以将数据放入某种 XML 格式。您有很多选择。

关于c++ - 在 MFC 中序列化为 Unicode 文本文件 - 错误的文件头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33654384/

相关文章:

c++ - C++11 类型检查代码的奇怪编译器警告

c++ - `using namespace std::literals` 安全吗?

c++ - C++ 语言定义对 static 关键字的范围有什么看法?

go - 在 Go 中使用外部 API 后使用 REST 客户端保存数据

python - 有没有办法用 Python 原生解决方案替换 Django 的 smart_str?

python - PyPE ansi 还是 unicode?

c++ - VS 2017 命令行错误 D8004

c - C 缓冲区内的可变长度数据类型

c# - 如何在 XmlTextWriter 中设置 Settings 属性,以便我可以将每个 XML 属性写在自己的行中?

node.js - 如何在 NodeJS 中使用 PDFKit 呈现 unicode 符号?