вывод многобайтовой строки в переполнении стека

У меня проблема с многобайтовыми символьными строками. Я упростил мою проблему, как показано ниже:

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

и содержимое файла дампа: «мульт»

Почему он обрезает оставшуюся часть str, хотя я использовал wstring и wofstream?

Спасибо

5

Решение

wofstream записывает данные с использованием текущей локали. Локаль по умолчанию, вероятно, не поддерживает многобайтовые символы.

Смотрите вопрос: Невозможно записать std :: wstring в wofstream

Вы можете получить его для вывода полной строки:

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

перед написанием, однако, вы не получите символы как Unicode в Windows, так как он не поддерживает локали UTF-8.

Чтобы сделать это, вы должны преобразовать его в std :: string, используя WideCharToMultiByteи выписать это с помощью обычного ofstream,

1

Другие решения

Вам нужно будет наполнить выходной поток какой-то локалью, чтобы получить разумный 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.

0

По вопросам рекламы [email protected]