Написание файла UTF16 с помощью std::fstream

Можно ли наполнить поток std:: fstream, чтобы поток std:: string, содержащий кодировку UTF-8, мог передаваться в файл UTF-16?

Я попробовал следующее, используя фасет utf8-to-utf16, но файл результата по-прежнему UTF-8:

std::fstream utf16_stream("test.txt", std::ios_base::trunc | std::ios_base::out);
utf16_stream.imbue(std::locale(std::locale(), new codecvt_utf8_utf16<wchar_t, 
                               std::codecvt_mode(std::generate_header | std::little_endian)>);

std::string utf8_string = "\x54\\xE2\x83\xac\x73\x74";

utf16_stream << utf8_string;

Ссылки на фасет codecvt_utf8_utf16, по-видимому, указывают на то, что его можно использовать для чтения и записи файлов UTF-8, а не UTF-16 - это правильно, и если да, то есть ли простой способ сделать то, что я хочу сделать?

1 ответ

Решение

Файловые потоки (в соответствии с требованиями std::basic_filebuf§22.4.1.4.2[locale.codecvt.virtuals]/3) не поддерживают преобразования кодировки символов N:M, как в случае с внутренним UTF8 / внешним UTF16.

Вам нужно будет создать строку UTF-16, например, с помощью wstring_convert, переосмыслить ее как последовательность байтов и вывести ее, используя обычный (неконвертирующий) std::ofstream,

Или, в качестве альтернативы, сначала преобразуйте UTF-8 в широкий, а затем используйте std::codecvt_utf16, который создает UTF-16 в виде последовательности байтов и, следовательно, может использоваться с файловыми потоками.

Другие вопросы по тегам