У меня консольная программа на С написана в кодировке KOI-8R. Соответстенно в локали UTF-8 вместо русских букв выводит вопросики (в Konsole). Как заставить чтобы правильно выводила. Переделывать исходники пока не хочу.
Пробовал типа LANG="ru_RU.KOI8" ./programm
LC_ALL="ru_RU.KOI8" ./programm
безрузультатно, чего не понимаю?
Вывод из консольной программы по русски
Модератор: Модераторы разделов
-
nesk
- Сообщения: 2268
- Статус: Линукссаксовец
- ОС: MS Windows XP Home SP3
Re: Вывод из консольной программы по русски
а придётся
Так, если твоя программа на анализирует эти переменные или не использует спец. библиотеки для вывода (которые анализируют эти переменные), то конечно никакого результата не будет.
так что, хотя бы man 3 iconv
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.
0xDEFEC8ED
0xDEFEC8ED
-
MiK13
- Сообщения: 1290
- ОС: Linux Debian
Re: Вывод из консольной программы по русски
Подозреваю, что частично проблему можно решить командой
./programm | iconv -f koi8 -t utf8
Но сомневаюсь, что в программе получится диалог.
А какие есть спецбиблиотеки для вывода, которые могут выполнять перекодировку в текущую кодировку консоли?
Достаточно ли будет часть после точки переменной окружения LANG передать в функции iconv_open в качестве первого параментра?
Или есть какие-то более "правильные" способы получения кодировки консоли?
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: Вывод из консольной программы по русски
Наиболее корректный подход - использовать gettext. См. info gettext (в man gettext информации в сотни раз меньше, чем нужно, поэтому info)
-
Luinnar
- Сообщения: 246
- ОС: Solaris, Debian, Ubuntu
Re: Вывод из консольной программы по русски
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: Вывод из консольной программы по русски
Сделаю перекодировку вывода, диалога мне не надо. Спасибо.
Только man'а по iconv у меня почему то нет (Debian Eth). Может подскажете где в интернете можно смотреть свежие man'ы?
Только man'а по iconv у меня почему то нет (Debian Eth). Может подскажете где в интернете можно смотреть свежие man'ы?
-
MiK13
- Сообщения: 1290
- ОС: Linux Debian
Re: Вывод из консольной программы по русски
Боюсь, просто так не получится (как я предполагал ранее). Программа iconv может захватить весь вход и только после получения большого числа входных данных выдать их на выход. Или вообще после завершения работы программы.
Довольно странно. У меня тоже 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: Вывод из консольной программы по русски
apt-get install manpages-dev
Сорри, MiK13 опередил
Сорри, MiK13 опередил
remote system type is unix
-
Upliner
- Сообщения: 67
- ОС: openSUSE 11 / Debian Lenny
Re: Вывод из консольной программы по русски
Можно просто в Konsole выставить нужный Settings->Encoding и никаких проблем...
От Кузбаса и до Затулинки, от вершин до глубиннейших руд
Анархисты Сибирской Республики нас к предельной свободе ведут
Анархисты Сибирской Республики нас к предельной свободе ведут
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: Вывод из консольной программы по русски
Это не решение. Программа должна корректно работать с локалью. Во-первых, кроме Konsole есть и другие терминалы. Как вы будете работать с программой когда иксы вообще не запущены? Во-вторых, терминал редко используется для одной-единственной программы. И что, постоянно переключать кодировку туда-сюда? Да и в конце концов, русский язык в системе вообще может отсутствовать! В коде программы все сообщения должны быть на английском, а локализованные - хранится в специальном файле, и запрашиваться через gettext (или аналог). Выбор нужного из языков, на которые осуществлён перевод, а также и работу с кодировками, возьмёт на себя gettext.
-
kt315e
- Сообщения: 318
- ОС: Debian 11
Re: Вывод из консольной программы по русски
Через iconv работает нормально. Для ясности: вывод этот типа отладочного, в окончательной версии его не будет. Поэтому и пройдет. Спасибо по разъяснения про интернациализацию, как раз собирался разбираться.
-
MiK13
- Сообщения: 1290
- ОС: Linux Debian
Re: Вывод из консольной программы по русски
Небольшая информация для тех, кто недавно стал работать с линуксом.
В нём довольно много программ, имена которых совпадают с именами системных функций. Например, write, printf, уже упоминавшийся выше iconv. да и много других. Поэтому надо учитывать, что команда man на какую-нибудь системную функкцию может выдать информацию на соответствующую програииу. И чтобы получить информацию на функцию может потребоваться добавление перед её именем цифры 2 или 3:
man 2 time
man 3 printf
-
B4rr4cuda
- Сообщения: 82
- ОС: SlackWare
Re: Вывод из консольной программы по русски
А почему никто даже не вспомнил о 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.