Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > русский язык в среде Dev-c++(комп-р MinGW)


Автор: limelight 20.3.2010, 13:49
 Есть ли способ выводить кириллицу не сильно заморачиваясь?
В вижуал студии это легко делается c помощью setlocale().

Здесь такое не прокатывает. Мне нужно  сделать так, чтобы один раз указав выводить в кириллице, далее не употреблять для этого 
лишних функций, а писать просто 
Код

cout<<"вот так";
.

Автор: nurik3 21.3.2010, 21:47
Цитата(limelight @ 20.3.2010,  13:49)
Есть ли способ выводить кириллицу не сильно заморачиваясь?
В вижуал студии это легко делается c помощью setlocale().

Здесь такое не прокатывает. Мне нужно  сделать так, чтобы один раз указав выводить в кириллице, далее не употреблять для этого 
лишних функций, а писать просто 
Код

cout<<"вот так";
.

Посмотри http://kpolyakov.narod.ru/school/c/faq.htm, может поможет.

Автор: bsa 21.3.2010, 21:53
Мда... Проверил. Действительно, в MinGW 4.4.0 ни один из стандартных методов, кроме CharToOem() не работает.
Создал https://sourceforge.net/tracker/?func=detail&aid=2974184&group_id=2435&atid=102435.

Автор: limelight 22.3.2010, 02:01
bsa,  здорово!

nurik3, интересная ссылка,спасибо,только посмотрю позже.

Автор: limelight 4.4.2010, 12:25
Каково же дальнейшее развитие событий???
Тут в комментах написали(если пройти по ссылке):

"Sorry, but I just don't see *how* the behaviour of MinGW's setlocale()
*can* differ from MSVC's. MinGW doesn't provide any implementation of
setlocale(), so when your code calls it, you get *Microsoft's* own
implementation, in the host system's standard runtime library, MSVCRT.DLL;
any difference you see would appear to result either from an error in your
own code, or from a change in functionality between versions of Microsoft's
implementation."

С английским плохо дружу, но что это значит? что эта функция данным компилятором не поддерживается, т.к. то, что мы предъявили - это наработка Microsoft ? так неужели у MinGW нет поддержки других языков?

Получается что ждать нечего?smile

Автор: limelight 4.4.2010, 13:11
nurik3,  да, отчасти помогло, НО!

В этом подходе предлагается заменить пару файлов - g++.exe и gcc.exe на g++rus.exe и gccrus.exe .
Интересно, откуда взялись эти файлы, кто их создал?) 
К сожалению, после проделывания данных операций, скорость компиляции резко падает...Или может вообще зависнуть.

Автор: Luyan 4.4.2010, 14:06
limelight, если интересует только простота вывода попробуй так:
Код

#include <iostream>
#include <windows.h>
using namespace std;

ostream& operator<<(ostream& out, const char* str)
{
    char buf[100];
    if(CharToOem(str, buf))
    {
        for(int i = 0; str[i] != 0; i++)
            out << buf[i];
    }
    return out;
}
int main(int argc, char *argv[])
{
    cout << "вот так" << endl;
    
    system("PAUSE");
    return 0;
}

Автор: limelight 4.4.2010, 14:47


Luyan,  спасибо.
Насколько я понял, здесь перегружается операция помещения в поток '<<', и таким образом происходит подмена одной кодировки другой, при помощи стандартной функции CharToOem(). Жаль только что до перегрузки операций я пока не добрался..) и еще жаль что непонятны некоторые детали. Спросил бы здесь, да вопросов будет море. 

Но общую мысль понял...

Автор: bsa 6.4.2010, 13:46
Цитата(limelight @  4.4.2010,  12:25 Найти цитируемый пост)
С английским плохо дружу, но что это значит? что эта функция данным компилятором не поддерживается, т.к. то, что мы предъявили - это наработка Microsoft ? так неужели у MinGW нет поддержки других языков?
Смысл ответа заключается в том, что его автор удивляется, как работа setlocale может отличаться, когда он общий - т.е. используется setlocale из стандартной библиотеки Windows. Скорее всего, MS что-то где-то подкрутила, что setlocale работает иначе.

Автор: icebloodmos 17.12.2010, 05:33
Классный форум smile . Я только начал учиться программированию  и конечно же наступил на те же грабли. Я так же использую MinGW,
и среду Dev-C++  и пост Luyan мне помог.

Автор: boostcoder 17.12.2010, 05:43
господа, по правде сказать, никогда не приходилось выводить в консоль русский текст. а вообще, в венде бываю очень редко. но, мне кажется, кодировка исходника в UTF-8 должна помочь. проверьте, отпишитесь.
у меня в подписи свежий mingw. проверьте и на нем.

Автор: bsa 18.12.2010, 22:12
boostcoder, в Windows не работает.

Автор: ctpz 31.12.2011, 16:54
Цитата(Luyan @ 4.4.2010,  14:06)
limelight, если интересует только простота вывода попробуй так:
Код

#include <iostream>
#include <windows.h>
using namespace std;

ostream& operator<<(ostream& out, const char* str)
{
    char buf[100];
    if(CharToOem(str, buf))
    {
        for(int i = 0; str[i] != 0; i++)
            out << buf[i];
    }
    return out;
}
int main(int argc, char *argv[])
{
    cout << "вот так" << endl;
    
    system("PAUSE");
    return 0;
}

Ты меня выручил. Спасибо.

Добавлено через 1 минуту и 35 секунд
Не знаю как отблагодарить))

Автор: xvr 3.1.2012, 13:29
Цитата(ctpz @  31.12.2011,  16:54 Найти цитируемый пост)
Не знаю как отблагодарить)) 

Отблагодарил smile

Автор: ctpz 15.1.2012, 10:32
Модератор: Сообщение скрыто.

Автор: borisbn 15.3.2012, 12:47
Вы будете смеяться, но на старости лет напоролся на эту же проблему, но... с вариациями))
Прежде всего - что использую:
  • MinGW из подписи boostcoder'а
  • MinGW 4.4.0 из комплекта QtCreator'а
  • два компьютера с Win7, (два - чтобы убедиться, что это - не глюк конкретной системы)
  • два компьютера с WinXP ( -||- )

Что накопал:
1. Разницы в компиляторах нет (в части русского языка, ессно))).
2. setlocale работает на Win7 без всяких танцев
3. setlocale не работает на WinXP
4. CharToOem работает везде
5. setlocale в программе, откомпилированной MSVC 2008, работает везде

Вариант с CharToOem не нравится, т.к. в большом проекте приходится в каждый исходник вставлять описание перегруженного опреатора <<, а при создании нового исходника - не забыть добавить это безобразие туда.

Вопрос: что, со времён поднятия этого вопроса - 20.3.2010 - ничего не изменилось ???

Спасибо.

Автор: bsa 15.3.2012, 17:55
Похоже, что нет. По всей видимости, mingw использует какую-то глючную либу еще от MSVC6. А в Win7 ее пофиксили.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)