2016-02-09 5 views
33

Я разрабатываю консольное приложение для сервера, на котором работает RedHat. Конечные пользователи должны иметь возможность запускать это приложение с любым терминалом по своему выбору. (Например, терминал Gnome, шлюз SSH/Telnet, клиент MS Telnet и другие).Настройка среды для System.in

В большинстве терминальных приложений нет ничего плохого, однако, когда я запускаю свою программу из сеанса MS telnet, я замечаю, что мои специальные входы для System.in и System.console() полностью перепутаны. В обратном пространстве напишите ^H на экран, а другие клавиши также напишут тарабарщину.

Я взломал на нее достаточно, что я могу получить его, чтобы последовательно работать, но я уверен, что я делаю это полный:

if (!System.getenv("TERM").equals("xterm")) 
{ 
    System.out.println("\nWARNING: The TERM type is now set to xterm\n"); 
    final String[] cmd = { "/bin/sh", "-c", "export TERM=xterm" }; 
    Runtime.getRuntime().exec(cmd); 
} 

Будет ли проблема здесь для терминалов, которые дон 't поддержка xterm? Я заметил, что клиент Microsoft Telnet не позволяет вам установить тип TERM в xterm перед началом сеанса. Однако, как только сеанс запущен, настройка TERM=xterm, похоже, решает проблему.

Каким образом большинство консольных приложений затрагивает эту проблему?

+0

Возможно, ваш бред является бегству sequnces ANSI http://stackoverflow.com/questions/16755142/how-to-make-win32-console-recognize-ansi-vt100-escape-sequences?lq=1 –

+2

смотреть там : https://github.com/fusesource/jansi Jansi - это небольшая библиотека java, которая позволяет использовать escape-последовательности ANSI для форматирования вывода консоли, который работает даже на окнах. –

+0

@AndreasFrische oh wow, который выглядит многообещающим! придется играть с ним! – flakes

ответ

1

С терминальным характером приложениями, всегда есть два конца в связи, которые должны договориться о том, как интерпретировать управляющие символы. Обычно обе стороны способны использовать различные кодировки, описанные в базе данных termcap/terminfo.

На стороне сервера Unix можно определить кодировку, установив переменные окружения TERM, или с помощью stty (по умолчанию используется иначе, часто эмуляции немого терминала).

На стороне клиента вам также необходимо установить ту же эмуляцию терминала, что и на стороне сервера. На родной telnet Windows есть возможность определить эмуляцию (см., Например, Configure the Telnet Terminal Type), как и другие терминальные эмуляторы (например, Putty).

Что касается ваших проектных решений: Указанные выше настройки терминала обычно описываются в документации пользователя, а не жестко закодированы в приложении, чтобы обеспечить большую гибкость. В конце концов, вы заранее не знаете, какой терминал (только простой аппаратный терминал, поддерживающий одну кодировку termcap, возможно?), Которую будут использовать ваши пользователи.

(Как ваш вопрос имеет мало общего с Java или system.in, поэтому вы можете пересмотреть теги, которые вы используете.)

Смежные вопросы