Могу ли я определить, интерпретирует ли терминал управляющие коды C1? - PullRequest
6 голосов
/ 24 сентября 2010

ИСО / МЭК 2022 определяет управляющие коды C0 и C1 .Набор C0 - это знакомые коды между 0x00 и 0x1f в ASCII, ISO-8859-1 и UTF-8 (например, ESC , CR , LF).

Некоторые эмуляторы терминала VT100 (например, screen(1), PuTTY) также поддерживают набор C1.Это значения между 0x80 и 0x9f (например, 0x84 перемещает курсор вниз по строке).

Я отображаю вводимые пользователем данные.Я не хочу, чтобы пользовательский ввод мог изменять состояние терминала (например, перемещать курсор).В настоящее время я отфильтровываю коды символов в наборе C0;однако я хотел бы также условно отфильтровать набор C1, если терминал будет интерпретировать их как управляющие коды.

Есть ли способ получить эту информацию из базы данных, такой как termcap?

Ответы [ 4 ]

2 голосов
/ 09 ноября 2010

Единственный способ сделать это, о котором я могу подумать, - это использовать запросы C1 и проверить возвращаемое значение:

$ echo `echo -en "\x9bc"`
^[[?1;2c
$ echo `echo -e "\x9b5n"`
^[[0n
$ echo `echo -e "\x9b6n"`
^[[39;1R
$ echo `echo -e "\x9b0x" `
^[[2;1;1;112;112;1;0x

Вышеуказанные:

CSI c      Primary DA; request Device Attributes
CSI 5 n    DSR; Device Status Report
CSI 6 n    CPR; Cursor Position Report
CSI 0 x    DECREQTPARM; Request Terminal Parameters

terminfo /У termcap, который поддерживает ESR ( link ), есть пара таких запросов в пользовательских строках 7 и 9 (user7 / u7, user9 / u9):

# INTERPRETATION OF USER CAPABILITIES
#
# The System V Release 4 and XPG4 terminfo format defines ten string
# capabilities for use by applications, ....   In this file, we use
# certain of these capabilities to describe functions which are not covered
# by terminfo.  The mapping is as follows:
#
#       u9      terminal enquire string (equiv. to ANSI/ECMA-48 DA)
#       u8      terminal answerback description
#       u7      cursor position request (equiv. to VT100/ANSI/ECMA-48 DSR 6)
#       u6      cursor position report (equiv. to ANSI/ECMA-48 CPR)
#
# The terminal enquire string  should elicit an answerback response
# from the terminal.  Common values for  will be ^E (on older ASCII
# terminals) or \E[c (on newer VT100/ANSI/ECMA-48-compatible terminals).
#
# The cursor position request () string should elicit a cursor position
# report.  A typical value (for VT100 terminals) is \E[6n.
#
# The terminal answerback description (u8) must consist of an expected
# answerback string.  The string may contain the following scanf(3)-like
# escapes:
#
#       %c      Accept any character
#       %[...]  Accept any number of characters in the given set
#
# The cursor position report () string must contain two scanf(3)-style
# %d format elements.  The first of these must correspond to the Y coordinate
# and the second to the %d.  If the string contains the sequence %i, it is
# taken as an instruction to decrement each value after reading it (this is
# the inverse sense from the cup string).  The typical CPR value is
# \E[%i%d;%dR (on VT100/ANSI/ECMA-48-compatible terminals).
#
# These capabilities are used by tac(1m), the terminfo action checker
# (distributed with ncurses 5.0).

Пример:

$ echo `tput u7`
^[[39;1R
$ echo `tput u9`
^[[?1;2c

Конечно, если вы хотите предотвратить повреждение экрана, вы можете использовать подход less и позволить пользователю переключаться между отображением / отсутствием отображения управляющих символов (опции -r и -Rв less).Кроме того, если вы знаете свою выходную кодировку, кодировки ISO-8859 имеют диапазон C1, зарезервированный для управляющих кодов (поэтому у них нет печатных символов в этом диапазоне).

1 голос
/ 12 марта 2015

На самом деле PuTTY не поддерживает элементы управления C1.

Обычный способ тестирования этой функции - vttest , который предоставляет пункты меню для изменения входа и выхода отдельно для использования 8-битных элементов управления. PuTTY не проходит проверку исправности для каждого из этих пунктов меню, и если проверка отключена, результат подтверждает, что PuTTY не соблюдает эти элементы управления.

0 голосов
/ 23 апреля 2015

Автоматическое выполнение 100% в лучшем случае является сложной задачей.Многие, если не большинство, интерфейсы Unix умные (xterms и еще много чего), но вы на самом деле не знаете, подключены ли они к ASR33 или к ПК с MSDOS.

enter image description here

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

0 голосов
/ 23 апреля 2015

Я не думаю, что есть простой способ узнать, поддерживает ли их терминал. Вы можете попробовать неприятные хакерские обходные пути (например, распечатать их, а затем запросить позицию курсора), но я действительно не рекомендую ничего делать в этом направлении.

Я думаю, вы могли бы просто отфильтровать эти коды C1 безоговорочно. Unicode объявляет диапазон U + 0080 .. U + 009F в качестве управляющих символов в любом случае, я не думаю, что вы должны когда-либо использовать их для чего-то другого.

(Примечание: вы использовали пример 0x84 для курсора вниз. Фактически он U+0084 закодирован в той кодировке, которую использует терминал, например, 0xC2 0x84 для UTF-8.)

...