Windows の UTF-8

残念ながら、Unicode を Windows の現在のコードページにする方法はありません。 CP_UTF7CP_UTF8 定数は疑似コードページであり、Ben が言及したように、MultiByteToWideChar および WideCharToMultiByte 変換関数でのみ使用されます。

あなたの問題は、fstream C++ クラスの問題に似ています。 fstream コンストラクターは char* のみを受け入れます 真の Unicode 名を持つファイルを開くことができなくなります。 VC が提供する唯一の解決策はハックでした。ファイルを個別に開き、ハンドルをストリーム オブジェクトに設定します。残念ながら、サードパーティのライブラリはハンドルを受け入れない可能性があるため、もちろんこれはオプションではありません。

私が考えられる唯一の解決策は、オリジナルにハードリンクされた非 Unicode 名の一時ファイルを作成し、それをパラメーターとして使用することです。


すべての Windows API は UTF-16 で考えられるため、境界で変換するライブラリのラッパーを作成することをお勧めします。

奇妙なことに、Windows は UTF-8 を変換用のコードページと見なすため、コードページ間の変換と同じ API を使用します。

std::wstring Utf8ToUtf16(const char* u8string)
{
    int wcharcount = strlen(u8string);
    wchar_t *tempWstr = new wchar_t[wcharcount];
    MultiByteToWideChar(CP_UTF8, 0, u8string, -1, tempWstr, wcharcount);
    wstring w(tempWstr);
    delete [] tempWstr;
    return w;
}

そして、元に戻すための同様の形式の何か。


2018 更新:Windows 10 は、2 つの手順で "65001" コード ページを "疑似" から削除しました:

<オール>
  • conhost 変更点:Linux 用 Windows サブシステムは、コンソールにコード ページ 65001 を使用します。 chcp 65001 を実行することも可能です cmd.exe で WSL以来。 (これにより、かなりばかげた Python バグが発生しました。)
  • フル機能のロケール:ビルド 17035 以降の Windows では、ロケール コードページとして UTF-8 を設定できます。これは 2018 年 4 月の更新で利用可能になります。