我正在使用Boost C++库在一个程序中实现序列化,该程序是为Windows(使用Visual Studio 2008)和Mac(使用GCC)构建的。该程序在大约30个类中使用宽字符串(
在Windows下保存:
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***!*** ...
其中 * 是空字符。
当我尝试使用 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 智能指针,这些类反过来又被序列化。