Таблица ASCII и кириллические кодировки
Коды всех символов ASCII в десятичном и шестнадцатеричном виде, назначение управляющих символов и верхние половины кириллических кодовых страниц Windows-1251, KOI8-R и CP866. Ниже — перевод любого текста в байты каждой кодировки и UTF-8.
Обновлено Редакция GAW
ASCII — основа всех кодировок: первые 128 кодов одинаковы в Windows-1251, KOI8-R, CP866 и UTF-8. Различаются только верхние 128 кодов однобайтовых кодировок, где и живёт кириллица, и способ кодирования остальных символов в UTF-8.
Коротко
- ASCII — 128 кодов: 33 управляющих (0–31 и 127) и 95 печатных (32–126).
- Цифры '0'–'9' — коды 0x30–0x39: значение цифры получают вычитанием 0x30.
- Регистр латинской буквы задаёт бит 5: A — 0x41, a — 0x61.
- Кириллица: «А» — 0xC0 в CP1251, 0xE1 в KOI8-R, 0x80 в CP866, D0 90 в UTF-8.
- UTF-8: русская буква занимает два байта, символ ASCII — один.
Управляющие символы ASCII
Коды 0–31 и 127 не отображаются, а управляют устройством: переводят строку, подают звонок, останавливают передачу. В терминале их вводят с клавишей Ctrl — отсюда запись ^C для Ctrl+C. Многие значения устарели вместе с телетайпами, но часть работает каждый день: CR и LF в конце строки, TAB, ESC в начале управляющих последовательностей терминала, XON и XOFF при программном управлении потоком UART.
| Dec | Hex | Символ | Ctrl | В C | Назначение |
|---|---|---|---|---|---|
| 0 | 00 | NUL | ^@ | \0 | пустой символ, конец строки в C |
| 1 | 01 | SOH | ^A | — | начало заголовка |
| 2 | 02 | STX | ^B | — | начало текста |
| 3 | 03 | ETX | ^C | — | конец текста; Ctrl+C в терминале |
| 4 | 04 | EOT | ^D | — | конец передачи; Ctrl+D — конец ввода в Unix |
| 5 | 05 | ENQ | ^E | — | запрос |
| 6 | 06 | ACK | ^F | — | подтверждение |
| 7 | 07 | BEL | ^G | \a | звонок |
| 8 | 08 | BS | ^H | \b | возврат на одну позицию |
| 9 | 09 | HT | ^I | \t | горизонтальная табуляция |
| 10 | 0A | LF | ^J | \n | перевод строки |
| 11 | 0B | VT | ^K | \v | вертикальная табуляция |
| 12 | 0C | FF | ^L | \f | перевод страницы |
| 13 | 0D | CR | ^M | \r | возврат каретки |
| 14 | 0E | SO | ^N | — | переход на дополнительный набор символов |
| 15 | 0F | SI | ^O | — | возврат к основному набору |
| 16 | 10 | DLE | ^P | — | смена значения следующих символов |
| 17 | 11 | DC1 | ^Q | — | управление устройством 1; XON — продолжить передачу |
| 18 | 12 | DC2 | ^R | — | управление устройством 2 |
| 19 | 13 | DC3 | ^S | — | управление устройством 3; XOFF — приостановить передачу |
| 20 | 14 | DC4 | ^T | — | управление устройством 4 |
| 21 | 15 | NAK | ^U | — | отрицательное подтверждение |
| 22 | 16 | SYN | ^V | — | синхронизация |
| 23 | 17 | ETB | ^W | — | конец блока передачи |
| 24 | 18 | CAN | ^X | — | отмена |
| 25 | 19 | EM | ^Y | — | конец носителя |
| 26 | 1A | SUB | ^Z | — | замена; Ctrl+Z — конец файла в DOS |
| 27 | 1B | ESC | ^[ | \x1B | начало управляющей последовательности |
| 28 | 1C | FS | ^\ | — | разделитель файлов |
| 29 | 1D | GS | ^] | — | разделитель групп |
| 30 | 1E | RS | ^^ | — | разделитель записей |
| 31 | 1F | US | ^_ | — | разделитель полей |
| 127 | 7F | DEL | ^? | — | удаление |
ESC в языке C стандартной escape-последовательности не имеет: пишут \x1B или \033, а \e — расширение GCC.
Печатные символы ASCII (32–126)
| Старшая цифра | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2x | SP32 | !33 | "34 | #35 | $36 | %37 | &38 | '39 | (40 | )41 | *42 | +43 | ,44 | -45 | .46 | /47 |
| 3x | 048 | 149 | 250 | 351 | 452 | 553 | 654 | 755 | 856 | 957 | :58 | ;59 | <60 | =61 | >62 | ?63 |
| 4x | @64 | A65 | B66 | C67 | D68 | E69 | F70 | G71 | H72 | I73 | J74 | K75 | L76 | M77 | N78 | O79 |
| 5x | P80 | Q81 | R82 | S83 | T84 | U85 | V86 | W87 | X88 | Y89 | Z90 | [91 | \92 | ]93 | ^94 | _95 |
| 6x | `96 | a97 | b98 | c99 | d100 | e101 | f102 | g103 | h104 | i105 | j106 | k107 | l108 | m109 | n110 | o111 |
| 7x | p112 | q113 | r114 | s115 | t116 | u117 | v118 | w119 | x120 | y121 | z122 | {123 | |124 | }125 | ~126 | DEL127 |
Код символа складывается из номера строки и столбца: строка — старшая шестнадцатеричная цифра, столбец — младшая. Например, «A» стоит в строке 4x и столбце 1, его код — 0x41, или 65; под каждым символом подписан десятичный код.
Расположение символов не случайно, и это используют в программах для микроконтроллеров:
- Цифры идут подряд с 0x30: значение цифры — это
c - '0', а символ цифры —'0' + n. - Строчные и заглавные латинские буквы отличаются одним битом 5 (0x20):
c | 0x20переводит заглавную букву в строчную,c & ~0x20— строчную в заглавную. Для других символов эти операции не годятся, поэтому сначала проверяют, что это буква. - Шестнадцатеричные цифры A–F идут не сразу после 9: между '9' (0x39) и 'A' (0x41) стоят семь знаков, поэтому при выводе числа в HEX к значениям 10–15 прибавляют 'A' − 10.
Кириллица: CP1251, KOI8-R и CP866
В однобайтовых кодировках кириллица занимает коды 128–255. Кодировок несколько, и текст в одной из них, открытый в другой, превращается в «кракозябры».
Windows-1251
Основная кириллическая кодировка Windows. Буквы идут подряд по алфавиту: А–Я — 0xC0–0xDF, а–я — 0xE0–0xFF, поэтому номер буквы в алфавите получается вычитанием, но Ё и ё стоят отдельно — 0xA8 и 0xB8. Код 0x98 в таблице Microsoft не определён.
| Старшая цифра | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 8x | Ђ128 | Ѓ129 | ‚130 | ѓ131 | „132 | …133 | †134 | ‡135 | €136 | ‰137 | Љ138 | ‹139 | Њ140 | Ќ141 | Ћ142 | Џ143 |
| 9x | ђ144 | ‘145 | ’146 | “147 | ”148 | •149 | –150 | —151 | —152 | ™153 | љ154 | ›155 | њ156 | ќ157 | ћ158 | џ159 |
| Ax | NBSP160 | Ў161 | ў162 | Ј163 | ¤164 | Ґ165 | ¦166 | §167 | Ё168 | ©169 | Є170 | «171 | ¬172 | SHY173 | ®174 | Ї175 |
| Bx | °176 | ±177 | І178 | і179 | ґ180 | µ181 | ¶182 | ·183 | ё184 | №185 | є186 | »187 | ј188 | Ѕ189 | ѕ190 | ї191 |
| Cx | А192 | Б193 | В194 | Г195 | Д196 | Е197 | Ж198 | З199 | И200 | Й201 | К202 | Л203 | М204 | Н205 | О206 | П207 |
| Dx | Р208 | С209 | Т210 | У211 | Ф212 | Х213 | Ц214 | Ч215 | Ш216 | Щ217 | Ъ218 | Ы219 | Ь220 | Э221 | Ю222 | Я223 |
| Ex | а224 | б225 | в226 | г227 | д228 | е229 | ж230 | з231 | и232 | й233 | к234 | л235 | м236 | н237 | о238 | п239 |
| Fx | р240 | с241 | т242 | у243 | ф244 | х245 | ц246 | ч247 | ш248 | щ249 | ъ250 | ы251 | ь252 | э253 | ю254 | я255 |
KOI8-R
Кодировка Unix и электронной почты, происходит от КОИ-8 (ГОСТ 19768-74). Строчные буквы — 0xC0–0xDF, заглавные — 0xE0–0xFF, но порядок не алфавитный: если отбросить восьмой бит, строчная русская буква превращается в созвучную заглавную латинскую. Так текст оставался читаемым транслитом при передаче через семибитные каналы. В 0x80–0xBF — псевдографика и Ё/ё.
| Старшая цифра | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 8x | ─128 | │129 | ┌130 | ┐131 | └132 | ┘133 | ├134 | ┤135 | ┬136 | ┴137 | ┼138 | ▀139 | ▄140 | █141 | ▌142 | ▐143 |
| 9x | ░144 | ▒145 | ▓146 | ⌠147 | ■148 | ∙149 | √150 | ≈151 | ≤152 | ≥153 | NBSP154 | ⌡155 | °156 | ²157 | ·158 | ÷159 |
| Ax | ═160 | ║161 | ╒162 | ё163 | ╓164 | ╔165 | ╕166 | ╖167 | ╗168 | ╘169 | ╙170 | ╚171 | ╛172 | ╜173 | ╝174 | ╞175 |
| Bx | ╟176 | ╠177 | ╡178 | Ё179 | ╢180 | ╣181 | ╤182 | ╥183 | ╦184 | ╧185 | ╨186 | ╩187 | ╪188 | ╫189 | ╬190 | ©191 |
| Cx | ю192 | а193 | б194 | ц195 | д196 | е197 | ф198 | г199 | х200 | и201 | й202 | к203 | л204 | м205 | н206 | о207 |
| Dx | п208 | я209 | р210 | с211 | т212 | у213 | ж214 | в215 | ь216 | ы217 | з218 | ш219 | э220 | щ221 | ч222 | ъ223 |
| Ex | Ю224 | А225 | Б226 | Ц227 | Д228 | Е229 | Ф230 | Г231 | Х232 | И233 | Й234 | К235 | Л236 | М237 | Н238 | О239 |
| Fx | П240 | Я241 | Р242 | С243 | Т244 | У245 | Ж246 | В247 | Ь248 | Ы249 | З250 | Ш251 | Э252 | Щ253 | Ч254 | Ъ255 |
CP866
Кодировка DOS, до сих пор используется в консоли Windows и в некоторых BIOS. А–Я — 0x80–0x9F, а–п — 0xA0–0xAF, р–я — 0xE0–0xEF, Ё и ё — 0xF0 и 0xF1. Между строчными «п» и «р» — псевдографика 0xB0–0xDF: рамки и блоки на тех же местах, что в кодовой странице IBM PC, поэтому таблицы из DOS-программ рисовались без изменений.
| Старшая цифра | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 8x | А128 | Б129 | В130 | Г131 | Д132 | Е133 | Ж134 | З135 | И136 | Й137 | К138 | Л139 | М140 | Н141 | О142 | П143 |
| 9x | Р144 | С145 | Т146 | У147 | Ф148 | Х149 | Ц150 | Ч151 | Ш152 | Щ153 | Ъ154 | Ы155 | Ь156 | Э157 | Ю158 | Я159 |
| Ax | а160 | б161 | в162 | г163 | д164 | е165 | ж166 | з167 | и168 | й169 | к170 | л171 | м172 | н173 | о174 | п175 |
| Bx | ░176 | ▒177 | ▓178 | │179 | ┤180 | ╡181 | ╢182 | ╖183 | ╕184 | ╣185 | ║186 | ╗187 | ╝188 | ╜189 | ╛190 | ┐191 |
| Cx | └192 | ┴193 | ┬194 | ├195 | ─196 | ┼197 | ╞198 | ╟199 | ╚200 | ╔201 | ╩202 | ╦203 | ╠204 | ═205 | ╬206 | ╧207 |
| Dx | ╨208 | ╤209 | ╥210 | ╙211 | ╘212 | ╒213 | ╓214 | ╫215 | ╪216 | ┘217 | ┌218 | █219 | ▄220 | ▌221 | ▐222 | ▀223 |
| Ex | р224 | с225 | т226 | у227 | ф228 | х229 | ц230 | ч231 | ш232 | щ233 | ъ234 | ы235 | ь236 | э237 | ю238 | я239 |
| Fx | Ё240 | ё241 | Є242 | є243 | Ї244 | ї245 | Ў246 | ў247 | °248 | ∙249 | ·250 | √251 | №252 | ¤253 | ■254 | NBSP255 |
UTF-8
UTF-8 кодирует любой символ Unicode от одного до четырёх байтов. Символы ASCII записываются одним байтом с тем же кодом, поэтому английский текст в ASCII уже является корректным UTF-8. Остальные символы занимают несколько байтов, у каждого из которых установлен старший бит: в ASCII таких байтов не бывает, и их нельзя спутать с обычными символами.
Весь кириллический блок U+0400–U+04FF кодируется двумя байтами, а русские буквы — парами D0 xx и D1 xx: «А» (U+0410) — D0 90, «я» (U+044F) — D1 8F, «Ё» (U+0401) — D0 81, «ё» (U+0451) — D1 91. Строка «Привет» занимает в UTF-8 12 байт против 6 в Windows-1251: при выделении буферов и расчёте длины пакета для UART это нужно учитывать.
Код символа и текста
Впишите текст — для каждого символа появятся его кодовая точка Unicode, байты UTF-8 и коды в трёх кириллических кодировках, а ниже — вся строка в виде байтов.
показываются первые 40 символов
| Символ | Unicode | UTF-8 | CP1251 | KOI8-R | CP866 |
|---|---|---|---|---|---|
| П | U+041F | D0 9F | CF | F0 | 8F |
| р | U+0440 | D1 80 | F0 | D2 | E0 |
| и | U+0438 | D0 B8 | E8 | C9 | A8 |
| в | U+0432 | D0 B2 | E2 | D7 | A2 |
| е | U+0435 | D0 B5 | E5 | C5 | A5 |
| т | U+0442 | D1 82 | F2 | D4 | E2 |
| , | U+002C | 2C | 2C | 2C | 2C |
| SP | U+0020 | 20 | 20 | 20 | 20 |
| G | U+0047 | 47 | 47 | 47 | 47 |
| A | U+0041 | 41 | 41 | 41 | 41 |
| W | U+0057 | 57 | 57 | 57 | 57 |
| ! | U+0021 | 21 | 21 | 21 | 21 |
- UTF-8
- D0 9F D1 80 D0 B8 D0 B2 D0 B5 D1 82 2C 20 47 41 57 21
- CP1251
- CF F0 E8 E2 E5 F2 2C 20 47 41 57 21
- KOI8-R
- F0 D2 C9 D7 C5 D4 2C 20 47 41 57 21
- CP866
- 8F E0 A8 A2 A5 E2 2C 20 47 41 57 21
Кодировки в электронике
- Дисплеи. Знакогенератор символьных ЖКИ на HD44780 содержит свою таблицу символов, а не Windows-1251 или UTF-8: русский текст для такого дисплея перекодируют по таблице его ПЗУ. Подробности — в статье об HD44780.
- UART и терминалы. Программа-терминал показывает принятые байты в выбранной кодировке. Если вместо русского текста видны «кракозябры», кодировки отправителя и терминала не совпадают. Как устроен сам обмен — в статье об UART.
- Контроль целостности. Строку, переданную по линии, проверяют контрольной суммой, которая считается по байтам, а не по символам: одно и то же слово в UTF-8 и Windows-1251 даст разную CRC. Посчитать её можно в калькуляторе CRC, выбрав ввод текстом.
Частые вопросы
Что такое таблица ASCII?
ASCII — семибитная кодировка символов, американский стандарт, международный вариант которого — ISO/IEC 646 и ECMA-6. В ней 128 кодов: 33 управляющих символа (0–31 и 127) и 95 печатных (32–126) — латинские буквы, цифры, знаки препинания и пробел. Все современные кодировки, включая UTF-8 и кириллические кодовые страницы, совпадают с ASCII в первой половине.
Как узнать код русской буквы?
Код зависит от кодировки. Буква «А» — это 0xC0 (192) в Windows-1251, 0xE1 (225) в KOI8-R, 0x80 (128) в CP866 и два байта D0 90 в UTF-8. Впишите текст в поле «Текст или символ» на этой странице — для каждого символа появятся коды во всех четырёх кодировках и строка байтов целиком.
Почему в KOI8-R русские буквы идут не по алфавиту?
KOI8 устроена так, что если отбросить восьмой бит, строчная русская буква превращается в похожую по звучанию заглавную латинскую: «а» (0xC1) — в A (0x41), «б» — в B, «в» — в W. Текст, прошедший через семибитный канал, оставался читаемым транслитом. Поэтому порядок букв в KOI8-R повторяет латинский алфавит: ю, а, б, ц, д, е, ф, г, х…
Чем отличаются CR и LF?
CR (13, 0x0D) — возврат каретки в начало строки, LF (10, 0x0A) — перевод на следующую строку. В Windows конец строки — пара CR LF, в Unix и Linux — LF. В протоколах вроде HTTP и SMTP строки заканчиваются CR LF. Терминалы для UART позволяют выбрать, что отправлять по Enter и как понимать принятые CR и LF, — если строки «лесенкой» или накладываются друг на друга, дело в этой настройке.
Сколько байт занимает русская буква в UTF-8?
Два: русские буквы кодируются парами байтов D0 xx и D1 xx, как и весь кириллический блок Unicode — двумя байтами. Символы ASCII занимают один байт, знак евро — три. Поэтому строка «Привет» в UTF-8 — 12 байт, а в Windows-1251 — 6: это важно для буферов, длины пакетов и вывода на дисплеи.
Источники
- V. Cerf. RFC 20: ASCII format for Network Interchange. 1969 — семибитный код ASCII и назначение управляющих символов
- Ecma International. ECMA-6: 7-bit coded character set, 6th edition, 1991 — международный вариант ASCII, он же ISO/IEC 646
- WHATWG. Encoding Standard — таблицы windows-1251, KOI8-R и IBM866, по которым построены таблицы на странице
- Unicode Consortium. Microsoft cp1251 to Unicode table (CP1251.TXT) — код 0x98 в Windows-1251 не определён
- A. Chernov. RFC 1489: Registration of a Cyrillic Character Set. 1993 — KOI8-R и его происхождение от КОИ-8 по ГОСТ 19768-74
- Unicode Consortium. Microsoft cp866 to Unicode table (CP866.TXT) — кодовая страница DOS с псевдографикой
- F. Yergeau. RFC 3629: UTF-8, a transformation format of ISO 10646. 2003 — правила кодирования UTF-8