我正在为 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 native 使用每个宽字符 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 智能指针,这些类依次被序列化。
最佳答案
wofstream
是typedef basic_ofstream<wchar_t, char_traits<wchar_t> > wofstream;
在 Linux 上,您需要声明一个自定义 ofstream
处理 16 位字符(在 Linux 上)。
这可以按如下方式完成:
typedef std::uint16_t Char16_t;
typedef basic_ofstream<Char16_t, char_traits<Char16_t> > wofstream_16;
现在wofstream_16
可以在不同平台上无缝使用以处理 16 位宽的字符。
关于c++ - Boost C++ 跨平台 (Windows & Mac) std::wstring 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8481348/