Привет, всем!
Мне ни как не удается вывести в консоль с помощью cout русский текст в нормальном виде. Получается только в каракулях. Приэтом в файл пишется все хорошо. Пытался назначать кодовую страницу консоли — ничего не вышло. В поиске нашел не очень подходящие способы. Может кто еще чего знает.
Использую VC7.1.
-Илья
27.11.03 12:47: Перенесено модератором из 'C/C++' — OE
Здравствуйте, Илюха, Вы писали:
И> Привет, всем! И>Мне ни как не удается вывести в консоль с помощью cout русский текст в нормальном виде. Получается только в каракулях. Приэтом в файл пишется все хорошо. Пытался назначать кодовую страницу консоли — ничего не вышло. В поиске нашел не очень подходящие способы. Может кто еще чего знает. И>Использую VC7.1. И>-Илья
Здравствуйте, Илюха, Вы писали:
И> Привет, всем! И>Мне ни как не удается вывести в консоль с помощью cout русский текст в нормальном виде. Получается только в каракулях. Приэтом в файл пишется все хорошо. Пытался назначать кодовую страницу консоли — ничего не вышло. В поиске нашел не очень подходящие способы. Может кто еще чего знает. И>Использую VC7.1. И>-Илья
Тоже столкнулся с такой проблеммой ... Красивого решения типа изменить кодовую страницу в DOS mode не удалось найти Пока что выхожу из положения следующим образом:
Пишу русский текст при наборе кода в Windows 1251, ну а затем перед выводом на экран с помощью программы перекодировки (типа SNK Decode! www.snkey.net) преобразовываю строки на русском в 866 кодовую страницу ...
Это не совсем удобно ... но работает!
Буду рад если смог помочь
warri0r wrote: > И>Мне ни как не удается вывести в консоль с помощью cout русский текст в нормальном виде. Получается только в каракулях. Приэтом в файл пишется все хорошо. Пытался назначать кодовую страницу консоли — ничего не вышло. В поиске нашел не очень подходящие способы. Может кто еще чего знает. > Тоже столкнулся с такой проблеммой ... Красивого решения типа изменить кодовую страницу в DOS mode не удалось найти Пока что выхожу из положения следующим образом: > Пишу русский текст при наборе кода в Windows 1251, ну а затем перед выводом на экран с помощью программы перекодировки (типа SNK Decode! www.snkey.net) преобразовываю строки на русском в 866 кодовую страницу ... > Это не совсем удобно ... но работает! > Буду рад если смог помочь
1)Создаем пайп
2)Сохраняем куда-то хендл стандартного вывода
3)Перенаправляем себе хендл стандартного вывода в этот пайп; пайп обслуживаем сами в отдельном потоке
4)Когда в пайп что-то приходит, выводим это в сохраненный хендл
?
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Здравствуйте, Илюха, Вы писали:
И> Привет, всем! И>Мне ни как не удается вывести в консоль с помощью cout русский текст в нормальном виде. Получается только в каракулях. Приэтом в файл пишется все хорошо. Пытался назначать кодовую страницу консоли — ничего не вышло. В поиске нашел не очень подходящие способы. Может кто еще чего знает.
Можно
Здравствуйте, airatsa, Вы писали:
A>::setlocale(LC_ALL, ".OCP");
A>и выводить в unicode
A>wcout << L"Прочти меня" << endl;
Попробовал, но выводит еще менее похожие на правду символы.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>CharToOem PD>OemToChar
Хорошо это я уловил. Спасибо всем кто насоветовал. Теперь, чтобы не вставлять везде эту конвертацию я решил написать свой codecvt<...>, который перед выводом будет делать всю работу. Идея с пайпом показалась мне несколько сложноватой.
Так вот фиг вам. У меня ни как не получается его прикруть к потоку.
Сделал так.
class MyCodeCVT : public std::codecvt<char, char, mbstate_t>{
typedef std::codecvt<char, char, mbstate_t> base_t;
public:
explicit MyCodeCVT(size_t r = 0): base_t(r){}
protected:
virtual result do_out(mbstate_t& __state,
const char* from,
const char* from_end,
const char*& from_next,
char* to,
char* to_limit,
char*& to_next) const
{
ptrdiff_t len = (std::min) (from_end - from, to_limit - to);
CharToOemBuff(from, to, len);
from_next = from + len;
to_next = to + len;
return ok;
}
};
std::string test("Строчка по-нашему");
int _tmain(int argc, _TCHAR* argv[])
{
std::locale loc(std::locale(), new MyCodeCVT);
std::cout.imbue(loc);
std::cout<<test<<std::endl;
return 0;
}
Метод do_out не вызывается. Я подозреваю, что просто не установился мой фасет
Здравствуйте, Slicer [Mirkwood], Вы писали:
SM>Nichego slozhnogo (pro pajp)..,
Нисколько в этом не сомневаюсь. Но, если их(пайпы) использовать, то из одно поточного приложение становится многопоточным.(Правда тут я опираюсь на идею, уже предложенную в этой ветви, а не на детальное знание вопроса.) В общем мне не очень хочется это делать.
--
Илья