次の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 を文字列に変換する普遍的な方法はありますか?