Я реализую сериализацию с использованием библиотек Boost C ++ в программе, созданной для Windows (с использованием Visual Studio 2008) и Mac (с использованием GCC). Программа использует широкие строки ( std :: wstring
) примерно в 30 своих классах. В зависимости от платформы, когда я сохраняю в файл (с помощью 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.
Когда я пытаюсь прочитать файл, созданный в Windows с помощью сборки Mac (и наоборот), моя программа дает сбой.
Насколько я понимаю, 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
содержит широкие строки и повысить интеллектуальные указатели на другие классы, которые, в свою очередь, сериализованы.