WH
1573 / 804 / 188
Регистрация: 10.09.2013
Сообщений: 3,190
Записей в блоге: 3
1

Запуск консольной программы с кодировкой win1251

23.03.2019, 09:12. Показов 11442. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть исполняемый файл консольной windows программы. В программе есть сообщения кириллицей в кодировке win-1251. При этом программа в процессе работы создает тектовый файл с данными. Для корректного отображения текста как в консоли так и в текстовом файле нужно запустить программу в терминале с предустановленной кодировкой win-1251. Сделать это можно командой chcp 1251.

Задача в том, что бы не нагружать пользователя лишней работой, тем более если он не знает как это сделать. Пусть запускает bat файл который:
  1. Откроет консоль, и желательно раскроет ее пошире (если это можно сделать из bat).
  2. Изменит кодировку консоли на win-1251
  3. Запустит в консоли программу programma.exe
  4. После завершения работы exe файла закроет консоль

Каталог с bat и exe файлами может быть положен пользователем в любую директорию файловой системы windows. Важно, что бы запуск был возможен отовсюду.

Просьба написать текст такого bat файла.

ps Файл должен получиться короткий, прошу помочь, у меня винды нет, пользователь другой ОС.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2019, 09:12
Ответы с готовыми решениями:

Автоматизация консольной программы
Нужна помощь с консольной программой mkvmerge. К ней имеется предположим данные параметры...

Запуск и получение данных от консольной программы
Есть консольная программа *.exe написанная на C, выводит в консоль 2 строки. Нужно из программы на...

Запуск и получение данных из консольной программы *.exe
Есть консольная программа *.exe написанная на C, выводит в консоль 2 строки. Нужно из программы на...

Запуск консольной программы из программы
Добрый день Всем! Хотел изнутри Qt-шной программы запустить следующую команду под Виндой: echo...

13
10574 / 5538 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
23.03.2019, 10:28 2
1) mode con /?
2) chcp /?
3) cd /? cmd /?
4) exit 0
1
WH
1573 / 804 / 188
Регистрация: 10.09.2013
Сообщений: 3,190
Записей в блоге: 3
23.03.2019, 15:03  [ТС] 3
Код
@echo off
cmd.exe
chcp 1241
start programma.exe
exit
Так правильно? Путь в данном случае прописывать не нужно? Файл exe будет лежать в этой же папке.
0
10574 / 5538 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
23.03.2019, 19:33 4
Лучший ответ Сообщение было отмечено WH как решение

Решение

Цитата Сообщение от WH Посмотреть сообщение
Так правильно? Путь в данном случае прописывать не нужно? Файл exe будет лежать в этой же папке.
Отчасти да, отчасти нет.

Windows Batch file
1
2
3
4
5
6
7
@echo off
mode con: cols=180 lines=50
chcp 1251
cd /d "%~dp0"
cls
programma.exe
exit /b
1) интуиция подсказывает, что вместо кодовой страницы 1251 может понадобиться 866
2) если programma.exe после запуска сразу возвращает управление в консоль, то запускать придётся по-другом.
2
WH
1573 / 804 / 188
Регистрация: 10.09.2013
Сообщений: 3,190
Записей в блоге: 3
24.03.2019, 04:25  [ТС] 5
Цитата Сообщение от vavun Посмотреть сообщение
интуиция подсказывает, что вместо кодовой страницы 1251 может понадобиться 866
programma.exe может быть скомпилирована c любой кодировкой, но суть именно в том, что бы корректно отображалась кириллица как в терминале, так и в создаваемом этой программой текстовом файле, поэтому нужна кодировка win-1251.

Другой путь, без bat файла, можно скомпилировать программу с кодировкой CP866. В этом случае вывод данных в консоль будет производится корректно, но для корректности вывода сообщений в текстовый файл в программу придется встраивать модуль перекодирования 866-1251, это сделать можно, но больше возни и меньше универсальности. Хотя не исключено, что попробую оба метода.

Цитата Сообщение от vavun Посмотреть сообщение
если programma.exe после запуска сразу возвращает управление в консоль, то запускать придётся по-другом.
Нет, предполагается работа именно в программе. Возврат управления в консоль происходит после завершения работы программы, после чего консоль может быть закрыта. Вся суть в открытии консоли с нужной кодировкой для корректной работы программы.
0
4332 / 2122 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
24.03.2019, 21:37 6
Цитата Сообщение от WH Посмотреть сообщение
создаваемом этой программой текстовом файле
разве не ОС создает файл (ну да, по пинку из программы) в той кодировке, в которой ей гласит приложение отвечающее за создание и чтение этих файлов, notepad.exe - штатный блокнот windows по умолчанию и в кодировке 1251. Например у меня стоит его замена на AkelPad и по умолчанию файлы txt создаются и открываются в кодировке 866, так что проблем с кириллицей практически никогда нет.

Добавлено через 3 минуты
Цитата Сообщение от WH Посмотреть сообщение
для корректной работы программы
а вообще, раз уж просите помощи, можно бы и вскрыть карты написать название программы и то что пытаетесь из нее запустить (прочесть в окне cmd).
0
WH
1573 / 804 / 188
Регистрация: 10.09.2013
Сообщений: 3,190
Записей в блоге: 3
26.03.2019, 14:17  [ТС] 7
Цитата Сообщение от alpap Посмотреть сообщение
разве не ОС создает файл (ну да, по пинку из программы) в той кодировке, в которой ей гласит приложение отвечающее за создание и чтение этих файлов, notepad.exe - штатный блокнот windows по умолчанию и в кодировке 1251. Например у меня стоит его замена на AkelPad и по умолчанию файлы txt создаются и открываются в кодировке 866, так что проблем с кириллицей практически никогда нет.
Это программа не только для меня, если я напишу, что для ее запуска и корректного чтения созданных ею файлов нужно поставить еще какую то стороннюю программу, то отношение к идее будет отрицательным. Для чтения файлов нужно использовать только штатный блокнот.

Цитата Сообщение от alpap Посмотреть сообщение
а вообще, раз уж просите помощи, можно бы и вскрыть карты написать название программы и то что пытаетесь из нее запустить (прочесть в окне cmd).
Это специализированный математический расчет из области электротехники. Вряд ли это кому то интересно и важно в контексте данной темы.

===

Работу bat файла и первого прообраза программы попробовал на винде. Возник вопрос.

1. Запуском bat файла запускается консоль
2. Меняется кодировка на win-1251 (проверил это подстановкой в bat файл команд chcp и pause перед запуском файла programma.exe)
3. Программа запускается с корректным отображением кириллицы

Кодовая страница консоли по умолчанию 866, то же проверено (это видно во время паузы, по команде chcp пишется что то вида: "╪шЁюър¤ых 1251" вместо "кодовая страница 1251").

Фокус в том, что программа скомпилирована с кодировкой CP866 для тестирования с непосредственным запуском, без bat-файла.
Т.е. в первом варианте я непосредственно мышью запускаю programma.exe и вижу корректное отображение. Во втором варианте я запускаю ее же через bat файл со сменой кодировки в 1251 и то же вижу корректное отображение кириллицы. В чем подвох?


ps вывод в файл на винде еще не проверен, эта возможность есть только в следующей версии программы, пока существующей только в linux версии.
0
506 / 178 / 27
Регистрация: 11.03.2018
Сообщений: 763
26.03.2019, 16:08 8
Цитата Сообщение от WH Посмотреть сообщение
В чем подвох?
Версия Windows ?

В принципе, если приложение знает про себя, что живёт оно в кодировке cp866,
то вполне вероятно использование внутри системного вызова
C
1
system("chcp 866");
и весь последующий вывод польётся в уже настроенную на cp866 консоль, что совершенно разумно.

проверить это предположение можно после завершения работы приложения командой chcp,
которая покажет текущую кодировку.

Добавлено через 12 минут
Второе, что можно сказать,- я неоднократно видел приложения, которые отличаются корректным выводом
кириллицы в консоль вне зависимости от режима кодирования последней.
Что позволяет сделать предположение о наличии соответствующего Виндовс API по определению кодировки
родительской консоли и использованию этого API для подстройки I/O своего приложения.

Добавлено через 18 минут
GetConsoleOutputCP function
0
WH
1573 / 804 / 188
Регистрация: 10.09.2013
Сообщений: 3,190
Записей в блоге: 3
30.03.2019, 04:43  [ТС] 9
Цитата Сообщение от bidstrup Посмотреть сообщение
Версия Windows ?
Пробовал в windows 7.

Цитата Сообщение от bidstrup Посмотреть сообщение
В принципе, если приложение знает про себя, что живёт оно в кодировке cp866,
то вполне вероятно использование внутри системного вызова

system("chcp 866");

Цитата Сообщение от bidstrup Посмотреть сообщение
Второе, что можно сказать,- я неоднократно видел приложения, которые отличаются корректным выводом
кириллицы в консоль вне зависимости от режима кодирования последней.
Что позволяет сделать предположение о наличии соответствующего Виндовс API по определению кодировки
родительской консоли и использованию этого API для подстройки I/O своего приложения.
Win-api или системного вызова system("chcp 866") в программе не применялось. Программа написана для 2-х систем, причем разработка велась в linux, сейчас производится ее отладка. Единственное различие вежду версиями для windows и linux в системном вызове очистки экрана терминала, в linux call system (clear), в windows call system (‘cls’), других различий нет, если не встраивать модуль прекодирования 866-1251 для вывода в файл, но и он сделан средствами самого языка без особенностей применения в разных ОС и пока он не встроен.

Цитата Сообщение от bidstrup Посмотреть сообщение
проверить это предположение можно после завершения работы приложения командой chcp,
которая покажет текущую кодировку.
Сделал вставкой команд chcp и pause после завершения работы программы. Кодовая страница 1251.

Видиом что-то упускаю, буду разбираться дальше.
0
506 / 178 / 27
Регистрация: 11.03.2018
Сообщений: 763
30.03.2019, 08:50 10
После вышесказанного остаётся только предположить существование высокоинтеллектуального
библиотечного модуля ввода-вывода, которым втихую пользуется компилятор gcc для Windows *

Это легко проверить. Собрать приложение из одной строЧки вывода кириллицей, сохранить в двух кодировках,
затем собрать и посмотреть на результат.

(*) какая, кстати, используется подсистема mingw или cygwin ?
0
WH
1573 / 804 / 188
Регистрация: 10.09.2013
Сообщений: 3,190
Записей в блоге: 3
30.03.2019, 10:14  [ТС] 11
Код
system("chcp 866");
Кстати, если можно вставить такой системный вызов непосредственно в код программы, что бы он прямо из программы менял кодировку консоли, это было бы универсальное и простое решение, лучше bat файла.

Цитата Сообщение от bidstrup Посмотреть сообщение
После вышесказанного остаётся только предположить существование высокоинтеллектуального
библиотечного модуля ввода-вывода, которым втихую пользуется компилятор gcc для Windows *
Это легко проверить. Собрать приложение из одной строЧки вывода кириллицей, сохранить в двух кодировках,
затем собрать и посмотреть на результат.
Дома только линь, поэтому не могу проверить, к сожалению, по крайнй мере пока.

Цитата Сообщение от bidstrup Посмотреть сообщение
(*) какая, кстати, используется подсистема mingw или cygwin ?
Компилятор ifort (не на моей машине), но возможно буду компилировать в одном из того что вы написали, тем более вероятно приедтся ставить виртуалку для еще одной задачи.
0
506 / 178 / 27
Регистрация: 11.03.2018
Сообщений: 763
30.03.2019, 11:14 12
Ну а, собственно, зачем тратить время своей жизни на анализ того, почему программа работает правильно ? )

Добавлено через 9 минут
Как я понял, исходник для компиляции ifort должен быть в кодировке 1251 и должен
получиться правильный вывод в 'консоль' кириллицы вне зависимости от того в какую кодировку имеет 'консоль'.

Если это так и есть, надо поблагодарить кого-нибудь, всё забыть и предаться жизненым удовольствиям.
0
WH
1573 / 804 / 188
Регистрация: 10.09.2013
Сообщений: 3,190
Записей в блоге: 3
30.03.2019, 12:23  [ТС] 13
Цитата Сообщение от bidstrup Посмотреть сообщение
Ну а, собственно, зачем тратить время своей жизни на анализ того, почему программа работает правильно ? )
Люблю во всем разобраться что бы потом не было неожиданностей, когда программа будет давным давно скомпилированной, а особенности кода будут подзабыты. Да и компилировать окончательный вариант еще только предстоит.
Всем спасибо!
0
WH
1573 / 804 / 188
Регистрация: 10.09.2013
Сообщений: 3,190
Записей в блоге: 3
23.11.2020, 16:05  [ТС] 14
Решил старую проблему, пришлось опять столкнуться с этой задачей но на другой программе. Оказывается решалось все очень просто и решение лежало на поверхности. Просто делаем отдельный модуль вывода данных в файл и компилируем его в кодировке win-1251, все остальное компилируем в другой нужной кодировке, в данном случае в ср-866. Далее линкуем объектные файлы и получаем нужный результат.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2020, 16:05
Помогаю со студенческими работами здесь

Запуск консольной команды windows
Добрый день всем! Вопрос: как запустить какую-либо команду для cmd с помощью шарпа? Например...

Выполнение команд консольной программы из другой программы
Подскажите пожалуйста можно ли получить контроль над консольной прогой из другой самописной проги....

С кодировкой базы данных и кодировкой сайтом и кодировкой файла разобраться не могу
С кодировкой базы данных и сайтом файлом разобраться не могу. Я на своем сайте вывожу данные из...

Рестарт консольной программы
Как сделать так ,что бы после выполнения всех действий в консольном приложении, программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru