我正在为 Windows(使用 Visual Studio 2008)和 Mac(使用 GCC)构建的程序中使用 Boost C++ 库实现序列化。该程序在其大约 30 个类中使用宽字符串 ( std::wstring
)。根据平台,当我保存到文件时(通过boost::archive::text_woarchive
),宽字符串在输出文件中的表示方式不同。
在Windows下保存:
H*e*l*l*o* *W*o*r*l*d*!* ...
在MacOSX下保存:
H***e***l***l***o*** ***W***o***r***l***d***!*** ...
其中 * 是一个 NULL 字符。
当我尝试使用 Mac 版本读取在 Windows 下创建的文件时(反之亦然),我的程序崩溃了。
到目前为止,据我了解,Windows 本身每个宽字符使用 2 个字节,而 MacOSX(我认为一般是 Unix)使用 4 个字节。
我遇到了可能的解决方案,例如utf8_codecvt_facet.cpp
UTF8 -CPP、ICU和Dinkumware,但我还没有看到一个可以与我已有的解决方案一起工作的示例(例如,我不希望在这点):
std::wofstream ofs( "myOutputFile" );
boost::archive::text_woarchive oa( ... );
//... what do I put here? ...
oa << myMainClass;
myMainClass
包含宽字符串和指向其他类的 Boost 智能指针,这些类反过来会被序列化。