26

C WindowsプログラムでコードページをUTF-8に設定するにはどうすればよいですか?

fopenを使用してファイルを開くサードパーティのライブラリがあります。wcstombsを使用して、Unicodeファイル名を現在のコードページに変換できますが、ユーザーがコードページの外に文字を含むファイル名を持っている場合、これは機能しません。

理想的には、_setmbcp(65001)を呼び出してコードページをUTF-8に設定しますが、_setmbcpのMSDNドキュメントには、UTF-8はサポートされていないと記載されています。

どうすればこれを回避できますか?

4

4 に答える 4

26

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

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

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

于 2008-10-03T14:32:08.643 に答える
11

すべてのWindowsAPIは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;
}

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

于 2008-10-03T13:42:05.143 に答える
-2

cygwin (デフォルトで UTF-8 ロケールを提供) を使用するか、必要な UTF-8 から UTF-16 への変換を行い、非標準_wfopenなどの関数をラップする Windows 用の独自の libc hack を作成します。

于 2011-01-06T18:26:14.860 に答える