わかりました、私はこれを持っています:
AllocConsole();
SetConsoleOutputCP(CP_UTF8);
HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
WriteConsoleA(consoleHandle, "aΕλληνικά\n", 10, NULL, NULL);
WriteConsoleW(consoleHandle, L"wΕλληνικά\n", 10, NULL, NULL);
printf("aΕλληνικά\n");
wprintf(L"wΕλληνικά\n");
さて、問題は、エンコーディング ファイルによっては、これらの作品の一部のみが保存されたということです。wprintf は機能しませんが、その理由は既にわかっています (狭い文字しか受け付けない Microsoft stdout の実装が壊れています)。それでも、私は他の3つに問題があります。ファイルを署名 (BOM) なしで UTF-8 として保存し、MS Visual C++ コンパイラを使用すると、最後の printf のみが機能します。ANSI バージョンを機能させたい場合は、文字数 (?) を 18 に増やす必要があります。
WriteConsoleA(consoleHandle, "aΕλληνικά\n", 18, NULL, NULL);
文字列は UTF-8 バイト シーケンスとして保存されるため、WriteConsoleW は機能しないと思いますUTF-8。
BOM を使用して UTF-8 で保存すると (当然のことですが)、WriteConsoleW が何らかの形で機能し始め (???)、他のすべてが停止します (文字の代わりに ? が表示されます)。同じフォーマットを維持するには、WriteConsoleA の文字数を 10 に減らす必要があります (そうしないと、8 つの追加の四角形が得られます)。基本的に、WTF?
では、UTF-16 (Unicode - コードページ 1200) に行きましょう。WriteConsoleW のみで動作します。フォーマットを正確に保つには、WriteConsoleA の文字数を 10 にする必要があります。
UTF-16 ビッグ エンディアン モード (Unicode - コードページ 1201) で保存しても、何も変わりません。繰り返しますが、何ですか?ファイルに保存するときに、文字列内のバイト順を逆にするべきではありませんか?
結論として、文字列をバイナリ形式にコンパイルする方法は、使用するエンコーディングによって異なります。したがって、文字列を格納するためのポータブルでコンパイラに依存しない方法は何ですか? コンパイル前にある文字列表現を別の文字列表現に変換するプリプロセッサがあるので、ファイルを UTF-8 で保存し、UTF-16 で必要な文字列のみをマクロでラップして前処理することができます。