1. Вступ
Уявіть, що ви — дипломат на міжнародному саміті: кожен говорить своєю мовою й використовує свою писемність. Щоб порозумітися, потрібен універсальний перекладач — спільний набір правил відповідності символів. У компʼютерах цю роль відіграють кодування.
Компʼютер розуміє лише одну «мову» — послідовності нулів і одиниць. 0 і 1 — його «алфавіт». Уся інформація зберігається та передається у вигляді байтів. Один байт — це 8 біт (наприклад, 01000001).
Як же привʼязати наші літери й знаки до байтів? Як компʼютер дізнається, що літера «А» — це не просто набір із 0/1, а саме той самий символ на екрані?
Кодування
Кодування — це набір правил (таблиця відповідності), який визначає, як кожен символ (літера, цифра, знак, ієрогліф, емодзі) перетворюється на послідовність байтів і як згодом ці байти інтерпретуються назад у символ.
Аналогія — азбука Морзе: ви перекладаєте текст у точки й тире, передаєте повідомлення, а отримувач за тими самими правилами відновлює символи. У компʼютері домовленість «байти ↔ символи» і є кодування.
2. Навіщо нам цей головний біль із кодуваннями?
- Переклад між світом людей і машин: без кодування текст — просто набір байтів; з кодуванням — осмислені символи.
- Універсальність і сумісність: різні програми та операційні системи мають «домовитися» про правила. Якщо файл позначено як UTF-8, його також слід читати як UTF-8.
- Підтримка великої кількості мов і символів: кирилиця, арабська вʼязь, ієрогліфи, математичні символи, емодзі — що ширший набір символів, то складнішим і гнучкішим має бути кодування.
3. ASCII — «первісне» кодування
Одне з найстаріших і базових кодувань — ASCII (American Standard Code for Information Interchange). Воно використовує 7 біт на символ, тобто може подати 128 різних символів: латиницю (A-Z, a-z), цифри (0-9), розділові знаки та керувальні коди (наприклад, перехід рядка, табуляція).
| Символ | Десятковий код (ASCII) | Двійковий код (7 біт) |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Пробіл | |
|
Історично восьмий біт часто слугував бітом парності, а згодом його почали використовувати в «розширеннях» ASCII — так зʼявилися різні однобайтові набори для локалей, що й призвело до рознобою.
Якщо ви напишете «Hello», то на диску це буде приблизно так (по 1 байту на символ; для 7-бітного ASCII старший біт нульовий):
H (01001000) e (01100101) l (01101100) l (01101100) o (01101111)
Просто. Але де українські літери або ієрогліфи? У ASCII їх немає — це «одномовний словник», придатний лише для базового латинського набору.
4. «Кракозябри» — чому кодування — це не жарти
Іноді, відкриваючи файл, ви бачите щось на кшталт Привіт замість «Привіт». Це називають «кракозябрами» (або Mojibake) — результат читання байтів у хибному кодуванні.
Припустімо, ви зберегли «Привіт, світ!» у кодуванні Windows-1251, де байти для літер слова «Привіт» можуть бути такими (спрощено):
- П → 207
- р → 240
- и → 232
- в → 226
- і → 179
- т → 242
А потім ваш колега відкрив файл у редакторі, який очікує ISO-8859-1 (Latin-1), або ви використали StreamReader без явного кодування, і кодування редактора не збіглося з кодуванням файлу. Результат: байт 207 інтерпретується як символ з іншої таблиці — і текст «ламається».
| Оригінальний символ (Windows-1251) | Байтове подання (приклад) | Символ, прочитаний як ISO-8859-1 |
|---|---|---|
| П | |
Ç |
| р | |
à |
| и | |
è |
| в | |
â |
| і | |
³ |
| т | |
ò |
У підсумку отримуємо Çàèâ³ò замість «Привіт». Якщо символу взагалі немає в очікуваному кодуванні, побачите квадрати або знаки питання.
Звідси головний практичний висновок: під час читання/запису текстів важливо явно вказувати кодування, особливо якщо джерело даних ви не контролюєте. У .NET це робиться через StreamReader/StreamWriter із потрібною Encoding (наприклад, UTF-8 або Encoding.GetEncoding("windows-1251")). Це допомагає уникати «кракозябр» і забезпечує коректний обмін даними між системами.
У наступних лекціях ми навчимося впевнено обирати та задавати кодування під час роботи з файлами і потоками, щоб ваш код був універсальним, міжнародним і надійним.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ