Вывод в консоль русского языка
От: Илюха Россия  
Дата: 27.11.03 09:39
Оценка:
Привет, всем!
Мне ни как не удается вывести в консоль с помощью cout русский текст в нормальном виде. Получается только в каракулях. Приэтом в файл пишется все хорошо. Пытался назначать кодовую страницу консоли — ничего не вышло. В поиске нашел не очень подходящие способы. Может кто еще чего знает.
Использую VC7.1.
-Илья

27.11.03 12:47: Перенесено модератором из 'C/C++' — OE
Re: Вывод в консоль русского языка
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 27.11.03 09:46
Оценка:
Здравствуйте, Илюха, Вы писали:

И> Привет, всем!

И>Мне ни как не удается вывести в консоль с помощью cout русский текст в нормальном виде. Получается только в каракулях. Приэтом в файл пишется все хорошо. Пытался назначать кодовую страницу консоли — ничего не вышло. В поиске нашел не очень подходящие способы. Может кто еще чего знает.
И>Использую VC7.1.
И>-Илья

http://www.rsdn.ru/article/qna/ui/concp.xml
Автор(ы): Алексей Кирюшкин
Re: Вывод в консоль русского языка
От: warri0r  
Дата: 27.11.03 10:18
Оценка:
Здравствуйте, Илюха, Вы писали:

И> Привет, всем!

И>Мне ни как не удается вывести в консоль с помощью cout русский текст в нормальном виде. Получается только в каракулях. Приэтом в файл пишется все хорошо. Пытался назначать кодовую страницу консоли — ничего не вышло. В поиске нашел не очень подходящие способы. Может кто еще чего знает.
И>Использую VC7.1.
И>-Илья
Тоже столкнулся с такой проблеммой ... Красивого решения типа изменить кодовую страницу в DOS mode не удалось найти Пока что выхожу из положения следующим образом:
Пишу русский текст при наборе кода в Windows 1251, ну а затем перед выводом на экран с помощью программы перекодировки (типа SNK Decode! www.snkey.net) преобразовываю строки на русском в 866 кодовую страницу ...
Это не совсем удобно ... но работает!
Буду рад если смог помочь
Re[2]: Вывод в консоль русского языка
От: Pavel Dvorkin Россия  
Дата: 27.11.03 11:27
Оценка:
Привет!

warri0r wrote:
> И>Мне ни как не удается вывести в консоль с помощью cout русский текст в нормальном виде. Получается только в каракулях. Приэтом в файл пишется все хорошо. Пытался назначать кодовую страницу консоли — ничего не вышло. В поиске нашел не очень подходящие способы. Может кто еще чего знает.
> Тоже столкнулся с такой проблеммой ... Красивого решения типа изменить кодовую страницу в DOS mode не удалось найти Пока что выхожу из положения следующим образом:
> Пишу русский текст при наборе кода в Windows 1251, ну а затем перед выводом на экран с помощью программы перекодировки (типа SNK Decode! www.snkey.net) преобразовываю строки на русском в 866 кодовую страницу ...
> Это не совсем удобно ... но работает!
> Буду рад если смог помочь


CharToOem
OemToChar

--
С наилучшими пожеланиями
Дворкин Павел
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re: Вывод в консоль русского языка
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 27.11.03 13:59
Оценка:
А чем не нравится вот такое решение:

1)Создаем пайп
2)Сохраняем куда-то хендл стандартного вывода
3)Перенаправляем себе хендл стандартного вывода в этот пайп; пайп обслуживаем сами в отдельном потоке
4)Когда в пайп что-то приходит, выводим это в сохраненный хендл

?

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re: Вывод в консоль русского языка
От: airatsa Россия  
Дата: 27.11.03 13:59
Оценка:
Здравствуйте, Илюха, Вы писали:

И> Привет, всем!

И>Мне ни как не удается вывести в консоль с помощью cout русский текст в нормальном виде. Получается только в каракулях. Приэтом в файл пишется все хорошо. Пытался назначать кодовую страницу консоли — ничего не вышло. В поиске нашел не очень подходящие способы. Может кто еще чего знает.
Можно

::setlocale(LC_ALL, ".OCP");

и выводить в unicode

wcout << L"Прочти меня" << endl;
Re[2]: Вывод в консоль русского языка
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 27.11.03 14:01
Оценка: 5 (1)
Естественно, пункт 4 — с перекодированием CharToОЕМ.
Самое приятное, что имеющийся текст программы менять не надо, только добавить пару функций.

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[2]: Вывод в консоль русского языка
От: Илюха Россия  
Дата: 27.11.03 15:31
Оценка:
Здравствуйте, airatsa, Вы писали:

A>::setlocale(LC_ALL, ".OCP");


A>и выводить в unicode


A>wcout << L"Прочти меня" << endl;

Попробовал, но выводит еще менее похожие на правду символы.
Re[3]: Вывод в консоль русского языка
От: Илюха Россия  
Дата: 27.11.03 15:40
Оценка:
Здравствуйте, 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 не вызывается. Я подозреваю, что просто не установился мой фасет
Re[4]: Вывод в консоль русского языка
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 27.11.03 15:45
Оценка:
Nichego slozhnogo (pro pajp), est' uzhe gotovye primery (dazhe zdes', na RSDN, da i na MSDN vrode byli).
Nado tol'ko ih zatochit' pod tvoju zadachu.

Odin primer est' здесь.

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[5]: Вывод в консоль русского языка
От: Илюха Россия  
Дата: 27.11.03 16:22
Оценка:
Здравствуйте, Slicer [Mirkwood], Вы писали:

SM>Nichego slozhnogo (pro pajp)..,

Нисколько в этом не сомневаюсь. Но, если их(пайпы) использовать, то из одно поточного приложение становится многопоточным.(Правда тут я опираюсь на идею, уже предложенную в этой ветви, а не на детальное знание вопроса.) В общем мне не очень хочется это делать.
--
Илья
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.