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

Модератор: Модераторы разделов

Аватара пользователя
kt315e
Сообщения: 318
ОС: Debian 11

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

Сообщение kt315e »

У меня консольная программа на С написана в кодировке KOI-8R. Соответстенно в локали UTF-8 вместо русских букв выводит вопросики (в Konsole). Как заставить чтобы правильно выводила. Переделывать исходники пока не хочу.
Пробовал типа LANG="ru_RU.KOI8" ./programm
LC_ALL="ru_RU.KOI8" ./programm
безрузультатно, чего не понимаю?
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Вывод из консольной программы по русски

Сообщение nesk »

kt315e писал(а):
06.08.2008 14:35
У меня консольная программа на С написана в кодировке KOI-8R. Соответстенно в локали UTF-8 вместо русских букв выводит вопросики (в Konsole). Как заставить чтобы правильно выводила. Переделывать исходники пока не хочу.

а придётся

kt315e писал(а):
06.08.2008 14:35
Пробовал типа LANG="ru_RU.KOI8" ./programm
LC_ALL="ru_RU.KOI8" ./programm
безрузультатно, чего не понимаю?

Так, если твоя программа на анализирует эти переменные или не использует спец. библиотеки для вывода (которые анализируют эти переменные), то конечно никакого результата не будет.
так что, хотя бы man 3 iconv
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
MiK13
Сообщения: 1290
ОС: Linux Debian

Re: Вывод из консольной программы по русски

Сообщение MiK13 »

nesk писал(а):
06.08.2008 14:47
kt315e писал(а):
06.08.2008 14:35
У меня консольная программа на С написана в кодировке KOI-8R. Соответстенно в локали UTF-8 вместо русских букв выводит вопросики (в Konsole). Как заставить чтобы правильно выводила. Переделывать исходники пока не хочу.

а придётся

Подозреваю, что частично проблему можно решить командой
./programm | iconv -f koi8 -t utf8
Но сомневаюсь, что в программе получится диалог.
nesk писал(а):
06.08.2008 14:47
kt315e писал(а):
06.08.2008 14:35
Пробовал типа LANG="ru_RU.KOI8" ./programm
LC_ALL="ru_RU.KOI8" ./programm
безрузультатно, чего не понимаю?

Так, если твоя программа на анализирует эти переменные или не использует спец. библиотеки для вывода (которые анализируют эти переменные), то конечно никакого результата не будет.
так что, хотя бы man 3 iconv

А какие есть спецбиблиотеки для вывода, которые могут выполнять перекодировку в текущую кодировку консоли?
Достаточно ли будет часть после точки переменной окружения LANG передать в функции iconv_open в качестве первого параментра?
Или есть какие-то более "правильные" способы получения кодировки консоли?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Вывод из консольной программы по русски

Сообщение /dev/random »

Наиболее корректный подход - использовать gettext. См. info gettext (в man gettext информации в сотни раз меньше, чем нужно, поэтому info)
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: Вывод из консольной программы по русски

Сообщение Luinnar »

kt315e писал(а):
06.08.2008 14:35
У меня консольная программа на С написана в кодировке KOI-8R. Соответстенно в локали UTF-8 вместо русских букв выводит вопросики (в Konsole). Как заставить чтобы правильно выводила. Переделывать исходники пока не хочу.
Пробовал типа LANG="ru_RU.KOI8" ./programm
LC_ALL="ru_RU.KOI8" ./programm
безрузультатно, чего не понимаю?

Кодировку терминала менять на KOI8-R тогда уж нужно.
Спасибо сказали:
Аватара пользователя
kt315e
Сообщения: 318
ОС: Debian 11

Re: Вывод из консольной программы по русски

Сообщение kt315e »

Сделаю перекодировку вывода, диалога мне не надо. Спасибо.

Только man'а по iconv у меня почему то нет (Debian Eth). Может подскажете где в интернете можно смотреть свежие man'ы?
Спасибо сказали:
MiK13
Сообщения: 1290
ОС: Linux Debian

Re: Вывод из консольной программы по русски

Сообщение MiK13 »

kt315e писал(а):
07.08.2008 17:38
Сделаю перекодировку вывода, диалога мне не надо. Спасибо.

Боюсь, просто так не получится (как я предполагал ранее). Программа iconv может захватить весь вход и только после получения большого числа входных данных выдать их на выход. Или вообще после завершения работы программы.
kt315e писал(а):
07.08.2008 17:38
Только man'а по iconv у меня почему то нет (Debian Eth). Может подскажете где в интернете можно смотреть свежие man'ы?

Довольно странно. У меня тоже Debian Etch (ещё 4.0r0). После установки базовой системы man на программу iconv был. Не было манов на большинство системных функций. Они появились после установки пакета manpages-dev.
А что касается программы iconv, то её использование очень простое:
iconv -f encoding -t encoding inputfile
Если inputfile не указан, будет stdin. Можно после -o указать выходной файл (будет вместо stdout).
Список того, что можно указать вместо encoding можно получить по команде
iconv -l.
(!!!: iconv -l | wc
962 962 11286

)
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: Вывод из консольной программы по русски

Сообщение pcodr »

apt-get install manpages-dev

Сорри, MiK13 опередил
remote system type is unix
Спасибо сказали:
Upliner
Сообщения: 67
ОС: openSUSE 11 / Debian Lenny

Re: Вывод из консольной программы по русски

Сообщение Upliner »

Можно просто в Konsole выставить нужный Settings->Encoding и никаких проблем...
От Кузбаса и до Затулинки, от вершин до глубиннейших руд
Анархисты Сибирской Республики нас к предельной свободе ведут
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Вывод из консольной программы по русски

Сообщение /dev/random »

Upliner писал(а):
07.08.2008 19:51
Можно просто в Konsole выставить нужный Settings->Encoding и никаких проблем...

Это не решение. Программа должна корректно работать с локалью. Во-первых, кроме Konsole есть и другие терминалы. Как вы будете работать с программой когда иксы вообще не запущены? Во-вторых, терминал редко используется для одной-единственной программы. И что, постоянно переключать кодировку туда-сюда? Да и в конце концов, русский язык в системе вообще может отсутствовать! В коде программы все сообщения должны быть на английском, а локализованные - хранится в специальном файле, и запрашиваться через gettext (или аналог). Выбор нужного из языков, на которые осуществлён перевод, а также и работу с кодировками, возьмёт на себя gettext.
Спасибо сказали:
Аватара пользователя
kt315e
Сообщения: 318
ОС: Debian 11

Re: Вывод из консольной программы по русски

Сообщение kt315e »

Через iconv работает нормально. Для ясности: вывод этот типа отладочного, в окончательной версии его не будет. Поэтому и пройдет. Спасибо по разъяснения про интернациализацию, как раз собирался разбираться.
Спасибо сказали:
MiK13
Сообщения: 1290
ОС: Linux Debian

Re: Вывод из консольной программы по русски

Сообщение MiK13 »

pcodr писал(а):
07.08.2008 19:06
apt-get install manpages-dev

Небольшая информация для тех, кто недавно стал работать с линуксом.
В нём довольно много программ, имена которых совпадают с именами системных функций. Например, write, printf, уже упоминавшийся выше iconv. да и много других. Поэтому надо учитывать, что команда man на какую-нибудь системную функкцию может выдать информацию на соответствующую програииу. И чтобы получить информацию на функцию может потребоваться добавление перед её именем цифры 2 или 3:
man 2 time
man 3 printf
Спасибо сказали:
Аватара пользователя
B4rr4cuda
Сообщения: 82
ОС: SlackWare

Re: Вывод из консольной программы по русски

Сообщение B4rr4cuda »

А почему никто даже не вспомнил о luit ?
Luit is a filter that can be run between an arbitrary application and a UTF-8 terminal emulator. It will convert application output from the locale's encoding into UTF-8, and convert terminal input from UTF-8 into the locale's encoding.

An application may also request switching to a different output encoding using ISO 2022 and ISO 6429 escape sequences. Use of this feature is discouraged: multilingual applications should be modified to directly generate UTF-8 instead.
Спасибо сказали: