2010-09-24 23 views
6

ISO/IEC 2022 định nghĩa the C0 and C1 control codes. Tập C0 là các mã quen thuộc giữa 0x000x1f trong ASCII, ISO-8859-1 và UTF-8 (ví dụ. ESC, CR, LF).Tôi có thể xác định liệu thiết bị đầu cuối có diễn giải mã kiểm soát C1 không?

Một số trình mô phỏng đầu cuối VT100 (ví dụ: screen(1), PuTTY) cũng hỗ trợ bộ C1. Đây là các giá trị giữa 0x800x9f (ví dụ: 0x84 di chuyển con trỏ xuống một dòng).

Tôi đang hiển thị dữ liệu nhập do người dùng cung cấp. Tôi không muốn đầu vào của người dùng có thể thay đổi trạng thái thiết bị đầu cuối (ví dụ: di chuyển con trỏ). Tôi hiện đang lọc ra các mã ký tự trong tập C0; tuy nhiên tôi cũng muốn lọc ra bộ C1, nếu thiết bị đầu cuối sẽ hiểu chúng là mã kiểm soát.

Có cách nào để nhận thông tin này từ cơ sở dữ liệu như termcap không?

Trả lời

2

Cách duy nhất để làm điều đó mà tôi có thể nghĩ đến là sử dụng các yêu cầu C1 và kiểm tra giá trị trả về:

$ 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 

Những cái trên là:

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 

Các terminfo/termcap rằng ESR duy trì (link) có một vài yêu cầu này trong chuỗi người dùng 7 và 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). 

Ví dụ:

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

Tất nhiên, nếu bạn chỉ muốn ngăn chặn tham nhũng hiển thị, bạn có thể sử dụng cách tiếp cận less, và để chuyển đổi sử dụng giữa hiển thị/không hiển thị ký tự điều khiển (-r và -R tùy chọn trong less). Ngoài ra, nếu bạn biết bộ ký tự đầu ra của mình, các bộ ký tự ISO-8859 có phạm vi C1 dành riêng cho mã kiểm soát (vì vậy chúng không có ký tự in được trong phạm vi đó).

1

Thực ra, PuTTY dường như không hỗ trợ điều khiển C1.

Cách thông thường để kiểm tra tính năng này là với vttest, cung cấp các mục trình đơn để thay đổi đầu vào và đầu ra- riêng biệt để sử dụng các điều khiển 8 bit. PuTTY không kiểm tra tính chính xác cho từng mục nhập trong trình đơn đó và nếu kiểm tra bị tắt, kết quả sẽ xác nhận rằng PuTTY không tôn trọng các điều khiển đó.

-1

Tôi không nghĩ có một cách đơn giản để truy vấn xem thiết bị đầu cuối có hỗ trợ chúng hay không. Bạn có thể thử các cách giải quyết hack khó chịu (như in chúng và sau đó truy vấn vị trí con trỏ) nhưng tôi thực sự không khuyên bạn nên làm bất cứ điều gì dọc theo những dòng này.

Tôi nghĩ bạn chỉ có thể lọc ra các mã C1 vô điều kiện này. Unicode tuyên bố các U + 0080 .. U + 009F phạm vi như ký tự kiểm soát anyway, tôi không nghĩ rằng bạn nên sử dụng chúng cho bất cứ điều gì khác nhau.

(Lưu ý: bạn đã sử dụng ví dụ 0x84 cho con trỏ xuống. Thực tế là U+0084 được mã hóa trong bất kỳ mã hóa nào sử dụng thiết bị đầu cuối, ví dụ: 0xC2 0x84 cho UTF-8.)

0

Làm cho nó 100% tự động là thử thách tốt nhất. Nhiều, nếu không nhất, giao diện Unix là thông minh (xterms và whatnot), nhưng bạn không thực sự biết nếu kết nối với một ASR33 hoặc một máy tính chạy MSDOS.

enter image description here

Bạn có thể thử một số các trình tự thẩm thoát thiết bị đầu cuối và thời gian chờ nếu không có trả lời. Nhưng sau đó bạn có thể phải quay trở lại và có thể hỏi người dùng loại thiết bị đầu cuối họ đang sử dụng.

Các vấn đề liên quan