Открыть сервис

Control Sequence Introducer

Control Sequence Introducer (CSI) — это управляющая последовательность в стандарте ANSI X3.64 (ECMA-48), используемая для передачи команд терминалу или эмулятору терминала. CSI является частью семейства escape-последовательностей, которые позволяют управлять отображением текста, положением курсора, цветами, атрибутами и другими параметрами вывода на текстовых терминалах и в консольных приложениях. Последовательность CSI начинается с символа ESC (код 27 в десятичной системе, 0x1B в шестнадцатеричной) и символа [ (левая квадратная скобка), что в совокупности записывается как ESC[ или \x1b[ в программном коде.

История и стандартизация

Происхождение CSI связано с развитием текстовых терминалов в 1970-х годах. Первоначально escape-последовательности использовались для управления такими устройствами, как VT52 (Digital Equipment Corporation, DEC). В 1978 году DEC выпустила терминал VT100, который стал основой для стандарта ANSI X3.64-1979, позже принятого как международный стандарт ECMA-48. CSI был введён как универсальный способ передачи команд, заменив более ранние, менее структурированные последовательности.

Стандарт ECMA-48 (ныне ISO/IEC 6429) определяет CSI как часть набора управляющих последовательностей C1 (Control Functions for Coded Character Sets). В этом стандарте CSI обозначается как управляющий символ с кодом 0x9B в 8-битной кодировке, однако в 7-битной среде (например, ASCII) он представляется двумя символами: ESC (0x1B) и [ (0x5B). Такой дуализм связан с историческими ограничениями: 7-битные каналы передачи данных не могли передавать символы с кодами выше 127.

В СССР и России стандарт ANSI X3.64 был адаптирован как ГОСТ 27465-87 (система обработки информации, кодирование символов, управляющие функции), который регламентировал использование CSI в отечественных терминалах, таких как «Электроника 85» и «Видеотон». В современных операционных системах, включая Linux, macOS и Windows (начиная с Windows 10), CSI поддерживается на уровне консольного драйвера или эмулятора терминала.

Структура последовательности CSI

Формат CSI-последовательности имеет следующий синтаксис:

`` CSI [P1;P2;...Pn] [I] F ``

Где:

  • CSI — начальная последовательность (ESC[ или 0x9B).
  • P1;P2;...Pn — необязательные числовые параметры, разделённые точкой с запятой (;). Если параметр опущен, он принимает значение по умолчанию (обычно 1 или 0). Параметры могут быть десятичными числами от 0 до 65535.
  • I — необязательный промежуточный символ (intermediate byte), который расширяет функциональность. В стандарте ECMA-48 определены промежуточные символы из диапазона 0x20–0x2F (пробел, цифры и знаки препинания).
  • F — завершающий символ (final byte), который определяет конкретную команду. Завершающие символы находятся в диапазоне 0x40–0x7E (например, A, B, H, m, J).

Примеры:

  • ESC[2J — очистка экрана (параметр 2, завершающий символ J).
  • ESC[1;31m — установка красного цвета текста (параметр 1 — яркость, параметр 31 — красный, завершающий символ m).
  • ESC[10;20H — перемещение курсора на строку 10, столбец 20 (завершающий символ H).

Классификация команд CSI

Команды CSI делятся на несколько категорий в зависимости от их назначения. Ниже приведены основные группы с примерами.

Управление курсором

Эти команды перемещают курсор или изменяют его положение на экране. Они широко используются в текстовых интерфейсах и редакторах.

КомандаОписаниеПример
CПеремещение курсора вправо на N столбцовESC[5C — на 5 вправо
DПеремещение курсора влево на N столбцовESC[3D — на 3 влево
AПеремещение курсора вверх на N строкESC[2A — на 2 строки вверх
BПеремещение курсора вниз на N строкESC[1B — на 1 строку вниз
HПрямое позиционирование курсора (строка, столбец)ESC[5;10H — строка 5, столбец 10
fАльтернативное позиционирование (аналогично H)ESC[1;1f — левый верхний угол

Управление отображением и стилями

Команды с завершающим символом m (Select Graphic Rendition, SGR) задают атрибуты текста: цвет, насыщенность, подчёркивание, мигание и другие.

ПараметрАтрибутПример
0Сброс всех атрибутовESC[0m
1Яркий (жирный) текстESC[1m
4Подчёркнутый текстESC[4m
5Мигающий текстESC[5m
7Инвертированные цветаESC[7m
30–37Цвет текста (чёрный, красный, зелёный, жёлтый, синий, пурпурный, голубой, белый)ESC[31m — красный
40–47Цвет фонаESC[42m — зелёный фон
90–97Яркий цвет текстаESC[91m — ярко-красный
100–107Яркий цвет фонаESC[102m — ярко-зелёный фон

Пример комбинации: ESC[1;31;42m — яркий красный текст на зелёном фоне.

Управление экраном и буфером

Команды с завершающим символом J (Erase in Display) и K (Erase in Line) очищают части экрана или строки.

КомандаПараметрОписание
J0Очистка от курсора до конца экрана
J1Очистка от начала экрана до курсора
J2Очистка всего экрана
K0Очистка от курсора до конца строки
K1Очистка от начала строки до курсора
K2Очистка всей строки

Управление режимами терминала

Команды с завершающим символом h (Set Mode) и l (Reset Mode) включают или отключают различные режимы терминала, такие как режим вставки, автоматический перенос строк, курсор и другие.

ПараметрРежимОписание
4Insert ModeВключение режима вставки
20Auto NewlineАвтоматический перевод строки
25Cursor VisibleПоказывать курсор
7Line WrapАвтоматический перенос строк

Пример: ESC[?25l — скрыть курсор (параметр 25, режим сброса).

Применение CSI

Консольные приложения и эмуляторы терминалов

CSI широко используется в операционных системах для создания текстовых интерфейсов. В Linux и macOS эмуляторы терминалов (например, xterm, GNOME Terminal, iTerm2) поддерживают ANSI-последовательности, включая CSI. В Windows, начиная с версии 10, консоль также поддерживает CSI, что позволило унифицировать разработку кроссплатформенных приложений.

Программирование и библиотеки

В языках программирования CSI часто применяется для вывода форматированного текста. Например, в Python: ``python print("\x1b[1;32mЗелёный жирный текст\x1b[0m") `` В C и C++ используются макросы или строки с escape-последовательностями. Библиотеки, такие как ncurses (Linux) и PDCurses (Windows), абстрагируют работу с CSI, предоставляя высокоуровневый API.

Текстовые редакторы и утилиты

Редакторы, такие как Vim, Emacs, и утилиты вроде less и top, активно используют CSI для обновления экрана, цветовой подсветки и управления курсором. Например, в Vim команда :highlight устанавливает цвета через SGR-последовательности.

Игры и анимации

В консольных играх и демосценах CSI применяется для создания анимаций, рисования графики (ASCII-арт) и управления цветами. Например, игра «Rogue» (1980) использовала CSI для перемещения курсора, а современные проекты, такие как «Dwarf Fortress», используют CSI для отображения сложных интерфейсов.

Проблемы и ограничения

Совместимость

Не все терминалы и эмуляторы полностью поддерживают CSI. Некоторые старые терминалы (например, VT52) используют собственные escape-последовательности, отличные от ANSI. В современных системах эмуляторы могут иметь различия в реализации: например, в Windows 10 до обновления 2018 года поддержка CSI была ограниченной.

Безопасность

CSI-последовательности могут быть использованы для атак на терминалы, известных как «терминальные инъекции» (terminal injection). Злоумышленник может внедрить CSI в вывод программы, чтобы изменить отображение, скрыть данные или выполнить произвольные команды (например, через последовательности, управляющие буфером). В связи с этим в некоторых системах (например, в браузерах) CSI-последовательности фильтруются или экранируются.

Производительность

В приложениях с интенсивным выводом (например, видео в терминале) частое использование CSI может приводить к задержкам из-за обработки последовательностей драйвером терминала. Для оптимизации применяются буферизация и пакетная отправка команд.

Интересные факты

  • CSI-последовательности используются в протоколах удалённого доступа, таких как SSH и Telnet, для передачи управляющих команд между клиентом и сервером.
  • В стандарте ECMA-48 определено более 100 различных команд CSI, но на практике используется около 30–40.
  • В России CSI применялся в терминалах «Электроника 85» (аналог VT100) и в системе «Видеотон» для отображения текстовой информации.
  • В современных эмуляторах терминалов (например, Alacritty, Kitty) поддержка CSI расширена за счёт дополнительных последовательностей, не входящих в стандарт (например, для управления цветовой палитрой True Color).

Источники

  1. ECMA International. Standard ECMA-48: Control Functions for Coded Character Sets. 5th edition, 1991.
  2. ISO/IEC 6429:1992. Information technology — Control functions for coded character sets.
  3. Digital Equipment Corporation. VT100 User Guide. 1979.
  4. ГОСТ 27465-87. Системы обработки информации. Кодирование символов. Управляющие функции.
  5. Shill, R. (2021). ANSI Escape Sequences: A Comprehensive Guide. GitHub Repository.
  6. FreeBSD Documentation Project. Terminal Control Sequences. 2023.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →