UTF-8 でエンコードされたテキストを受け取り、それを MFC コントロールに表示する必要があるアプリケーションに取り組んでいます。アプリケーションはマルチバイト文字セット (MBCS) を使用して構築されており、これは変更できないと仮定しましょう。
SetWindowTextW
UTF-8 から受け取ったテキストをワイド char 文字列に変換すると、メソッドを使用して正しく表示できることを期待していました。これを試すために、ファイルから入力を読み取り、コントロールのテキストを設定するおもちゃのアプリを使用しました。
std::wstring utf8_decode(const std::string &str)
{
if (str.empty()) return std::wstring();
int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
std::wstring wstrTo(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
return wstrTo;
}
BOOL CAboutDlg::OnInitDialog()
{
std::vector<std::string> texts;
texts.resize(6);
std::fstream f("D:\\code\\sample-utf8.txt", std::ios::in);
for (size_t i=0;i<6;++i)
std::getline(f, texts[i]);
::SetWindowTextW(GetDlgItem(IDC_BUTTON1)->m_hWnd, utf8_decode(texts[0]).c_str());
::SetWindowTextW(GetDlgItem(IDC_BUTTON2)->m_hWnd, utf8_decode(texts[1]).c_str());
::SetWindowTextW(GetDlgItem(IDC_BUTTON3)->m_hWnd, utf8_decode(texts[2]).c_str());
::SetWindowTextW(GetDlgItem(IDC_BUTTON4)->m_hWnd, utf8_decode(texts[3]).c_str());
::SetWindowTextW(GetDlgItem(IDC_BUTTON5)->m_hWnd, utf8_decode(texts[4]).c_str());
::SetWindowTextW(GetDlgItem(IDC_BUTTON6)->m_hWnd, utf8_decode(texts[5]).c_str());
return TRUE;
}
MBCS を使用しておもちゃのアプリを作成しましたが、必要なものが得られません。
ユニコードを使用してアプリをビルドするとすぐに、すべて正常に動作します
これは、MBCS でビルドするときに個々のコントロールに Unicode テキストを使用する見込みがないということですか? もし可能でしたら、何かヒントをいただけないでしょうか?ありがとうございました。