メモの日々


2023年06月24日(土) [長年日記]

[c++][windows] VC++でstd::filesystem::filesystem_errorのエラーメッセージを英語にする

次のコードをVC++でコンパイルして実行すると、エラーメッセージが日本語で出力される。

#include <filesystem>
#include <iostream>

int main()
{
    try {
        std::filesystem::copy_file("あ.txt", "ああ.txt");
    } catch (const std::filesystem::filesystem_error& e) {
        std::cout << e.what() << std::endl;
    }
}
copy_file: 指定されたファイルが見つかりません。: "あ.txt", "ああ.txt"

これを英語で出力されるようにするにはどうしたらいいのか?(OSの言語設定は日本語のままで)

    std::setlocale(LC_ALL, "C");

を追加したらいいかなと思ったけど、こうしてもメッセージは日本語のままだった。

おまけ:FormatMessage関数のdwLanguageId引数=0で実装されているため、SetThreadUILanguage関数でスレッドのLANGIDを事前に変更しておく案もある。シングルスレッドプログラムならこれでもいいか...

とあるのを発見し、これを試すと英語メッセージに変わった。こうするしかない?

#include <filesystem>
#include <iostream>
#include <windows.h>

int main()
{
	SetThreadUILanguage(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
	try {
		std::filesystem::copy_file("あ.txt", "ああ.txt");
	} catch (const std::filesystem::filesystem_error& e) {
		std::cout << e.what() << std::endl;
	}
}
copy_file: The system cannot find the file specified.: "あ.txt", "ああ.txt"