マルチバイト文字列に問題があります。以下のように問題を単純化しました。
std::wstring str = L"multıbyte test string";
std::wofstream f;
f.open("F:\\dump.txt");
f << str;
f.close();
ダンプファイルの内容は「mult」です。
wstring と wofstream を使用しているのに、str の残りの部分をカットするのはなぜですか?
ありがとう
wofstream
現在のロケールを使用してデータを書き出します。デフォルトのロケールは、おそらくマルチバイト文字をサポートしていません。
質問を参照してください:std::wstringをwofstreamに書き込めません
次の方法で完全な文字列を出力することができます。
std::locale::global(std::locale(""));
ただし、UTF-8ロケールをネイティブにサポートしていないため、書き込む前に、WindowsでUnicodeとして文字を取得することはできません。
これを行うには、を使用してstd :: stringに変換し、WideCharToMultiByte
通常のを使用して書き出す必要がありofstream
ます。
出力ストリームにロケールを吹き込んで、変換に必要な合理的なファセットを取得するcodecvt
必要があります。C++11 をサポートするコンパイラまたは Visual Studio 2010 以降を使用している場合は、UTF-8 ファセット ( )を使用できます。wchar_t
char
codecvt_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
ます。