2010-09-24 10 views
6

ISO/IEC 2022 definiert the C0 and C1 control codes. Die C0-Set sind die bekannten Codes zwischen 0x00 und 0x1f in ASCII, ISO-8859-1 und UTF-8 (z. ESC, CR, LF).Kann ich feststellen, ob das Terminal die C1-Steuercodes interpretiert?

Einige VT100-Terminalemulatoren (z. B. screen(1), PuTTY) unterstützen auch den C1-Satz. Dies sind die Werte zwischen 0x80 und 0x9f (also z. B. 0x84 bewegt den Cursor eine Zeile nach unten).

Ich zeige vom Benutzer bereitgestellte Eingabe an. Ich möchte nicht, dass die Benutzereingabe den Terminalstatus ändern kann (z. B. den Cursor bewegen). Ich bin gerade dabei, die Zeichencodes im C0-Set herauszufiltern. allerdings möchte ich das C1-Set auch bedingt herausfiltern, wenn Terminal sie als Steuercodes interpretiert.

Gibt es eine Möglichkeit, diese Informationen aus einer Datenbank wie termcap zu erhalten?

Antwort

2

Der einzige Weg, es zu tun, dass ich unter Verwendung von C1-Anforderungen denken kann, und den Rückgabewert:

$ 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 

Die oben genannten sind:

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 

Die term/termcap, dass ESR hält (link) ein paar dieser Anfragen in Benutzer Saiten 7 und 9 (user7/U7, user9/U9) aufweist:

 
# 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). 

Beispiel:

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

Natürlich, wenn Sie nur eine korrupte Anzeige verhindern möchten, können Sie less Ansatz verwenden, und lassen Sie den Benutzerwechsel zwischen der Anzeige/keine Steuerzeichen angezeigt wird (-r und -R Optionen in less). Wenn Sie Ihren Ausgabe-Zeichensatz kennen, haben ISO-8859-Zeichensätze den C1-Bereich für Steuercodes reserviert (daher haben sie keine druckbaren Zeichen in diesem Bereich).

1

Tatsächlich scheint PuTTY C1-Steuerelemente nicht zu unterstützen.

Die übliche Methode zum Testen dieser Funktion ist vttest, die Menüeinträge zum Ändern der Eingabe- und Ausgabeparameter für die Verwendung von 8-Bit-Steuerelementen bietet. PuTTY versagt bei jedem dieser Menüeinträge mit der Plausibilitätsprüfung, und wenn die Prüfung deaktiviert ist, bestätigt das Ergebnis, dass PuTTY diese Steuerelemente nicht berücksichtigt.

-1

Ich glaube nicht, dass es eine direkte Möglichkeit gibt, abzufragen, ob das Terminal sie unterstützt. Sie können bösen Hacky Workarounds versuchen (wie sie drucken und dann die Cursorposition abfragen), aber ich empfehle wirklich nichts in dieser Richtung.

Ich denke, Sie könnten nur diese C1-Codes unbedingt herausfiltern. Unicode deklariert den Bereich U + 0080 .. U + 009F sowieso als Steuerzeichen, ich glaube nicht, dass Sie sie jemals für etwas anderes verwenden sollten.

(Anmerkung: Sie verwendet das Beispiel 0x84 für Cursor nach unten Es ist in der Tat U+0084 codiert in je nachdem, was das Terminal Codierung verwendet, beispielsweise für 0xC2 0x84 UTF-8..)

0

Es zu 100% automatisch zu tun, ist bestenfalls eine Herausforderung. Viele, wenn nicht die meisten Unix-Schnittstellen sind intelligent (xterms und whatnot), aber Sie wissen nicht, ob sie an einen ASR33 oder einen PC mit MSDOS angeschlossen sind.

enter image description here

Sie könnten einige der Terminalabfrage Escape-Sequenzen und Timeout versuchen, wenn es keine Antwort ist. Aber dann müssen Sie vielleicht zurückfallen und vielleicht den Benutzer fragen, welche Art von Terminal sie verwenden.

Verwandte Themen