2010-09-24 11 views
6

ISO/IEC 2022 definisce the C0 and C1 control codes. Il set C0 sono i codici noti tra 0x00 e 0x1f in ASCII, ISO-8859-1 e UTF-8 (es. ESC, CR, LF).Posso determinare se il terminale interpreta i codici di controllo C1?

Alcuni emulatori di terminale VT100 (ad esempio screen(1), PuTTY) supportano anche il set C1. Questi sono i valori compresi tra 0x80 e 0x9f (così, ad esempio, 0x84 sposta il cursore lungo una linea).

Sto visualizzando l'input fornito dall'utente. Non desidero che l'input dell'utente sia in grado di modificare lo stato del terminale (ad esempio spostare il cursore). Attualmente sto filtrando i codici dei caratteri nel set C0; tuttavia mi piacerebbe filtrare in modo condizionale anche il set C1, se il terminale li interpreterà come codici di controllo.

C'è un modo per ottenere queste informazioni da un database come termcap?

risposta

2

L'unico modo per farlo che mi viene in mente sta usando richieste C1 e testare il valore di ritorno:

$ 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 

Quelli di cui sopra sono:

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 

Il terminfo/termcap che ESR mantiene (link) ha un paio di queste richieste nelle stringhe degli utenti 7 e 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). 

Esempio:

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

Naturalmente, se si desidera solo per prevenire la corruzione di visualizzazione, è possibile utilizzare less approccio, e lasciare che l'interruttore utente tra la visualizzazione/non visualizzazione dei caratteri di controllo (-r e -R opzioni in less). Inoltre, se si conosce il proprio set di caratteri di output, i set di caratteri ISO-8859 hanno il campo C1 riservato ai codici di controllo (quindi non hanno caratteri di stampa in tale intervallo).

1

In realtà, PuTTY non sembra supportare i controlli C1.

Il modo usuale di testare questa funzione è con vttest, che fornisce voci di menu per modificare l'input e l'output separatamente per utilizzare i controlli a 8 bit. PuTTY fallisce il controllo di integrità per ciascuna di queste voci di menu e, se il controllo è disabilitato, il risultato conferma che PuTTY non rispetta tali controlli.

-1

Non penso che esista un modo semplice per interrogare se il terminale li supporta. Puoi provare brutte soluzioni di hacking (come stamparle e quindi interrogare la posizione del cursore) ma non consiglio assolutamente nulla in questo senso.

Penso che si possa semplicemente filtrare questi codici C1 incondizionatamente. Unicode dichiara comunque l'intervallo U + 0080 .. U + 009F come caratteri di controllo, non penso che dovresti mai usarli per qualcosa di diverso.

(Nota: si utilizza l'esempio 0x84 per cursore giù È infatti U+0084 codificato in qualsiasi codifica il terminale utilizza, ad esempio 0xC2 0x84 per UTF-8..)

0

Effettuare il 100% automaticamente è impegnativo al meglio. Molte, se non la maggior parte, le interfacce Unix sono intelligenti (xterm e quant'altro), ma in realtà non si sa se connesso a un ASR33 oa un PC con MSDOS in esecuzione.

enter image description here

Si potrebbe provare alcuni dei terminali sequenze di interrogatorio di fuga e timeout se non c'è risposta. Ma allora potresti dover ricorrere indietro e magari chiedere all'utente quale tipo di terminale stanno usando.