Здравствуйте, уважаемые...
С++ я знаю не намного лучше, чем никак... Изредка пописываю элементарнейшие консольные программки под собственные нужды. Пописываю под Линуксом, но, порой, возникает необходимость и под Винду их пересобрать. Здесь и начинается проблема.
С обеих сторон (как под Кубунтой, так и под XP) - CodeBlocks. Под Линуксом он создаёт файлы в ANSI, а после их сборки под Виндой - получается несовпадение кодировки отправляемого на вывод текста с кодировкой Виндовой консоли. Известная проблема, в общем...
Спасаюсь AkelPad'ом: тупо пересохраняю им .cpp-файл с перекодированием из ANSI в OEM. Однако, собирать его приходится вслепую - в Виндовой консоли крякозябры исчезают, но в редакторе CodeBlocks - появляются. Не умеет она работать с OEM 866 и учиться не собирается - даже плагинов для этого нет. В связи с этим, вопрос:
подскажите, пожалуйста, свободную IDE, умеющую сохранять, читать и редактировать .cpp-файлы в OEM 866.
Покорнейше прошу не предлагать отказаться от русского языка в комментах, а на вывод подавать символы кодами. Варианты с изменением исходников в зависимости от целевой ОСи также считаю для своих задач нецелесообразными. Хочу именно подобрать соответствующую задаче IDE и работать в одной кодировке, не путая себя и других...
Пожалуйста, порекомендуйте свободный IDE с поддержкой DOS-кодировок...
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
А вставить в начале программы вызов:
SetConsoleOutputCP (1251);
не катит?
В этом случае выводимый на консоль текст в ANSI-кодировке будет отображаться нормально.
SetConsoleOutputCP (1251);
не катит?
В этом случае выводимый на консоль текст в ANSI-кодировке будет отображаться нормально.
Собственно, DOS-овский Borland C, например, версии 3.1подскажите, пожалуйста, свободную IDE, умеющую сохранять, читать и редактировать .cpp-файлы в OEM 866.
Если под Линуксом не определена ф-ия SetConsoleOutputCP, то можно решить проблему "единого исходного текста" с помощью условной помпиляции. Например, в Visual Studio есть предопределенный define WIN32 (т.е. define, автоматически устанавливаемый во всех проектах). Полагаю, под Линуксом он остутствует. В таком случае пишем:
Код: Выделить всё
#if defined (WIN32)
SetConsoleOutputCP (1251);
#endif
Насколько я знаю (прошу, если что, делать скидку на мою малограмотность - я о ней предупреждал), чтобы
заработали, нужно включать
, а самих их вписывать в самом начале тела функции main().
Как сделать так, чтобы эти строчки (находящиеся в разных местах, что любопытно), под Виндой обрабатывались компилятором, а под Линуксом - пропускались, не вызывая ошибки, я, на нынешней стадии своего знания плюсов, представить себе не могу... А "единый исходный код" для меня важен...
Понимаю, что этот вопрос не вполне вписывается в заданную мною тему, и, по уму, создать бы новую, однако не я от изначальной темы отклонился первым, а теперь уж - чтоб и не распросить...
Код: Выделить всё
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Код: Выделить всё
#include <windows.h>
Как сделать так, чтобы эти строчки (находящиеся в разных местах, что любопытно), под Виндой обрабатывались компилятором, а под Линуксом - пропускались, не вызывая ошибки, я, на нынешней стадии своего знания плюсов, представить себе не могу... А "единый исходный код" для меня важен...
Понимаю, что этот вопрос не вполне вписывается в заданную мною тему, и, по уму, создать бы новую, однако не я от изначальной темы отклонился первым, а теперь уж - чтоб и не распросить...
Через ту же условную компиляцию:Роман К. писал(а):...нужно включать, а самих их вписывать в самом начале тела функции main().Код: Выделить всё
#include <windows.h>
Как сделать так, чтобы эти строчки (находящиеся в разных местах, что любопытно), под Виндой обрабатывались компилятором, а под Линуксом - пропускались, не вызывая ошибки, я, на нынешней стадии своего знания плюсов, представить себе не могу...
Код: Выделить всё
#if defined (WIN32)
#include <windows.h>
#endif
И Вы бы укзаали, какой компилятор используете в среде Windows, возможно там используется какой-то другой предопределенный define (как я писал, WIN32 я упомянул для компилятора MS Visual Studio)
В принципе любой текстовый редактор для Windows, у которого есть возможность переключения шрифтов, позволяет редактировать текст в кодировке MS-DOS 866. Для этого нужно лишь выбрать шрифт Terminal. Можешь использовать интегрированную среду Eclipse, которая свободно распространяется и поддерживает разные языки программирования.
Но не это главное...
Если ты хочешь создать многоязычное и мультиплатформенное приложение, которое будет работать с разными кодировками текста и на разных операционных системах, то тебе нужно по-другому строить своё приложение.
В этом случае не нужно писать:
cout << "Привет всем!"; или printf("Всем пока");
А нужно для начала создать отдельный файл с текстовыми константами, которые будут определены для каждого конкретного языка или кодовой страницы.
Пусть это будет выглядеть так:
Код cpp:
#ifdef CODEPAGE_1251
#define STR_HELLO "Привет всем"
#define STR_GOODBYE "Всем пока"
#endif
#ifdef CODEPAGE_866
#define STR_HELLO "[Текст в кодировке 866]"
#define STR_GOODBYE "[Текст в кодировке 866]"
#endif
При компиляции тебе надо будет только указать нужное определение для конкретной локализации, например:
#define CODEPAGE_866
А уже в основном коде программы писать
cout << STR_HELLO; или
printf(STR_GOODBYE);
В этом случае у тебя весь код будет един для всех компиляторов и не нужно будет вставлять разные заголовки, типа windows.h
Но не это главное...
Если ты хочешь создать многоязычное и мультиплатформенное приложение, которое будет работать с разными кодировками текста и на разных операционных системах, то тебе нужно по-другому строить своё приложение.
В этом случае не нужно писать:
cout << "Привет всем!"; или printf("Всем пока");
А нужно для начала создать отдельный файл с текстовыми константами, которые будут определены для каждого конкретного языка или кодовой страницы.
Пусть это будет выглядеть так:
Код cpp:
#ifdef CODEPAGE_1251
#define STR_HELLO "Привет всем"
#define STR_GOODBYE "Всем пока"
#endif
#ifdef CODEPAGE_866
#define STR_HELLO "[Текст в кодировке 866]"
#define STR_GOODBYE "[Текст в кодировке 866]"
#endif
При компиляции тебе надо будет только указать нужное определение для конкретной локализации, например:
#define CODEPAGE_866
А уже в основном коде программы писать
cout << STR_HELLO; или
printf(STR_GOODBYE);
В этом случае у тебя весь код будет един для всех компиляторов и не нужно будет вставлять разные заголовки, типа windows.h
Поумнеть несложно, куда труднее от дури избавиться.