5

マルチバイト文字列に問題があります。以下のように問題を単純化しました。

std::wstring str = L"multıbyte test string";
std::wofstream f;
f.open("F:\\dump.txt");
f << str;
f.close();

ダンプファイルの内容は「mult」です。

wstring と wofstream を使用しているのに、str の残りの部分をカットするのはなぜですか?

ありがとう

4

2 に答える 2

1

wofstream現在のロケールを使用してデータを書き出します。デフォルトのロケールは、おそらくマルチバイト文字をサポートしていません。

質問を参照してください:std::wstringをwofstreamに書き込めません

次の方法で完全な文字列を出力することができます。

std::locale::global(std::locale(""));

ただし、UTF-8ロケールをネイティブにサポートしていないため、書き込む前に、WindowsでUnicodeとして文字を取得することはできません。

これを行うには、を使用してstd :: stringに変換し、WideCharToMultiByte通常のを使用して書き出す必要がありofstreamます。

于 2012-12-19T11:36:18.817 に答える
0

出力ストリームにロケールを吹き込んで、変換に必要な合理的なファセットを取得するcodecvt必要があります。C++11 をサポートするコンパイラまたは Visual Studio 2010 以降を使用している場合は、UTF-8 ファセット ( )を使用できます。wchar_tcharcodecvt_utf8

f.imbue(
    std::locale (         // using std::locale constructed from
        std::locale (),   // global locale
                          // and codecvt_utf8 facet
            new std::codecvt_utf8<char, 0x10FFFF,
                static_cast<std::codecvt_mode>(std::consume_header
                    | std::little_endian)>);

もありcodecvt_utf16ます。

于 2012-12-19T11:46:16.050 に答える