JavaRush /Курси /C# SELF /Що таке кодування і навіщо воно потрібне

Що таке кодування і навіщо воно потрібне

C# SELF
Рівень 37 , Лекція 0
Відкрита

1. Вступ

Уявіть, що ви — дипломат на міжнародному саміті: кожен говорить своєю мовою й використовує свою писемність. Щоб порозумітися, потрібен універсальний перекладач — спільний набір правил відповідності символів. У компʼютерах цю роль відіграють кодування.

Компʼютер розуміє лише одну «мову» — послідовності нулів і одиниць. 0 і 1 — його «алфавіт». Уся інформація зберігається та передається у вигляді байтів. Один байт — це 8&nbspбіт (наприклад, 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 біт)
A
65
1000001
B
66
1000010
a
97
1100001
b
98
1100010
0
48
0110000
1
49
0110001
!
33
0100001
Пробіл
32
0100000

Історично восьмий біт часто слугував бітом парності, а згодом його почали використовувати в «розширеннях» 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
П
207
Ç
р
240
à
и
232
è
в
226
â
і
179
³
т
242
ò

У підсумку отримуємо Çàèâ³ò замість «Привіт». Якщо символу взагалі немає в очікуваному кодуванні, побачите квадрати або знаки питання.

Звідси головний практичний висновок: під час читання/запису текстів важливо явно вказувати кодування, особливо якщо джерело даних ви не контролюєте. У .NET це робиться через StreamReader/StreamWriter із потрібною Encoding (наприклад, UTF-8 або Encoding.GetEncoding("windows-1251")). Це допомагає уникати «кракозябр» і забезпечує коректний обмін даними між системами.

У наступних лекціях ми навчимося впевнено обирати та задавати кодування під час роботи з файлами і потоками, щоб ваш код був універсальним, міжнародним і надійним.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ