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
- е → 229
- т → 242
А потом ваш коллега открыл файл в редакторе, ожидающем ISO-8859-1 (Latin-1), или вы использовали StreamReader без явной кодировки, и она не совпала с кодировкой файла. Результат: байт 207 интерпретируется как символ из другой таблицы — и текст «ломается».
| Оригинальный символ (Windows-1251) | Байтовое представление (пример) | Символ, прочитанный как ISO-8859-1 |
|---|---|---|
| П | |
Ç |
| р | |
à |
| и | |
è |
| в | |
â |
| е | |
å |
| т | |
ò |
В итоге получаем Çàèâåò вместо «Привет». Если символа вовсе нет в ожидаемой кодировке, вы увидите квадраты или знаки вопроса.
Отсюда главный практический вывод: при чтении/записи текстов важно явно указывать кодировку, особенно если источник данных не контролируется вами. В .NET это делается через StreamReader/StreamWriter с нужной Encoding (например, UTF-8 или Encoding.GetEncoding("windows-1251")). Это помогает избежать «кракозябр» и обеспечивает корректный обмен данными между системами.
В следующих лекциях мы научимся уверенно выбирать и указывать кодировку при работе с файлами и потоками, чтобы ваш код был универсальным, международным и надёжным.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ