Введение

Кодовый пункт в наборе символов, который не представляет графический символ.

В вычислительной технике и телекоммуникациях контрольный символ или непечатаемый символ (NPC) — это кодовый пункт в наборе символов, который не представляет письменный символ или графическое изображение. Они используются для передачи управляющих сигналов, вызывающих эффекты, отличные от добавления символа в текст. Все остальные символы в основном являются графическими символами, также известными как печатаемые символы, за исключением, возможно, символов пробела. В стандарте ASCII существует 33 контрольных символа, например, код 7, который подаёт звуковой сигнал на терминале.

История

Процедурные сигналы в коде Морзе являются формой управляющего символа. Управляющие символы впервые появились в коде Бодо 1870-х годов: NUL и DEL. Код Мюррея 1901 года добавил возврат каретки (CR) и перевод строки (LF), а другие версии кода Бодо включали и другие управляющие символы. Символ звонка (BEL), который подавал звуковой сигнал для оповещения операторов, также был одним из ранних управляющих символов телетайпа. Некоторые управляющие символы также называются "форматирующими символами".

В Юникоде

В Юникоде "символы управления" включают диапазон U+0000–U+001F (управление C0), U+007F (удаление) и U+0080–U+009F (управление C1). Их общая категория – "Cc". Коды форматирования имеют отдельную общую категорию – "Cf". Символы управления Cc не имеют имени в Юникоде, вместо имени им присваиваются обозначения, такие как "<control 001A>".

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

Клавиатуры на основе ASCII имеют клавишу с надписью "Control", "Ctrl" или (редко) "Cntl", которая используется аналогично клавише Shift, нажимая в сочетании с другой буквой или символом. В одной реализации клавиша управления генерирует код на 64 позиции ниже кода для (обычно) заглавной буквы, с которой она нажата в комбинации (то есть, вычитает 0x40 из значения кода ASCII (обычно) заглавной буквы). Другая реализация заключается в том, чтобы взять код ASCII, созданный клавишей, и выполнить побитовое И с 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 из-за его особого расположения в таблице и его значения (код 12710), для этого символа иногда используется Ctrl ?. Когда клавиша управления удерживается, буквенные клавиши производят одни и те же управляющие символы независимо от состояния клавиш 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 часто использовались для той же цели. С появлением компьютерных терминалов, которые не печатали физически на бумаге и, следовательно, предлагали большую гибкость в отношении размещения на экране, стирания и т. д., коды управления печатью были адаптированы. Например, подача формы обычно очищала экран, поскольку не было новой страницы бумаги для перехода. Были разработаны более сложные последовательности Escape, чтобы воспользоваться гибкостью новых терминалов и, действительно, более новых принтеров. Концепция управляющего символа всегда была несколько ограничивающей, и особенно ограничивающей при использовании с новым, гораздо более гибким оборудованием. Управляющие последовательности (иногда реализуемые как последовательности Escape) могли соответствовать новой гибкости и мощности и стали стандартным методом. Однако существует и продолжает существовать большое разнообразие стандартных последовательностей на выбор.

Структурирование данных

Разделители (Файл, Группа, Запись и Единица: FS, GS, RS и US) были разработаны для структурирования данных, как правило, на магнитной ленте, с целью имитации перфокарт. Сигнал конца носителя (EM) указывает на окончание ленты (или другого носителя информации). Хотя многие системы используют CR/LF и TAB для структурирования данных, управляющие символы разделителей могут встречаться в данных, требующих структурирования. Управляющие символы разделителей не имеют других назначений; они используются исключительно для разделения данных на структурированные группы. Их числовые значения расположены последовательно, начиная с пробела, который можно рассматривать как элемент группы, служащий разделителем слов. Например, разделитель RS используется в (JSON Text Sequences) для кодирования последовательности элементов JSON. Каждый элемент последовательности начинается с символа RS и заканчивается символом перевода строки. Это позволяет сериализовать неограниченные последовательности JSON. Это один из протоколов потоковой передачи JSON.

Контроль передачи

Контрольные символы передачи предназначались для структурирования потока данных и управления повторной передачей или корректным завершением работы в случае ошибок передачи, при необходимости. Символ начала заголовка (SOH) должен был обозначать не содержащую данные часть потока данных — часть потока, содержащую адреса и другие служебные данные. Символ начала текста (STX) обозначал конец заголовка и начало текстовой части потока. Символ конца текста (ETX) обозначал конец данных сообщения. Распространенной практикой является использование двух символов, предшествующих ETX, в качестве контрольной суммы или CRC для обнаружения ошибок. Символ конца блока передачи (ETB) использовался для обозначения конца блока данных, когда данные разделялись на такие блоки для целей передачи. Символ экранирования (ESC) предназначался для "экранирования" следующего символа; если это был другой управляющий символ, он должен был быть выведен на печать вместо выполнения управляющей функции. Сегодня он почти никогда не используется для этой цели. Различные печатаемые символы используются в качестве видимых "символов экранирования" в зависимости от контекста. Символ замены (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) для "остановки" (Stop) передачи и символ 17 (код управления устройством 1 (DC1), также известный как Control Q или XON) для начала передачи. Он стал настолько широко распространенным, что многие не осознают, что он не является частью официального ASCII. Этот метод, независимо от реализации, позволяет избежать дополнительных проводов в кабеле данных, предназначенных исключительно для управления передачей, что позволяет сэкономить средства. Однако для предотвращения возможных взаимоблокировок необходимо использовать разумный протокол для использования таких сигналов управления потоком передачи. Символ экранирования канала передачи данных (DLE) предназначался для сигнализации другому концу канала передачи данных о том, что следующий символ является управляющим символом, таким как STX или ETX. Например, пакет может быть структурирован следующим образом: (DLE) <STX> <PAYLOAD> (DLE) <ETX>.

Различные коды

Код 7 (BEL) предназначен для генерации звукового сигнала в принимающем терминале. Многие из управляющих символов ASCII были разработаны для устройств того времени, которые сегодня встречаются нечасто. Например, код 22, "синхронный простой" (SYN), изначально передавался синхронными модемами (которые должны постоянно передавать данные) при отсутствии фактических данных для отправки. (Современные системы обычно используют стартовый бит для обозначения начала передаваемого слова — это особенность асинхронной связи. Синхронные каналы связи чаще использовались с мэйнфреймами, где они обычно работали по корпоративным выделенным линиям для соединения мэйнфрейма с другим мэйнфреймом или, возможно, с мини-компьютером.) Код 0 (ASCII-имя NUL) — особый случай. На перфоленте он соответствует отсутствию отверстий. Удобно рассматривать его как символ-заполнитель, не имеющий иного значения. Поскольку в позиции символа NUL нет пробитых отверстий, его можно заменить любым другим символом позднее, поэтому он обычно использовался для резервирования места, либо для исправления ошибок, либо для вставки информации, которая станет доступной позже или в другом месте. В вычислительной технике он часто используется для заполнения записей фиксированной длины; для обозначения конца строки; и ранее — для предоставления печатным устройствам достаточного времени на выполнение управляющей функции. Код 127 (DEL, также известный как "rubout") также является особым случаем. Его 7-битный код представляет собой все единицы в двоичном представлении, что фактически стирало символ на перфоленте при повторной перфорации. Перфолента была распространенной средой хранения данных во время разработки ASCII, а история вычислительной техники, связанная с ней, восходит к оборудованию для дешифровки кодов времен Второй мировой войны в Бюро Шифров. К 1970-м годам перфолента устарела, поэтому этот интересный аспект ASCII редко использовался после этого. Некоторые системы (например, оригинальные Apple) преобразовывали его в символ возврата на предыдущую позицию. Однако, поскольку его код находится в диапазоне, занимаемом другими печатаемыми символами, и поскольку у него не было официально назначенного глифа, многие производители компьютерного оборудования использовали его как дополнительный печатаемый символ (часто в виде сплошного черного "блока", полезного для удаления текста путем перезаписи). Нестираемые программируемые ПЗУ обычно реализуются в виде массивов перегораемых элементов, каждый из которых представляет бит и может быть переключен только в одном направлении, обычно с единицы на ноль. В таких ПЗУ символы DEL и NUL могут использоваться так же, как и на перфоленте: один для резервирования бессмысленных байтов-заполнителей, которые можно будет записать позже, а другой — для преобразования записанных байтов в бессмысленные байты-заполнители. Для ПЗУ, переключающихся с единицы на ноль, роли NUL и DEL меняются местами; также DEL будет работать только с 7-битными символами, которые сегодня используются редко; для 8-битного контента вместо DEL можно использовать код символа 255, обычно определяемый как неразрывный пробел. Многие файловые системы не разрешают использование управляющих символов в именах файлов, поскольку они могут иметь зарезервированные функции.