У меня проблема с многобайтовыми символьными строками. Я упростил мою проблему, как показано ниже:
std::wstring str = L"multıbyte test string";
std::wofstream f;
f.open("F:\\dump.txt");
f << str;
f.close();
и содержимое файла дампа: «мульт»
Почему он обрезает оставшуюся часть str, хотя я использовал wstring и wofstream?
Спасибо
wofstream
записывает данные с использованием текущей локали. Локаль по умолчанию, вероятно, не поддерживает многобайтовые символы.
Смотрите вопрос: Невозможно записать std :: wstring в wofstream
Вы можете получить его для вывода полной строки:
std::locale::global(std::locale(""));
перед написанием, однако, вы не получите символы как Unicode в Windows, так как он не поддерживает локали UTF-8.
Чтобы сделать это, вы должны преобразовать его в std :: string, используя WideCharToMultiByte
и выписать это с помощью обычного ofstream
,
Вам нужно будет наполнить выходной поток какой-то локалью, чтобы получить разумный codecvt
грань делать wchar_t
в char
преобразование. Если у вас есть компилятор с поддержкой C ++ 11 или Visual Studio 2010 и более поздние версии, вы можете использовать фасет UTF-8 (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
.