В вычислительной технике и телекоммуникациях управляющий символ или непечатаемый символ ( NPC ) — это кодовая точка в наборе символов , которая не представляет собой письменный символ или символ. Они используются в качестве внутриполосной сигнализации для создания эффектов, отличных от добавления символа к тексту. Все остальные символы в основном являются графическими символами , также известными как печатные символы (или печатаемые символы ), за исключением, возможно, символов « пробел ». В стандарте ASCII существует 33 управляющих символа, например, код 7, BEL , который звонит в терминальный звонок.
Процедурные знаки в азбуке Морзе являются разновидностью управляющих знаков.
Форма управляющих символов была введена в коде Бодо 1870 года : NUL и DEL. Код Мюррея 1901 года добавил возврат каретки (CR) и перевод строки (LF), а другие версии кода Бодо включали другие управляющие символы.
Символ колокольчика (BEL), который звонил в колокольчик, предупреждая операторов, также был одним из первых символов управления телетайпом .
Некоторые управляющие символы также называются «эффекторами формата».
Было определено довольно много управляющих символов (33 в ASCII, а стандарт ECMA-48 добавляет еще 32). Это было связано с тем, что ранние терминалы имели очень примитивные механические или электрические элементы управления, из-за которых реализация любого вида API с запоминанием состояния была довольно дорогой, поэтому отдельный код для каждой функции выглядел как требование. Быстро стало возможным и недорогим интерпретировать последовательности кодов для выполнения функции, и производители устройств нашли способ отправлять сотни инструкций устройству. В частности, они использовали код ASCII 27 10 (escape), за которым следовала серия символов, называемая «управляющей последовательностью» или «escape-последовательностью». Механизм был изобретен Бобом Бемером , отцом ASCII. Например, последовательность кода 27 10 , за которой следовали печатные символы «[2;10H», заставляла терминал VT100 Digital Equipment Corporation перемещать курсор в 10-ю ячейку 2-й строки экрана. Для этих последовательностей существует несколько стандартов, в частности ANSI X3.64 . Однако число нестандартных вариаций в использовании велико, особенно в сфере печати, где технологии развиваются гораздо быстрее, чем любой орган стандартизации может за ними угнаться.
Все записи в таблице ASCII ниже кода 32 10 (технически набор управляющих кодов C0 ) относятся к этому типу, включая CR и LF, используемые для разделения строк текста. Код 127 10 ( DEL ) также является управляющим символом. [1] [2] Расширенные наборы ASCII , определенные ISO 8859, добавили коды 128 10 по 159 10 в качестве управляющих символов. Это было сделано в первую очередь для того, чтобы при удалении старшего бита печатный символ не изменялся на управляющий код C0. Этот второй набор называется набором C1 .
Эти 65 управляющих кодов были перенесены в Unicode . Unicode добавил больше символов, которые можно было бы считать управляющими, но он проводит различие между этими «символами форматирования» (такими как необъединяющий символ нулевой ширины ) и 65 управляющими символами.
Набор символов расширенного двоично-десятичного кода обмена (EBCDIC) содержит 65 управляющих кодов, включая все управляющие коды ASCII, а также дополнительные коды, которые в основном используются для управления периферийными устройствами IBM.
Управляющие символы ASCII, которые по-прежнему широко используются, включают:
Управляющие символы могут быть описаны как выполняющие что-то, когда их вводит пользователь, например, код 3 ( символ конца текста , ETX, ^C ) для прерывания запущенного процесса или код 4 ( символ конца передачи , EOT, ^D ), используемый для завершения ввода текста в Unix или выхода из оболочки Unix . Эти применения обычно имеют мало общего с их использованием, когда они находятся в выводимом тексте.
В Unicode "Control-characters" — это U+0000—U+001F (C0 controls), U+007F (delete) и U+0080—U+009F (C1 controls). Их общая категория — "Cc". Коды форматирования отличаются, в общей категории — "Cf". Управляющие символы Cc не имеют имени в Unicode, но вместо этого им присваиваются метки, например "<control-001A>". [4]
Существует ряд методов отображения непечатаемых символов, которые можно проиллюстрировать на примере символа колокольчика в кодировке ASCII :
Клавиатуры на основе ASCII имеют клавишу с надписью " Control ", "Ctrl" или (реже) "Cntl", которая используется во многом как клавиша Shift, нажимаемая в сочетании с другой буквой или символьной клавишей. В одной реализации клавиша Control генерирует код на 64 позиции ниже кода для (обычно) заглавной буквы, с которой она нажимается в сочетании (т. е. вычитает 0x40 из значения кода ASCII (обычно) заглавной буквы). Другая реализация заключается в том, чтобы взять код ASCII, созданный клавишей, и выполнить побитовую операцию AND с 0x1F, принудительно обнуляя биты с 5 по 7. Например, нажатие "control" и буквы "g" (которая равна 0110 0111 в двоичной системе ) создает код 7 (BELL, 7 в десятичной системе или 0000 0111 в двоичной системе). Символ NULL (код 0) представлен как Ctrl-@, где "@" является кодом непосредственно перед "A" в наборе символов ASCII. Для удобства некоторые терминалы принимают Ctrl-Space как псевдоним для Ctrl-@. В любом случае это создает один из 32 кодов управления ASCII от 0 до 31. Ни один из подходов не работает для создания символа DEL из-за его особого расположения в таблице и его значения (код 127 10 ), Ctrl-? иногда используется для этого символа. [5]
При удержании клавиши управления буквенные клавиши производят те же управляющие символы независимо от состояния клавиш Shift или Caps Lock . Другими словами, не имеет значения, будет ли клавиша производить заглавную или строчную букву. Интерпретация клавиши управления с пробелом, графическими символами и цифровыми клавишами (коды ASCII от 32 до 63) различается в разных системах. Некоторые будут производить тот же код символа, как если бы клавиша управления не была нажата. Другие системы преобразуют эти клавиши в управляющие символы, когда клавиша управления удерживается. Интерпретация клавиши управления с не-ASCII («внешними») клавишами также различается в разных системах.
Управляющие символы часто отображаются в печатной форме, известной как обозначение каретки , путем печати каретки (^), а затем символа ASCII, который имеет значение управляющего символа плюс 64. Управляющие символы, созданные с помощью буквенных клавиш, таким образом отображаются в форме заглавной буквы. Например, ^G представляет код 7, который создается при нажатии клавиши G, когда удерживается клавиша управления.
Клавиатуры также обычно имеют несколько отдельных клавиш, которые производят коды управляющих символов. Например, клавиша с надписью «Backspace» обычно производит код 8, «Tab» — код 9, «Enter» или «Return» — код 13 (хотя некоторые клавиатуры могут производить код 10 для «Enter»).
Многие клавиатуры включают клавиши, которые не соответствуют ни одному печатному или управляющему символу ASCII, например, стрелки управления курсором и функции обработки текста . Соответствующие нажатия клавиш передаются компьютерным программам одним из четырех методов: присваивание иным образом неиспользуемых управляющих символов; использование некоторой кодировки, отличной от ASCII; использование многосимвольных управляющих последовательностей; или использование дополнительного механизма вне генерации символов. «Глупые» компьютерные терминалы обычно используют управляющие последовательности. Клавиатуры, подключенные к автономным персональным компьютерам, изготовленным в 1980-х годах, обычно используют один (или оба) из первых двух методов. Современные компьютерные клавиатуры генерируют скан-коды , которые идентифицируют конкретные физические клавиши, которые нажимаются; затем компьютерное программное обеспечение определяет, как обрабатывать нажатые клавиши, включая любой из четырех методов, описанных выше.
Управляющие символы были разработаны таким образом, чтобы их можно было разделить на несколько групп: управление печатью и отображением, структурирование данных, управление передачей и прочее.
Печать символов управления впервые использовалась для управления физическим механизмом принтеров, самого раннего устройства вывода. Ранним примером этой идеи было использование цифр (FIGS) и букв (LTRS) в коде Бодо для переключения между двумя кодовыми страницами. Более поздним, но все еще ранним примером были внеполосные символы управления кареткой ASA . Позже управляющие символы были интегрированы в поток данных для печати. Символ возврата каретки (CR), отправленный на такое устройство, заставляет его поместить символ на край бумаги, с которого начинается письмо (он может или не может также переместить позицию печати на следующую строку). Символ перевода строки (LF/NL) заставляет устройство поместить позицию печати на следующую строку. Он может (или не может), в зависимости от устройства и его конфигурации, также переместить позицию печати в начало следующей строки (что будет крайней левой позицией для шрифтов слева направо , таких как алфавиты, используемые для западных языков, и крайней правой позицией для шрифтов справа налево, таких как еврейский и арабский алфавиты). Символы вертикальной и горизонтальной табуляции (VT и HT/TAB) заставляют устройство вывода перемещать позицию печати на следующую позицию табуляции в направлении чтения. Символ подачи страницы (FF/NP) начинает новый лист бумаги и может перемещаться или не перемещаться на начало первой строки. Символ возврата на одну позицию (BS) перемещает позицию печати на одну позицию назад. На принтерах, включая терминалы для печати на бумажных носителях , это чаще всего используется для того, чтобы принтер мог напечатать символы поверх других, обычно недоступных, символов. На видеотерминалах и других электронных устройствах вывода часто существуют программные (или аппаратные) конфигурации, которые допускают деструктивный возврат на одну позицию (например, последовательность BS, SP, BS), который стирает, или неразрушающий, который не стирает. Символы сдвига вперед и выхода назад (SI и SO) выбирают альтернативные наборы символов, шрифты, подчеркивание или другие режимы печати. Escape-последовательности часто использовались для того же самого.
С появлением компьютерных терминалов , которые физически не печатали на бумаге и, таким образом, предлагали большую гибкость в отношении размещения экрана, стирания и т. д., были адаптированы коды управления печатью. Например, подача листа обычно очищала экран, поскольку не было новой страницы бумаги, на которую можно было бы перейти. Были разработаны более сложные управляющие последовательности, чтобы воспользоваться гибкостью новых терминалов и, конечно, новых принтеров. Концепция управляющего символа всегда была несколько ограниченной, и была чрезвычайно ограниченной при использовании с новым, гораздо более гибким оборудованием. Управляющие последовательности (иногда реализованные как управляющие последовательности) могли соответствовать новой гибкости и мощности и стали стандартным методом. Однако существовало и остается большое разнообразие стандартных последовательностей на выбор.
Разделители (Файл, Группа, Запись и Единица: FS, GS, RS и US) были созданы для структурирования данных, обычно на ленте, чтобы имитировать перфокарты . Конец носителя (EM) предупреждает, что лента (или другой носитель записи) заканчивается. Хотя многие системы используют CR/LF и TAB для структурирования данных, в данных, которые необходимо структурировать, можно встретить управляющие символы разделителя. Управляющие символы разделителя не перегружены; они не имеют общего назначения, за исключением разделения данных на структурированные группы. Их числовые значения смежны с символом пробела, который можно считать членом группы, как разделителем слов.
Например, разделитель RS используется RFC 7464 (JSON Text Sequences) для кодирования последовательности элементов JSON. Каждый элемент последовательности начинается с символа RS и заканчивается переводом строки. Это позволяет сериализовать открытые последовательности JSON. Это один из протоколов потоковой передачи JSON .
Символы управления передачей предназначались для структурирования потока данных и управления повторной передачей или корректным отказом по мере необходимости в случае ошибок передачи.
Символ начала заголовка (SOH) должен был отмечать не-данный раздел потока данных — часть потока, содержащую адреса и другие служебные данные. Символ начала текста (STX) обозначал конец заголовка и начало текстовой части потока. Символ конца текста (ETX) обозначал конец данных сообщения. Широко используемое соглашение заключается в том, чтобы сделать два символа, предшествующих ETX, контрольной суммой или CRC для целей обнаружения ошибок. Символ конца блока передачи (ETB) использовался для обозначения конца блока данных, где данные были разделены на такие блоки для целей передачи.
Символ escape ( ESC ) был предназначен для "цитирования" следующего символа, если это был другой управляющий символ, он печатал его вместо выполнения функции управления. Сегодня он почти никогда не используется для этой цели. Различные печатаемые символы используются как видимые " символы escape ", в зависимости от контекста.
Символ замены ( SUB ) был предназначен для запроса перевода следующего символа из печатаемого символа в другое значение, обычно путем установки бита 5 в ноль. Это удобно, поскольку некоторые носители (например, листы бумаги, производимые пишущими машинками) могут передавать только печатаемые символы. Однако в системах MS-DOS с файлами, открытыми в текстовом режиме, «конец текста» или «конец файла» обозначается этим символом Ctrl-Z вместо Ctrl-C или Ctrl-D , которые распространены в других операционных системах.
Символ отмены ( CAN ) сигнализирует о том, что предыдущий элемент следует отбросить. Символ отрицательного подтверждения ( NAK ) — это определенный флаг, обычно указывающий на то, что прием был проблемным, и часто на то, что текущий элемент следует отправить снова. Символ подтверждения ( ACK ) обычно используется как флаг, указывающий на то, что с текущим элементом не обнаружено никаких проблем.
Когда среда передачи является полудуплексной (то есть может передавать только в одном направлении одновременно), обычно есть главная станция, которая может передавать в любое время, и одна или несколько подчиненных станций, которые передают, когда у них есть разрешение. Символ запроса ( ENQ ) обычно используется главной станцией, чтобы попросить подчиненную станцию отправить следующее сообщение. Подчиненная станция указывает, что она завершила передачу, отправляя символ конца передачи ( EOT ).
Коды управления устройством (DC1–DC4) изначально были общими и должны были реализовываться по мере необходимости каждым устройством. Однако универсальная потребность в передаче данных заключается в том, чтобы просить отправителя прекратить передачу, когда получатель временно не может принимать больше данных. Корпорация Digital Equipment Corporation изобрела соглашение, которое использовало 19 (символ управления устройством 3 ( DC3 ), также известный как control-S или XOFF ) для начала передачи «S» и 17 (символ управления устройством 1 ( DC1 ), также известный как control-Q или XON ) для начала передачи. Он стал настолько широко использоваться, что большинство не осознает, что он не является частью официального ASCII. Этот метод, как бы он ни был реализован, позволяет избежать дополнительных проводов в кабеле данных, предназначенных только для управления передачей, что экономит деньги. Однако необходимо использовать разумный протокол для использования таких сигналов управления потоком передачи, чтобы избежать потенциальных условий тупика.
Символ выхода из канала передачи данных ( DLE ) был предназначен для передачи другому концу канала передачи данных сигнала о том, что следующий символ является управляющим символом, таким как STX или ETX. Например, пакет может быть структурирован следующим образом ( DLE ) <STX> <PAYLOAD> ( DLE ) <ETX>.
Код 7 ( BEL ) предназначен для подачи звукового сигнала на принимающий терминал. [6]
Многие из управляющих символов ASCII были разработаны для устройств того времени, которые сегодня встречаются нечасто. Например, код 22, «синхронный холостой ход» ( SYN ), изначально отправлялся синхронными модемами (которые должны были постоянно отправлять данные), когда фактических данных для отправки не было. (Современные системы обычно используют стартовый бит для объявления начала передаваемого слова — это особенность асинхронной связи. Синхронные каналы связи чаще встречались в мэйнфреймах, где они обычно работали по корпоративным арендованным линиям для соединения мэйнфрейма с другим мэйнфреймом или, возможно, с мини-компьютером.)
Код 0 (кодовое имя ASCII NUL ) — это особый случай. В бумажной ленте это тот случай, когда нет отверстий. Удобно рассматривать его как символ заполнения , не имеющий иного смысла. Поскольку позиция символа NUL не имеет пробитых отверстий, его можно заменить любым другим символом позже, поэтому он обычно использовался для резервирования места, либо для исправления ошибок, либо для вставки информации, которая будет доступна позже или в другом месте. В вычислениях он часто используется для заполнения записей фиксированной длины ; для обозначения конца строки ; и ранее для предоставления печатающим устройствам достаточного времени для выполнения функции управления .
Код 127 ( DEL , он же «rubout») также является особым случаем. Его 7-битный код является двоичным , что по сути стирает ячейку символа на бумажной ленте при перепрошивке. Бумажная лента была обычным носителем информации, когда был разработан ASCII, с вычислительной историей, восходящей к оборудованию для взлома кодов Второй мировой войны в Biuro Szyfrów . Бумажная лента устарела в 1970-х годах, поэтому этот умный аспект ASCII редко использовался после этого. Некоторые системы (например, оригинальные Apple) преобразовали его в символ возврата на одну позицию. Но поскольку его код находится в диапазоне, занимаемом другими печатаемыми символами, и поскольку ему не был официально назначен глиф, многие поставщики компьютерного оборудования использовали его в качестве дополнительного печатаемого символа (часто полностью черный символ «ящика», полезный для стирания текста путем перепечатки чернилами).
Нестираемые программируемые ПЗУ обычно реализуются как массивы плавких элементов, каждый из которых представляет бит , который может быть переключен только одним способом, обычно с единицы на ноль. В таких ПЗУ символы DEL и NUL могут использоваться так же, как они использовались на перфоленте: один для резервирования бессмысленных байтов заполнения, которые могут быть записаны позже, а другой для преобразования записанных байтов в бессмысленные байты заполнения. Для ПЗУ, которые переключают единицу на ноль, роли NUL и DEL меняются местами; кроме того, DEL будет работать только с 7-битными символами, которые сегодня используются редко; для 8-битного содержимого вместо DEL может использоваться код символа 255, обычно определяемый как неразрывный пробельный символ.
Многие файловые системы не допускают использования управляющих символов в именах файлов , поскольку они могут иметь зарезервированные функции.