2 に答える
まず、Windows のコンソールに UTF-8 テキストを出力する方法がまったくないように思われることから始めましょうcout
(Visual Studio でコンパイルすると仮定します)。ただし、テストでできることは、Win32 API fn を介して UTF-8 テキストを出力することですWriteConsoleA
。
if(!SetConsoleOutputCP(CP_UTF8)) { // 65001
cerr << "Failed to set console output mode!\n";
return 1;
}
HANDLE const consout = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD nNumberOfCharsWritten;
const char* utf8 = "Umlaut AE = \xC3\x84 / ue = \xC3\xBC \n";
if(!WriteConsoleA(consout, utf8, strlen(utf8), &nNumberOfCharsWritten, NULL)) {
DWORD const err = GetLastError();
cerr << "WriteConsole failed with << " << err << "!\n";
return 1;
}
Umlaut AE = Ä / ue = ü
コンソール (cmd.exe) で Lucida Console フォントを使用するように設定した場合は、次のように出力
されます。
あなたの質問については(あなたのコメントから取られた)
win23 API で変換された文字列は、生の UTF8 (Linux) 文字列と同じです
はいと言います: Unicode 文字シーケンスを考えると、WideCharToMultiByte
関数を介して UTF-8 (char) 表現に変換された UTF-16 (Windows wchar_t) 表現は、常に同じバイト シーケンスを生成します。
文字列を UTF 16 に変換すると、それは 16 バイト幅の文字であり、16 バイト値ではないため、ASCII 値と比較することはできません。それらを変換して比較するか、特殊な比較を ASCII 関数に書き込む必要があります。
UTF8 UTF-8エンコーディング形式は128未満のコードポイントのASCIIとバイナリ互換であるため、LinuxのUTF8 coutが通常のASCII値でない限り、同じ正しい出力を生成するとは思えません.UTF16は同様の方法でUTF8の後に来ると思います. .
幸いなことに、これらの文字列を別の文字セットに変換するために作成された多くのコンバーターが存在します。