2


私のプログラムはファイルからテキストを読み取り、それをコンボボックスに入れます。
ファイルに英語の文字を含むテキストが含まれている場合、すべてが正常に機能します。
いくつかのポーランド語の文字が含まれている場合、それらは奇妙な文字に置き換えられています。
ファイルエンコーディングはUTF-8(BOMなし)です。

myCombo = CreateWindowExW(WS_EX_CLIENTEDGE, (LPCWSTR)L"COMBOBOX", NULL,
                             WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST,
                             a, b, c, d,
                             hwnd, (HMENU)ID_COMBO, hThisInstance, NULL);

wstring foo;
wifstream bar("theTextFile.txt");
getline(bar, foo);
SendMessageW(myCombo, CB_ADDSTRING, (WPARAM)0, (LPARAM)(foo.c_str()));

プログラムに正しい国の文字を表示させるにはどうすればよいですか?

PS。私の貧弱な英語でごめんなさい:)

4

1 に答える 1

3

wifstreamデフォルトでは、WindowsでUTF-8テキストを読み取りません。ストリームのロケールのcodecvtファセットは、ファイル内のバイトからに変換されるものwchar_tであるため、必要に応じて変換が行われるようにこれを設定する必要がありwchar_tます。

このようなもの:

#include <fstream>
#include <string>

#include <locale>  // std::locale
#include <codecvt> // std::codecvt_utf8_utf16
#include <memory>  // std::unique_ptr

#include <Windows.h> // WriteConsoleW

int main(int argc, const char * argv[])
{
    std::wstring foo;
    std::wifstream bar("theTextFile.txt");

    typedef std::codecvt_utf8_utf16<wchar_t, 0x10FFFF, std::consume_header> codecvt;
    std::unique_ptr<codecvt> ptr(new codecvt);
    std::locale utf8_locale((std::locale()), ptr.get());
    ptr.release();
    bar.imbue(utf8_locale);

    std::getline(bar, foo);

    DWORD n;
    WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), foo.c_str(), foo.size(), &n, NULL);
}
于 2012-12-11T16:41:49.000 に答える