2010-09-24 46 views
6

ISO/CEI 2022 définit the C0 and C1 control codes. L'ensemble de C0 sont les codes familiers entre 0x00 et 0x1f en ASCII, ISO-8859-1 et UTF-8 (par ex. ESC, CR, LF).Puis-je déterminer si le terminal interprète les codes de contrôle C1?

Certains émulateurs de terminal VT100 (par exemple screen(1), PuTTY) prennent également en charge l'ensemble C1. Ce sont les valeurs entre 0x80 et 0x9f (ainsi, par exemple, 0x84 déplace le curseur sur une ligne).

J'affiche une entrée fournie par l'utilisateur. Je ne souhaite pas que l'entrée de l'utilisateur puisse modifier l'état du terminal (par exemple déplacer le curseur). Je filtre actuellement les codes de caractères dans l'ensemble C0; Cependant, j'aimerais filtrer le jeu C1 de manière conditionnelle si le terminal les interprète comme des codes de contrôle.

Existe-t-il un moyen d'obtenir cette information à partir d'une base de données comme termcap?

Répondre

2

La seule façon de le faire que je peux penser à est d'utiliser des demandes de C1 et de tester la valeur de retour:

$ 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 

Ceux ci-dessus sont:

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 

Le terminfo/termcap ESR maintient (link) présente un couple de ces demandes dans les chaînes de l'utilisateur 7 et 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). 

Exemple:

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

Bien sûr, si vous ne souhaitez que pour prévenir la corruption d'affichage, vous pouvez utiliser l'approche less, et laisser le changement d'utilisateur entre l'affichage/ne pas afficher les caractères de contrôle (-r et -R options dans less). De même, si vous connaissez votre jeu de caractères de sortie, les jeux de caractères ISO-8859 ont la plage C1 réservée aux codes de contrôle (ils n'ont donc pas de caractères imprimables dans cette plage).

1

En fait, PuTTY ne semble pas supporter les contrôles C1.

La manière habituelle de tester cette fonctionnalité est avec vttest, qui fournit des entrées de menu pour changer l'entrée et la sortie séparément pour utiliser les commandes 8 bits. PuTTY échoue le contrôle de santé pour chacune de ces entrées de menu, et si la vérification est désactivée, le résultat confirme que PuTTY n'honore pas ces contrôles.

-1

Je ne pense pas qu'il existe un moyen simple d'interroger si le terminal les prend en charge. Vous pouvez essayer des solutions de contournement hacky méchantes (comme les imprimer et ensuite interroger la position du curseur), mais je ne recommande vraiment rien dans ce sens.

Je pense que vous pourriez simplement filtrer ces codes C1 inconditionnellement. Unicode déclare la gamme U + 0080 .. U + 009F comme des caractères de contrôle de toute façon, je ne pense pas que vous devriez les utiliser pour quelque chose de différent.

(Note: vous avez utilisé l'exemple 0x84 pour curseur vers le bas Il est en fait U+0084 codé dans le terminal selon encodant utilise, par exemple 0xC2 0x84 pour UTF-8..

0

Faire 100% automatique est au mieux difficile. Beaucoup, sinon la plupart des interfaces Unix sont intelligentes (xterms et autres joyeusetés), mais vous ne savez pas si elles sont connectées à un ASR33 ou à un PC exécutant MSDOS.

enter image description here

Vous pouvez essayer quelques-unes des séquences d'échappement d'interrogation du terminal et délai d'attente s'il n'y a pas de réponse. Mais alors vous devrez peut-être revenir en arrière et peut-être demander à l'utilisateur quel type de terminal ils utilisent.