ASCII | |
---|---|
Орган стандартизации | Национальный институт стандартов США |
Медиафайлы на Викискладе |
ASCII (англ. American standard code for information interchange, [ˈæs.ki][1]) — стандарт кодирования знаков латинского алфавита, цифр, некоторых специальных знаков и управляющих последовательностей, принятый в 1963 году Американской ассоциацией стандартов как основной способ представления текстовых данных в ЭВМ[2].
Стандарт ASCII представляет собой семиразрядный код без рекомендаций относительно контроля чётности, содержащий 128 кодовых позиций[3]. Таблица ASCII определяет коды для символов:
С развитием вычислительной техники и языков программирования возможностей телеграфного кода ITA2 стало не хватать, что вынуждало производителей ЭВМ создавать расширения для ITA2 или же свои собственные коды. Кроме того, для записи на перфокарты использовались различные варианты кода Холлерита. Таким образом, к началу 1960-х годов существовало достаточно большое количество кодировок латиницы, используемых как для передачи по линиям связи, так и для записи на магнитную ленту, перфоленту и перфокарты, — таких, как ITA2, FIELDATA, различные варианты BCDIC и т. д.[4], причём даже в рамках одной и той же кодировки один код мог соответствовать различным символам в зависимости от модели и назначения устройства. Чтобы решить эту проблему, 4 августа 1960 года был создан комитет X3.2 (как часть комитета X3, сформированного 13 января того же года)[5], в который вошли представители компаний IBM (в частности, Боб Бемер[англ.]), AT&T, Bell Labs и других. Работа по созданию ASCII началась 6 октября 1960 года[5], и почти 3 года спустя, 17 июня 1963 года, была опубликована её первая редакция (ASA X3.4-1963)[6].
ASCII обеспечивала кодирование символов 7-ю битами (27 = 128 символов), а 8-й бит (старший в октете) использовался для контроля ошибок. В первой редакции ASCII отсутствовали строчные буквы, а область из 28 позиций в колонках (группах по 16 символов) № 6 и № 7 (считая с 0) была зарезервирована для дальнейшего использования[7][8]. Велись споры о том, использовать эту область для добавления строчных букв или же управляющих символов.
В 1965 году была подготовлена новая редакция ASCII (ASA X3.4-1965), которая, однако, так и не была опубликована и не использовалась нигде, кроме терминалов IBM 2260/2848 и принтеров IBM 1053 (да и то без строчных букв и некоторых других символов)[9]. Следующая редакция ASCII (USAS X3.4-1967) была опубликована 5 июля 1967 года и определила окончательную кодовую таблицу[10]. Новые редакции ASCII продолжили выходить и далее (USAS X3.4-1968, ANSI X3.4-1977, ANSI X3.4-1986), однако кодовую таблицу изменения в них уже не затрагивали.
В целом, внедрение ASCII долгое время саботировалось компанией IBM, отдававшей предпочтение собственной кодировке EBCDIC, являющейся дальнейшим развитием кодировки BCDIC, также созданной IBM и основанной, в свою очередь, на коде Холлерита[6].
Со временем стали появляться производные кодировки с задействованным 8-м битом (28 = 256 символов), первые 128 символов которых совпадают с ASCII (например, КОИ-8, ISO 8859). Подобные ASCII-совместимые 8-битные кодировки стали называться «расширенной ASCII», а сама ASCII — восприниматься как их первая (младшая) половина.
Первая версия ASCII содержала 36 управляющих символов, 10 арабских цифр, 26 заглавных латинских букв и 27 специальных символов, которые подразделяли на группы[11]:
.
,
:
;
!
?
'
"
);#
$
%
&
@
);(
)
[
]
);+
-
*
/
\
=
<
>
)[12];↑
←
).Cимвол «подушка» (⌑
), имевшийся в наборе доступных символов многих печатающих устройств того времени и присутствовавший в кодировках BCDIC, Fieldata[англ.] и т.д., ни в одну версию ASCII не вошёл.
В версии от 67 года был пересмотрен набор управляющих символов (сокращён до 33), убраны стрелки, но добавлены строчные буквы и семь дополнительных символов: ^
_
`
{
|
}
~
, после чего таблица приняла окончательный вид[13]:
.0 | .1 | .2 | .3 | .4 | .5 | .6 | .7 | .8 | .9 | .A | .B | .C | .D | .E | .F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0. | NUL | SOH | STX | ETX | EOT | ENQ | ACK | BEL | BS | HT | LF | VT | FF | CR | SO | SI |
1. | DLE | DC1 | DC2 | DC3 | DC4 | NAK | SYN | ETB | CAN | EM | SUB | ESC | FS | GS | RS | US |
2. | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | |
3. | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4. | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5. | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
6. | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
7. | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | DEL |
Все символы в ASCII делятся на 4 группы по 32 символа[14]:
0x00
…0x1F
) — предназначены для управления передачей и выводом текста на терминал[15]. Группа начинается символом NUL (0x00
), означающим незаписанный участок, например перфоленты, и этот символ должен игнорироваться при выводе на экран или на печать[16]. За пределами группы, в конце таблицы также располагается символ DEL 0x7F
— участок перфоленты, пробитый целиком, означающий, что символ, который здесь располагался был удалён, а значит его также следует пропустить[16][17];
0x01
..0x07
), форматирование (0x08
..0x0F
), управление устройством (0x10
..0x17
) и разделители потоков данных (0x18
..0x1F
)[18]. В версии 67 года этот порядок был отчасти нарушен из-за переноса дополнительных управляющих символов0x20
— было принято решение, что пробел должен считаться печатным, а не управляющим символом, но при этом располагаться в самом начале — для корректной работы алгоритмов сортировки[19];!
"
#
$
%
&
'
(
)
), идущие в том порядке, в котором их располагали на пишущих машинках тех лет[11], за исключением скобок, которые располагались на позициях 0x28
и 0x29
, так как над цифра «0» оказалась под кодовой позицией пробела[22]. Однако на электромеханических пишущих машинах, в частности IBM Selectric расположение этих знаков было иным, что связано с наличием у некоторых из них механизма дозирования силы удара, который требовал расположения на одной клавише знаков, близких по оптической плотности. Окончательно отличное от таблицы ASCII положение этих знаков было закреплено в IBM PC.<
и >
[23]. Знак вопроса также спарен со знаком косой черты как на пишущих машинках[11].@
» (0x40
) — предполагалось, что для машин, поставляемых во Францию и Италию этот символ будет заменяться на «À
». Также, положение заглавных латинских букв и цифр было выбрано из соображений совместимости с шестибитной кодировкой DEC SIXBIT. Три позиции после заглавных букв (0x5B
, 0x5C
и 0x5D
) также предполагалось заменять при необходимости на местные символы.0x60
, 0x7B
, 0x7C
и 0x7D
также предполагалось менять на местные при необходимости. В редакции 65-го года был добавлен символ логического отрицания (¬
,0x7C
), который в версии 67-го года был убран.Важная особенность — ASCII, в отличие, к примеру, от ITA2, не использует переключения регистров[21]. Хотя переключение регистров для заглавных букв могло бы уменьшить требуемое количество бит, и соответственно увеличить скорости передачи и уменьшить требуемое место на носителях, однако повышает риск не прочесть сообщение при повреждении[24]. Было решено отказаться от использования регистров и уместить все символы в 7 бит[21]. Тем не менее, в набор включены символы переключения регистра (ESC, SI и SO) для целей дальнейшего расширения[24].
С помощью символа Backspace (BS) (возврат на один символ) на принтере можно печатать один символ поверх другого. В ASCII таким же способом можно добавить к буквам диакритические знаки, например:
a BS '
→ áa BS `
→ àa BS ^
→ âo BS /
→ øc BS ,
→ çn BS ~
→ ñПримечание. В старых шрифтах — апостроф «'» рисовался с наклоном влево (сравните: «`» и «´»), а тильда «~» — была сдвинута вверх (сравните: «~» и «˜»), так что они как раз подходили на роль символов акут «´» и «тильда сверху».
Если в одной позиции дважды напечатать один и тот же символ — получится жирный символ; если в одной позиции напечатать символ, а затем подчёркивание «_» — получится подчёркнутый символ:
a BS a
→ aa BS _
→ aЭта техника до сих пор используется, например, в справочной системе man
.
Стандарт ISO 646 (ECMA-6) предусматривает возможность размещения в ASCII национальных символов. Для этого предлагается заменять символы «@», «[», «\», «]», «^», «`», «{», «|», «}», «~». Также на месте знака решётки «#» может быть размещён символ фунта «£», а на месте символа доллара «$» — знак валюты «¤». Вариант ASCII, не содержащий национальных символов, называется «US-ASCII» или «international reference version».
Для некоторых языков (с нелатинской письменностью: русский, греческий, арабский, иврит и др.) существовали более радикальные модификации ASCII:
Впоследствии оказалось удобнее использовать 8-битовые кодировки (кодовые страницы), в которых нижнюю половину кодовой таблицы (0—127) занимают символы US-ASCII, а верхнюю (128—255) — дополнительные символы, включая набор национальных символов. Таким образом, верхняя половина таблицы ASCII (до повсеместного внедрения Юникода) активно использовалась для представления локализированных символов, букв местного языка. Отсутствие единого стандарта размещения кириллических символов в таблице ASCII доставляло множество проблем с кодировками (КОИ-8, Windows-1251 и др.). Носители других языков с нелатинской письменностью тоже страдали из-за наличия нескольких разных кодировок.
Первые 128 символов стандарта Юникод совпадают с соответствующими символами US-ASCII.
В первой версии стандарта ASCII (1963 год) — в позициях 0x5e (94) и 0x5f (95) располагались символы «стрелка вверх» и «стрелка влево», соответственно. Стандарт ECMA-6 (1965 год) заменил их на знак вставки и символ подчёркивание «_», соответственно.
В Советском Союзе стандарт был утвержден в виде таблицы международной ссылочной версии кода КОИ-7 Н0 ГОСТ 27463-87 (СТ СЭВ 356-86) «Системы обработки информации. 7-битные кодированные наборы символов».[25]
Таблица ASCII создавалась для обмена информацией по телетайпу. В набор были включены непечатаемые символы, используемые как команды для управления телетайпом. Аналогичные команды применялись и в других докомпьютерных средствах обмена сообщениями (азбука Морзе, семафорная азбука), учитывая специфику устройства. Большинство управляющих символов ASCII вскоре утратили своё назначение и в современных компьютерных системах не используются.
Примечание: далее в списке — коды символов записаны в шестнадцатеричной системе счисления, после названий символов.
null
всегда игнорировался. На перфолентах, цифра «1» обозначалась отверстием, а цифра «0» — отсутствием отверстия. Участки перфоленты, на которых не была записана информация — не содержали отверстий (то есть содержали символы null)
; такие участки располагались в начале и в конце ленты. Символ null
по сей день используется во многих языках программирования (как признак конца строки) и обозначается «\0» (термин «строка» обозначает последовательность символов). В некоторых операционных системах, null
— последний символ любого текстового файла.Сообщения, передаваемые по каналу связи, делились на две части:
«Заголовок» содержал: адреса отправителя и получателя, контрольную сумму и т. п.; мог размещаться до «текста» или после. Термином «текст» называлась часть сообщения, предназначенная для печати.
Символ | Код HEX | Расшифровка | Перевод | Описание |
---|---|---|---|---|
SOH | 01 | start of heading | начало «заголовка» | Символ начала заголовка (SOH) отмечает разделение данных, не относящийся к данным: часть потока, содержащую адреса и другие служебные данные. |
STX | 02 | start of text | начало «текста» | Включить печатающее устройство (телетайп). Текст для печати располагался между символами «STX » и «ETX ».
|
ETX | 03 | end of text | конец «текста» | Выключить печатающее устройство (телетайп). В наши дни код «03 » используется для отправки процессу сигнала «SIGINT» (сигнал-прерывание: англ. signal interrupt) и может быть набран нажатием комбинации клавиш Ctrl+C. Получив такой сигнал, процесс должен завершить работу[англ.].
|
EOT | 04 | end of transmission | конец передачи | Символ используется эмуляторами терминалов в значении «Конец файла» (EOF: англ. end of file) и может быть отправлен нажатием комбинации клавиш Ctrl+D. Получив такой сигнал, эмулятор терминала определит процесс, который в данный момент работает с терминалом, и установит в стандартном потоке ввода этого процесса (stdin: англ. standard input stream) флаг «Конец файла». В результате процесс прекратит чтение[англ.] stdin и начнёт обработку прочитанных данных. |
ENQ | 05 | enquire | «Прошу подтверждения!» | |
ACK | 06 | acknowledgement | «Подтверждаю!» | Символ «NAK » означает обратное: «Не подтверждаю!».
|
BEL | 07 | bell | звуковой сигнал: звонок | Символ часто обозначается как «\a» и используется для подачи звукового сигнала. |
BS | 08 | backspace | возврат на один символ | Передаётся при нажатии клавиши ← Backspace. |
TAB | 09 | tabulation | горизонтальная табуляция | Обозначается как «\t». Иногда называется «HT » (от англ. horizontal tabulation).
|
LF | 0A | line feed | перевод строки | Команда для опускания каретки печатающего устройства на одну строку вниз. Обозначение конца строки различается в семействах операционных систем:
Во многих языках программирования символ обозначается как «\n». Многие терминалы 70-80-х годов содержали переключатель поведения клавиши ↵ Return, позволяющий посылать при нажатии на неё либо последовательность |
VT | 0B | vertical tab | вертикальная табуляция | |
FF | 0C | form feed | «прогон страницы», новая страница | Команда для принтера: продолжить печать с начала следующего листа. |
CR | 0D | carriage return | возврат каретки | Команда для принтера: продолжить печать с начала текущей строки (не с новой строки). Во многих языках программирования — символ «CR » обозначается как «\r». В операционной системе «Mac» — символ «CR » (в прошлом) обозначал конец строки текстового файла. С клавиатуры символ «CR »может быть введён нажатием комбинации клавиш: Ctrl+M.
|
SO | 0E | shift out | «Переключиться на другую ленту (кодировку)» | Другая лента обычно была окрашена в красный цвет. В дальнейшем символ использовался для переключения на национальную кодировку. |
SI | 0F | shift in | «Переключиться на исходную ленту (кодировку)» | Команда для выполнения действия, обратного действию «SO ».
|
DLE | 10 | data link escape | «Экранирование канала данных» | Любые символы, следующие после «DLE », должны восприниматься как данные, а не как управляющие символы.
|
DC1 | 11 | device control 1 | Первый символ управления устройством | Команда включить устройство чтения перфоленты. |
DC2 | 12 | device control 2 | Второй символ управления устройством | Команда включить перфоратор. |
DC3 | 13 | device control 3 | Третий символ управления устройством | Команда выключить устройство чтения перфоленты. |
DC4 | 14 | device control 4 | Четвёртый символ управления устройством | Команда выключить перфоратор. |
NAK | 15 | negative acknowledgment | «Не подтверждаю!» | Обратно символу «ACK ».
|
SYN | 16 | synchronization | Этот символ передавался, когда (для синхронизации) было необходимо что-нибудь передать. | |
ETB | 17 | end of text block | конец текстового блока | Иногда текст (по техническим причинам) разбивался на блоки. |
CAN | 18 | cancel | «Отмена» | Отмена того, что было передано ранее. |
EM | 19 | end of medium | «Конец носителя» | Кончилась перфолента, бумага — и т. п. |
SUB | 1A | substitute | «Подставить» | Символ ставится:
В настоящее время символ вставляется нажатием комбинации клавиш Ctrl+Z и используется для обозначения конца файла в операционных системах «DOS» и «Windows». |
ESC | 1B | escape | Знак того, что символ, следующий после «ESC », имеет какое-то другое (отличное от определённого в ASCII) значение. Обычно после символа «ESC » следуют управляющие последовательности; в операционной системе «DOS» они реализуются драйвером «ANSI.SYS».
| |
DEL | 7F | delete | стереть последний символ | Символом «DEL » (состоящим в двоичном коде из всех единиц) можно было «забить» любой символ. Устройства и программы игнорировали «DEL » так же, как и «NUL ».
Код этого символа происходит из первых текстовых процессоров с памятью на перфоленте: в них удаление символа происходило «забиванием» его кода дырочками (обозначавшими логические единицы). |
Поддерживалось разделение данных на 4 уровня:
Символ | Код | Расшифровка | Перевод | Описание |
---|---|---|---|---|
FS | 1C | file separator | разделитель файлов | сообщение могло состоять из файлов |
GS | 1D | group separator | разделитель групп | файлы могли состоять из групп |
RS | 1E | record separator | разделитель записей | группы могли состоять из записей |
US | 1F | unit separator | разделитель юнитов | записи могли состоять из юнитов |
На подавляющем большинстве современных компьютеров, минимально адресуемая единица памяти — байт (размером в 8 бит); поэтому там используются 8-битные, а не 7-битные символы. Обычно символ ASCII расширяют до 8 бит, просто добавляя один нулевой бит в качестве старшего.
На компьютерах IBM/360 применялся другой метод: 6-й бит (если первым считать самый младший бит) перемещается в 7-й, а бывший 7-й «раздваивается» и копируется и в 8-й бит, и в 6-й[26]. Такую кодировку называли USASCII-8[27]
.0 | .1 | .2 | .3 | .4 | .5 | .6 | .7 | .8 | .9 | .A | .B | .C | .D | .E | .F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0. | NUL | SOM | EOA | EOM | EQT | WRU | RU | BELL | BKSP | HT | LF | VT | FF | CR | SO | SI |
1. | DC0 | DC1 | DC2 | DC3 | DC4 | ERR | SYNC | LEM | S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 |
2. | ||||||||||||||||
3. | ||||||||||||||||
4. | BLANK | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / |
5. | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
6. | ||||||||||||||||
7. | ||||||||||||||||
8. | ||||||||||||||||
9. | ||||||||||||||||
A. | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
B. | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ↑ | ← |
C. | ||||||||||||||||
D. | ||||||||||||||||
E. | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | |
F. | p | q | r | s | t | u | v | w | x | y | z | ESC | DEL |
На компьютерах с минимально адресуемой единицей памяти в 36 бит — поначалу использовали 6-битные символы (1 слово = 6 символов). После перехода на ASCII на таких компьютерах в одном слове стали размещать либо 5 семибитовых символов (1 бит оставался лишним), либо 4 девятибитовых символа.
Расположение символов ASCII на клавиатуре согласно ANSI X4.14-1971: символы верхнего регистра вводятся в сочетании с клавишей ⇧ Shift, а управляющие символы — с Ctrl,[28]
Коды ASCII используются в программировании как промежуточные кроссплатформенные коды нажатых клавиш (в противовес скан-кодам IBM PC и прочим внутренним кодам). Для раскладки клавиатуры QWERTY — таблица кодов выглядит так, как показано в следующей таблице[29].
Исторические кодировки | |
---|---|
современное 8-битное представление | |
Многобайтные | |
Управляющие символы ( 0x00 …0x1F ) | |
---|---|
Цифры и знаки препинания ( 0x20 …0x3F ) | |
Заглавные буквы ( 0x40 …0x5F ) | |
Строчные буквы ( 0x60 …0x7F ) | |
Исключённые символы | |
Личности |