potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C++20&Win API ファイルにUTF-16文字列を出力する

ファイルにUTF-16文字列(std::wstring_viewが対応するデータ)を出力するにはstd::ofstreamをバイナリモードで使用します。次のようなコードを準備しておくと便利だと思います。

#include <fstream>
#include <filesystem>

// UTF-16文字列を指定されたパスへ出力します。BOMは付加しません。
void write_utf16(std::filesystem::path path, std::wstring_view s)
{
    std::ofstream fout(path, std::ios::binary);
    fout.write(std::bit_cast<const char*>(s.data()), s.size() * sizeof(wchar_t));
    fout.flush();
}

std::wofstreamstd::codecvtを組み合わせても出力できるようですが、std::codecvtC++17で非推奨(参考:cpprefjp)なことに注意してください。std::codecvtが未指定の場合、出力時にUTF-16からマルチバイト文字列へ強制変換されます。writeの代わりに<<演算子も使えますが、長さを指定できるのはwriteです。