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

Select Graphic Rendition

Select Graphic Rendition (SGR, «выбор графического представления») — это управляющая последовательность (escape-последовательность) в стандарте ANSI X3.64 (ISO 6429), предназначенная для изменения внешнего вида текста в текстовых терминалах и эмуляторах терминалов. SGR позволяет задавать такие атрибуты отображения, как цвет символов и фона, интенсивность, начертание (жирный, курсив, подчёркнутый), мигание и другие визуальные эффекты. Последовательность SGR является частью более широкого набора управляющих кодов ANSI, используемых для форматирования вывода в командной строке, логах, текстовых интерфейсах и веб-терминалах.

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

Разработка стандарта ANSI X3.64 началась в 1970-х годах Американским национальным институтом стандартов (ANSI) для унификации управления текстовыми терминалами, такими как VT100 (Digital Equipment Corporation). Первая версия была опубликована в 1979 году. SGR был определён как одна из управляющих последовательностей, начинающаяся с символа ESC (код 27 в ASCII) и открывающей квадратной скобки [ (CSI — Control Sequence Introducer), за которыми следуют числовые параметры, разделённые точкой с запятой, и завершающаяся буквой m.

В 1990-е годы, с распространением персональных компьютеров и эмуляторов терминалов (xterm, PuTTY, Windows Terminal), стандарт ANSI X3.64 был расширен производителями программного обеспечения. В 2000-х годах появились расширения для 256-цветной и 24-битной (true color) палитры, которые не были частью оригинального стандарта, но стали де-факто стандартом в современных эмуляторах.

Синтаксис и структура

Базовая форма последовательности SGR выглядит следующим образом:

`` ESC [ P1 ; P2 ; ... ; Pn m ``

Где:

  • ESC — символ Escape (код 27, часто обозначается как \e или \033 в программировании).
  • [ — открывающая квадратная скобка.
  • P1, P2, ..., Pn — числовые параметры, задающие атрибуты. Параметры могут отсутствовать (тогда сбрасываются все атрибуты по умолчанию).
  • m — завершающий символ, обозначающий команду SGR.

Параметры разделяются точкой с запятой (;). Порядок параметров обычно не имеет значения, за исключением случаев, когда один параметр отменяет действие другого (например, установка цвета фона после сброса всех атрибутов).

Основные атрибуты

Стандарт ANSI X3.64 определяет несколько десятков кодов, но на практике используются лишь некоторые. Ниже приведены наиболее распространённые.

Атрибуты начертания и эффекты

КодОписаниеПримечание
0Сброс всех атрибутов к значениям по умолчаниюОбычно возвращает к стандартному шрифту, чёрному тексту на белом фоне (или наоборот).
1Жирный (bold)Увеличивает яркость или толщину символов.
2Тусклый (dim)Уменьшает яркость. Редко поддерживается.
3Курсив (italic)Наклонное начертание. Поддерживается не всеми терминалами.
4Подчёркнутый (underline)Одиночное подчёркивание.
5Медленное мигание (slow blink)Мигание с частотой менее 150 раз в минуту.
6Быстрое мигание (rapid blink)Частота более 150 раз в минуту. Редко поддерживается.
7Инверсные цвета (reverse video)Меняет местами цвет текста и фона.
8Скрытый (conceal)Делает текст невидимым (например, для ввода пароля).
9Перечёркнутый (strikethrough)Линия через текст.
21Двойное подчёркивание (double underline)Поддерживается не всеми эмуляторами.
22Отмена жирного и тусклогоВозвращает нормальную интенсивность.
23Отмена курсива
24Отмена подчёркивания
25Отмена мигания
27Отмена инверсии
28Отмена скрытого текста
29Отмена перечёркивания

Цвета

Цвета в SGR делятся на три поколения: 8/16 цветов, 256 цветов и 24-битные (true color).

8/16 цветов (стандартные коды)

Коды 30–37 задают цвет текста (foreground), коды 40–47 — цвет фона (background). Коды 90–97 и 100–107 задают яркие версии тех же цветов.

Код (текст)Код (фон)Цвет
3040Чёрный
3141Красный
3242Зелёный
3343Жёлтый
3444Синий
3545Пурпурный (Magenta)
3646Голубой (Cyan)
3747Белый
90100Ярко-чёрный (тёмно-серый)
91101Ярко-красный
92102Ярко-зелёный
93103Ярко-жёлтый
94104Ярко-синий
95105Ярко-пурпурный
96106Ярко-голубой
97107Ярко-белый

256 цветов (расширенная палитра)

Для выбора цвета из палитры в 256 оттенков используются коды 38 (текст) и 48 (фон) с дополнительным параметром 5, после которого указывается номер цвета от 0 до 255.

Формат: ESC[38;5;Nm (текст) или ESC[48;5;Nm (фон), где N — номер цвета.

Палитра состоит из:

  • 0–7: стандартные 8 цветов.
  • 8–15: яркие версии (16 цветов).
  • 16–231: 216 цветов цветового куба RGB (6×6×6).
  • 232–255: 24 оттенка серого.

24-битные цвета (true color)

Для точного задания цвета по модели RGB используются коды 38 (текст) и 48 (фон) с параметром 2, после которого указываются три числа от 0 до 255, соответствующие красному, зелёному и синему компонентам.

Формат: ESC[38;2;R;G;Bm (текст) или ESC[48;2;R;G;Bm (фон).

Поддержка true color в эмуляторах терминалов стала массовой с середины 2010-х годов. Большинство современных эмуляторов (iTerm2, Windows Terminal, Konsole, GNOME Terminal) поддерживают её, в то время как старые (xterm, PuTTY) — нет или поддерживают ограниченно.

Применение

SGR широко используется в различных областях:

  • Командная строка и оболочки (bash, zsh, PowerShell) — для раскрашивания приглашения, вывода подсказок, ошибок и предупреждений.
  • Логированиевыделение важных сообщений (ошибки красным, предупреждения жёлтым).
  • Текстовые интерфейсы (TUI) — программы вроде htop, vim, less, nano используют SGR для цветового оформления.
  • Системы непрерывной интеграции (CI/CD) — цветной вывод в логах сборок (например, в Jenkins, GitLab CI).
  • Веб-терминалы — эмуляторы терминалов в браузере (например, xterm.js) поддерживают SGR для отображения цветного вывода.
  • Инструменты разработки — компиляторы (gcc, clang), линтеры и статические анализаторы подсвечивают ошибки и предупреждения.

Примеры использования

Сброс атрибутов

`` \e[0m ``

Красный текст на жёлтом фоне

`` \e[31;43m ``

Жирный зелёный текст

`` \e[1;32m ``

256-цветный текст (цвет 196 — ярко-красный)

`` \e[38;5;196m ``

True color (оранжевый текст)

`` \e[38;2;255;165;0m ``

Комбинация атрибутов

`` \e[1;4;33m — жирный, подчёркнутый, жёлтый текст ``

Поддержка в эмуляторах терминалов

Поддержка SGR варьируется в зависимости от реализации эмулятора. Основные различия касаются:

  • Курсива и мигания — многие эмуляторы игнорируют или заменяют их.
  • 256-цветной палитры — поддерживается почти всеми современными эмуляторами.
  • True color — поддерживается большинством, но не всеми (например, в PuTTY до версии 0.76 поддержка отсутствовала).
  • Двойного подчёркивания и перечёркивания — редко реализованы.

Для проверки поддержки SGR в конкретном терминале существуют специальные скрипты (например, colortest или echo -e "\e[38;2;255;0;0mRed\e[0m").

Критика и ограничения

Основные недостатки SGR:

  • Нестандартизированность расширений — 256-цветная и true color палитры не входят в оригинальный стандарт ANSI X3.64, что приводит к несовместимости.
  • Отсутствие поддержки в некоторых средах — например, в старых эмуляторах или при выводе в файл (цветные коды отображаются как мусор).
  • Сложность чтения — последовательности SGR делают текст трудночитаемым для человека без эмулятора.
  • Проблемы с безопасностью — некорректная обработка SGR может привести к атакам типа «escape sequence injection» (внедрение управляющих последовательностей в пользовательский ввод).

См. также

  • ANSI escape code
  • Текстовый терминал
  • VT100
  • xterm

Источники

  • ANSI X3.64-1979. American National Standard for Information Systems — Additional Controls for Use with ASCII.
  • ISO/IEC 6429:1992. Information technology — Control functions for coded character sets.
  • Документация проекта xterm (Thomas E. Dickey).
  • Спецификация ECMA-48 (5th edition, 1991) — Control Functions for Coded Character Sets.
  • Статья «ANSI escape code» в английской Википедии (версия от 2023 года).

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

На главную BFOmetr →