Таблица ASCII, Windows-1251 и UTF-8 для русских букв

Полная таблица ASCII: управляющие символы 0–31 и 127 с назначением, печатные символы 32–126 в десятичной, шестнадцатеричной, восьмеричной и двоичной записи. Коды русских букв в кодировках Windows-1251, UTF-8 и Unicode, причины «кракозябр» и признаки разных кодировок.

Рекламный блок «после калькулятора» (ads/after-calc.html)

ASCII (American Standard Code for Information Interchange) — семибитная кодировка из 128 символов, принятая в 1963 году. Первые 32 кода и код 127 — управляющие символы, остальные 95 — печатные: пробел, цифры, латинские буквы и знаки препинания. Все современные кодировки (Windows-1251, KOI8-R, UTF-8) совпадают с ASCII в диапазоне 0–127, а отличаются только старшей половиной.

Печатные символы (32–126)

DecHexOctBinСимвол
32200400100000пробел
33210410100001!
34220420100010"
35230430100011#
36240440100100$
37250450100101%
38260460100110&
39270470100111'
40280500101000(
41290510101001)
422A0520101010*
432B0530101011+
442C0540101100,
452D0550101101-
462E0560101110.
472F0570101111/
483006001100000
493106101100011
503206201100102
513306301100113
523406401101004
533506501101015
543606601101106
553706701101117
563807001110008
573907101110019
583A0720111010:
593B0730111011;
603C0740111100<
613D0750111101=
623E0760111110>
633F0770111111?
64401001000000@
65411011000001A
66421021000010B
67431031000011C
68441041000100D
69451051000101E
70461061000110F
71471071000111G
72481101001000H
73491111001001I
744A1121001010J
754B1131001011K
764C1141001100L
774D1151001101M
784E1161001110N
794F1171001111O
80501201010000P
81511211010001Q
82521221010010R
83531231010011S
84541241010100T
85551251010101U
86561261010110V
87571271010111W
88581301011000X
89591311011001Y
905A1321011010Z
915B1331011011[
925C1341011100\
935D1351011101]
945E1361011110^
955F1371011111_
96601401100000`
97611411100001a
98621421100010b
99631431100011c
100641441100100d
101651451100101e
102661461100110f
103671471100111g
104681501101000h
105691511101001i
1066A1521101010j
1076B1531101011k
1086C1541101100l
1096D1551101101m
1106E1561101110n
1116F1571101111o
112701601110000p
113711611110001q
114721621110010r
115731631110011s
116741641110100t
117751651110101u
118761661110110v
119771671110111w
120781701111000x
121791711111001y
1227A1721111010z
1237B1731111011{
1247C1741111100|
1257D1751111101}
1267E1761111110~

Полезные закономерности: цифра d имеет код 48 + d (0x30 + d); заглавная и строчная латинская буква отличаются ровно на 32 (один бит 0x20), поэтому «A» = 0x41, «a» = 0x61; буква с номером k в алфавите имеет код 64 + k (заглавная).

Рекламный блок «внутри статьи» (ads/in-article.html)

Управляющие символы

DecHexOctBinКодНазначение
0000000000000NULпустой символ
1010010000001SOH
2020020000010STX
3030030000011ETX
4040040000100EOT
5050050000101ENQ
6060060000110ACK
7070070000111BELзвуковой сигнал
8080100001000BSвозврат на шаг
9090110001001HTгоризонтальная табуляция
100A0120001010LFперевод строки
110B0130001011VTвертикальная табуляция
120C0140001100FFпрогон страницы
130D0150001101CRвозврат каретки
140E0160001110SO
150F0170001111SI
16100200010000DLE
17110210010001DC1
18120220010010DC2
19130230010011DC3
20140240010100DC4
21150250010101NAK
22160260010110SYN
23170270010111ETB
24180300011000CAN
25190310011001EM
261A0320011010SUB
271B0330011011ESCescape (начало управляющей последовательности)
281C0340011100FS
291D0350011101GS
301E0360011110RS
311F0370011111US
1277F1771111111DELудаление

Сегодня на практике используются в основном TAB (9), LF (10), CR (13), ESC (27) и NUL (0). Перевод строки в текстовых файлах отличается между системами: в Linux и macOS — LF (\n), в Windows — пара CR LF (\r\n). Если файл из Windows открыть в Linux-редакторе, в конце строк могут появиться символы ^M — это CR.

Русские буквы: Windows-1251, UTF-8 и Unicode

БукваWindows-1251UTF-8UnicodeСтрочнаяWindows-1251UTF-8Unicode
АC0D0 90U+0410аE0D0 B0U+0430
БC1D0 91U+0411бE1D0 B1U+0431
ВC2D0 92U+0412вE2D0 B2U+0432
ГC3D0 93U+0413гE3D0 B3U+0433
ДC4D0 94U+0414дE4D0 B4U+0434
ЕC5D0 95U+0415еE5D0 B5U+0435
ЁA8D0 81U+0401ёB8D1 91U+0451
ЖC6D0 96U+0416жE6D0 B6U+0436
ЗC7D0 97U+0417зE7D0 B7U+0437
ИC8D0 98U+0418иE8D0 B8U+0438
ЙC9D0 99U+0419йE9D0 B9U+0439
КCAD0 9AU+041AкEAD0 BAU+043A
ЛCBD0 9BU+041BлEBD0 BBU+043B
МCCD0 9CU+041CмECD0 BCU+043C
НCDD0 9DU+041DнEDD0 BDU+043D
ОCED0 9EU+041EоEED0 BEU+043E
ПCFD0 9FU+041FпEFD0 BFU+043F
РD0D0 A0U+0420рF0D1 80U+0440
СD1D0 A1U+0421сF1D1 81U+0441
ТD2D0 A2U+0422тF2D1 82U+0442
УD3D0 A3U+0423уF3D1 83U+0443
ФD4D0 A4U+0424фF4D1 84U+0444
ХD5D0 A5U+0425хF5D1 85U+0445
ЦD6D0 A6U+0426цF6D1 86U+0446
ЧD7D0 A7U+0427чF7D1 87U+0447
ШD8D0 A8U+0428шF8D1 88U+0448
ЩD9D0 A9U+0429щF9D1 89U+0449
ЪDAD0 AAU+042AъFAD1 8AU+044A
ЫDBD0 ABU+042BыFBD1 8BU+044B
ЬDCD0 ACU+042CьFCD1 8CU+044C
ЭDDD0 ADU+042DэFDD1 8DU+044D
ЮDED0 AEU+042EюFED1 8EU+044E
ЯDFD0 AFU+042FяFFD1 8FU+044F

В Windows-1251 каждая буква занимает один байт: заглавные А–Я — коды C0–DF, строчные а–я — E0–FF, буквы Ё и ё стоят отдельно (A8 и B8). В UTF-8 кириллица кодируется двумя байтами: первый — D0 или D1, второй — от 80 до BF. В Unicode русский алфавит занимает диапазон U+0410–U+044F, Ё — U+0401, ё — U+0451.

Откуда берутся «кракозябры»

Что видно вместо «Привет»Причина
Приветтекст в UTF-8 прочитан как Windows-1251: каждая буква превращается в пару «Р…» или «С…»
Ïðèâåòтекст в Windows-1251 прочитан как Latin-1 (Windows-1252)
������текст в Windows-1251 прочитан как UTF-8: байты C0–FF без продолжения недопустимы и заменяются символом U+FFFD
рТЙЧЕФтекст в KOI8-R прочитан как Windows-1251 (или наоборот)

Чтобы исправить текст, нужно не «перекодировать» его ещё раз, а открыть файл, явно указав правильную исходную кодировку. В HTML-страницах кодировку объявляют тегом <meta charset="utf-8">.

Как устроен UTF-8

Диапазон кодов UnicodeБайтовШаблон битовПримеры
U+0000 – U+007F10xxxxxxxASCII
U+0080 – U+07FF2110xxxxx 10xxxxxxкириллица, греческий, иврит, арабский
U+0800 – U+FFFF31110xxxx 10xxxxxx 10xxxxxxкитайские иероглифы, знак ₽ (U+20BD), €
U+10000 – U+10FFFF411110xxx 10xxxxxx 10xxxxxx 10xxxxxxэмодзи, редкие иероглифы

Пример: буква «Ж» имеет код U+0416 = 100 0001 0110₂. Раскладываем 11 бит по шаблону 110xxxxx 10xxxxxx: 11010000 10010110 = D0 96. Посмотреть байты любой строки в разных кодировках можно в калькуляторе Base64 и хеш-калькуляторе: хеш считается от байтов, поэтому для одной и той же строки в UTF-8 и Windows-1251 он разный.

Рекламный блок «внизу страницы» (ads/bottom.html)