gpt4 book ai didi

unix - 我能否确定终端是否解释 C1 控制代码?

转载 作者:行者123 更新时间:2023-12-02 12:22:19 24 4
gpt4 key购买 nike

ISO/IEC 2022 定义 the C0 and C1 control codes 。 C0 集是 ASCII、ISO-8859-1 和 UTF-8 中 0x000x1f 之间熟悉的代码(例如 ESC、< kbd>CR,LF)。

一些 VT100 终端仿真器(例如 screen(1)、PuTTY)也支持 C1 集。这些是 0x800x9f 之间的值(例如,0x84 将光标向下移动一行)。

我正在显示用户提供的输入。我不希望用户输入能够改变终端状态(例如移动光标)。我目前正在过滤掉C0集中的字符编码;但是,如果终端将它们解释为控制代码,我也想有条件地过滤掉 C1 集。

有没有办法从 termcap 等数据库获取此信息?

最佳答案

我能想到的唯一方法是使用 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

ESR 维护的 terminfo/termcap ( 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选项>更少)。另外,如果您知道输出字符集,ISO-8859 字符集为控制代码保留了 C1 范围(因此它们在该范围内没有可打印的字符)。

关于unix - 我能否确定终端是否解释 C1 控制代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3787804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com