JavaRush /Курсы /C# SELF /Что такое кодировка и зачем она нужна

Что такое кодировка и зачем она нужна

C# SELF
37 уровень , 0 лекция
Открыта

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 бит)
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
  • е229
  • т242

А потом ваш коллега открыл файл в редакторе, ожидающем ISO-8859-1 (Latin-1), или вы использовали StreamReader без явной кодировки, и она не совпала с кодировкой файла. Результат: байт 207 интерпретируется как символ из другой таблицы — и текст «ломается».

Оригинальный символ (Windows-1251) Байтовое представление (пример) Символ, прочитанный как ISO-8859-1
П
207
Ç
р
240
à
и
232
è
в
226
â
е
229
å
т
242
ò

В итоге получаем Çàèâåò вместо «Привет». Если символа вовсе нет в ожидаемой кодировке, вы увидите квадраты или знаки вопроса.

Отсюда главный практический вывод: при чтении/записи текстов важно явно указывать кодировку, особенно если источник данных не контролируется вами. В .NET это делается через StreamReader/StreamWriter с нужной Encoding (например, UTF-8 или Encoding.GetEncoding("windows-1251")). Это помогает избежать «кракозябр» и обеспечивает корректный обмен данными между системами.

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

2
Задача
C# SELF, 37 уровень, 0 лекция
Недоступна
Расшифровка текста из ASCII-кодов
Расшифровка текста из ASCII-кодов
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ