0

次のAPIを使用してwstringを文字列にエンコードしていますが、

string utf8_encode(const std::wstring &wstr) 
{ 
    int len = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, 0, 0, 0, 0);
    vector<char> buf(len);
    WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &buf[0], len, 0, 0);
    return std::string(buf.begin(), buf.end());
}

このエンコーディングは、Windows マシンでシステム ロケールが

英語。

これを日本語の Windows で使おうとすると、変換された文字列が壊れてしまいます。私が理解したのは、日本語のウィンドウは Shift-JIS エンコーディングを使用しているということです。コード ページを引数として受け取るように API を変更すると、機能します。

string utf8_encode(const std::wstring &wstr)
{
    UINT codePage = GetACP();
    int len = WideCharToMultiByte(codePage, 0, wstr.c_str(), -1, 0, 0, 0, 0);
    vector<char> buf(len);
    WideCharToMultiByte(codePage, 0, wstr.c_str(), -1, &buf[0], len, 0, 0);
    return std::string(buf.begin(), buf.end());
}

しかし、デフォルトのシステム ロケールが英語の Windows マシンで日本語または中国語の文字を使用すると、再び失敗します。基本的に CP_UTF8 を使用して変換する必要があります。次のコード ページをサポートする必要がある場合はどうすればよいですか?

http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx

すべての可能なエンコーディングを考慮して wstring を文字列に変換する普遍的な方法はありますか?

4

1 に答える 1

1

いいえ。多くのエンコーディングは、文字セットstd::stringのサブセットのみをカバーしています。wstringたとえば、ISO-8859-1と Unicode の一般的な選択は、ほとんどの値に同等のものwchar_tがないことを意味します。charたとえば、ISO-8859-1 には「サ」がありません。

于 2013-03-08T07:39:29.280 に答える