Задать вопрос
@mrZurg

Почему wstring::c_str() не выводит русскую часть текста?

Проблема в том что:
имеется строка str - содержит часть на английском, часть на русском.
Я создаю wstring strW(str.begin(), str.end());
Если попытаться вывести .c_str():
wcout << strW.c_str() ;
То выводится только часть на английском(причем wstring::length() - говорит что строка правильно - необрезанной длинны как и str)

Пробовал:
wcin.imbue(locale("rus_rus.866"));
wcout.imbue(locale("rus_rus.866"));

Но оно:
1 - не работает(если только циклом выводить посимвольно strW - то выводит всю строку)
2 - мне нужно это для:
hf = FindFirstFile(strW.c_str(), &fd);
а не для wcout
  • Вопрос задан
  • 1907 просмотров
Подписаться 2 Оценить 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
Разве 866 кодировка - это не только для консоли?
Любые функции должны принимать либо unicode, либо, если это наследие WinAPI, 1251.
Ответ написан
@monah_tuk
imbue() применяет локаль для оперций ввода-вывода, типа: как выводить разделитель дроби: точку или запятую. Тебе в начале, до операций ввода-вывода, нужно поставить:
std::locale system("");
std::locale::global(system);


Вот более полный пример, в котором видно отличия:
#include <iostream>
#include <locale>

using namespace std;

int main()
{
    std::locale system("");
    std::locale::global(system);

    wstring str = L"hello, world. привет, МКС";
    wcout << str << endl;
    wcout << str.c_str() << endl;

    wcout << 3.14 << endl;
    // А теперь будет десятичный разделитель согласно локали выводится
    wcout.imbue(system);
    wcout << 3.14 << endl;

    return 0;
}


Вывод такой:
hello, world. привет, МКС
hello, world. привет, МКС
3.14
3,14


UPD: еще, неплохо, при помощи setlocale() установить Си-локаль, которую библиотека Си использует. Ага, они разные, и ставятся независимо (https://stdcxx.apache.org/doc/stdlibug/24-3.html) :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы