LINUX.ORG.RU

Глупый вопрос про locale


0

0

есть программа, которая работает в окне term. соответсвенно текст который она может выводить на экран в кодировке KOI8-R (в силу устоявшихся традиций).

в для терминалов установленна локаль KOI-8R и текст отображается корректно. но требуется выводить текст и для других локалей (UTF8, 1251, CP866 и т.д.) я настроил перекодировку под любую локаль с помощью крыжика в настройках, но это на мой вкус немного неверно.

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

как мне получить настройки локали в С?

нашел функцию nl_langinfo(CODEPAGE) но она возвращает что-то непотребное.

заранее спасибо за участие:)

anonymous

Если задача сводится только к выводу заранее определённых сообщений,
то посмотрите в сторону gettext. В своей программе пишите всё по
английски, а локализованные сообщения - в отдельных файлах. Насколько
я знаю, gettext автоматически перекодирует строки из каталога в
кодировку текущей локали.

Если ваша программа получает/передаёт строки через какие-то внешние
источники (файлы или сеть например), то тут всё сложнее. Я бы
порекомендовал использовать юникод.

В C++ удобно использовать юникодные строки. Вот этот пример будет
работать с любой локалью, кодировка которой поддерживает кириллицу:

#include <iostream>
#include <locale>

using namespace std;

int main()
{
	locale::global(locale(""));
	wcout.imbue(locale());
	wcout << L"Привет!!!" << endl;
	
	return 0;
}

Deleted
()
Ответ на: комментарий от Deleted

Спасибо за ответ, но он не подходит.

у меня сообщения зарание определены тексте программы в кодировке KOI8-R. Основная проблемма в портировании этого софта, он работает под управлением windows, linux, qnx, dos и пары специализированных ОСей.

из-за этого приходится отказыватся от С++ т.к. кое-где просто нету. Так что этот вариант не подходит:) интересует чистый С.

Если это важно то дистрибутивы у меня Debian и Suse, но мне кажется что это должно быть все равно

anonymous
()
Ответ на: комментарий от anonymous

>> Основная проблемма в портировании этого софта, он работает под управлением windows, linux, qnx, dos и пары специализированных ОСей.

Хм... Тогда лучше держать внутри программы все строки в юникоде. А при выводе перекодировать в нужную кодировку с помощью libiconv.

Deleted
()
Ответ на: комментарий от anonymous

Можно подумать о варианте, использованном в pppd. Там не используется функция printf, а определена собственная vslprintf, которая берет аргументы через va_list. При этом, они расширили количество спецификаторов формата (например %I --- вывести ip-адрес). Код там не большой, чистый Си, и туда легко вставить перкодировку из koi-8 в другую локаль UTF и т.д. Понято, что для портируемости зашить таблицы перкодировки "жестко" не использую libiconv...

mky ★★★★★
()
Ответ на: комментарий от anonymous

gettext всё-таки посмотрите. Есть много где (даже под Windows ЕМНИП) и библиотека Сишная.

php-coder ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.