Кодировка символов
Кодировка символов — это совокупность правил, устанавливающих соответствие между каждым символом (буквой, цифрой, знаком препинания, управляющим символом) и его числовым представлением (кодом) в цифровом устройстве. Кодировки необходимы для хранения, обработки и передачи текстовой информации в компьютерных системах и сетях. Без единой системы кодирования обмен данными между разными устройствами и программами был бы невозможен, так как один и тот же набор байтов мог бы интерпретироваться как разные символы.
История развития
Ранние телеграфные коды
Первые попытки стандартизировать представление символов были предприняты в телеграфии. В 1837 году Сэмюэл Морзе разработал азбуку Морзе, где каждая буква и цифра представлялась комбинацией коротких и длинных сигналов (точек и тире). Однако эта система не была цифровой и не подходила для автоматической обработки.
Код Бодо
В 1870 году французский инженер Эмиль Бодо создал пятибитный код (5 бит на символ), позволявший передавать до 32 различных символов. Этот код стал основой для первых телетайпов и международного телеграфного кода ITA2 (International Telegraph Alphabet No. 2), принятого в 1931 году. Ограничение в 32 символа делало невозможным передачу строчных и прописных букв одновременно, поэтому использовались переключатели регистра.
Появление ASCII
С развитием вычислительной техники возникла необходимость в едином стандарте для обмена данными. В 1963 году Американский национальный институт стандартов (ANSI) представил код ASCII (American Standard Code for Information Interchange). Он использовал 7 бит, что позволяло кодировать 128 символов (0–127). В набор входили:
- управляющие символы (0–31) — для управления устройствами (например, перевод строки, возврат каретки);
- печатные символы (32–126) — латинские буквы (строчные и прописные), цифры, знаки препинания и математические символы;
- символ DELETE (127).
ASCII стал основой для большинства последующих кодировок, но его главный недостаток — отсутствие символов национальных алфавитов, в том числе кириллицы.
Расширения ASCII (8-битные кодировки)
Для поддержки языков, отличных от английского, были разработаны 8-битные кодировки (256 символов). Первые 128 кодов совпадали с ASCII, а оставшиеся 128 (128–255) отводились под национальные символы. Наиболее известные 8-битные кодировки:
- ISO 8859 — семейство стандартов, включающее несколько частей для разных языковых групп (например, ISO 8859-1 для западноевропейских языков, ISO 8859-5 для кириллицы).
- Windows-1251 — кодировка, разработанная компанией Microsoft для кириллицы в операционных системах Windows. Стала де-факто стандартом в русскоязычном сегменте интернета в 1990-х — начале 2000-х годов.
- KOI8-R — кодировка, использовавшаяся в советских и российских компьютерных системах, особенно в Unix-подобных операционных системах. Отличалась тем, что русские буквы располагались в кодовой таблице в порядке, близком к латинскому алфавиту, что позволяло сохранять читаемость текста при потере старшего бита.
Проблема множества кодировок
Существование десятков несовместимых между собой 8-битных кодировок создавало серьёзные проблемы: текст, набранный в одной кодировке, отображался как «кракозябры» при открытии в другой. Для корректного отображения требовалось вручную или автоматически угадывать кодировку, что было ненадёжно.
Юникод (Unicode)
Решение проблемы множества кодировок было найдено в создании универсального стандарта, способного охватить все письменности мира. В 1991 году был опубликован первый том стандарта Unicode (Юникод). Ключевые принципы Юникода:
- Универсальность: каждый символ любой письменности получает уникальный код (кодовая точка), независимо от платформы, программы или языка.
- Единое пространство: кодовые точки записываются в шестнадцатеричной системе, например, U+0041 — латинская буква «A», U+0410 — кириллическая буква «А».
- Плоскости: всё пространство Юникода разделено на 17 плоскостей (planes) по 65536 кодовых точек каждая. Первая плоскость (Basic Multilingual Plane, BMP) содержит наиболее распространённые символы, включая кириллицу, латиницу, иероглифы, арабское письмо и т.д.
Формы представления (UTF)
Юникод определяет только кодовые точки, но не способ их хранения в памяти или передачи по сети. Для этого разработаны различные формы преобразования (Unicode Transformation Format, UTF):
UTF-8
- Переменная длина: символы кодируются от 1 до 4 байт.
- Совместимость с ASCII: первые 128 кодовых точек (U+0000 — U+007F) кодируются одним байтом, полностью совпадающим с ASCII.
- Преимущества: эффективен для текстов на латинице, устойчив к ошибкам передачи, поддерживается всеми современными операционными системами и протоколами.
- Недостатки: символы кириллицы и других нелатинских алфавитов занимают 2 байта, что несколько увеличивает объём данных по сравнению с 8-битными кодировками.
UTF-16
- Переменная длина: символы BMP кодируются 2 байтами, символы из дополнительных плоскостей — 4 байтами (суррогатные пары).
- Использование: применяется в операционных системах Windows, Java, JavaScript.
- Недостатки: несовместимость с ASCII (латинские символы занимают 2 байта), возможны проблемы с порядком байтов (big-endian / little-endian).
UTF-32
- Фиксированная длина: каждый символ кодируется 4 байтами.
- Преимущества: простота обработки, отсутствие суррогатных пар.
- Недостатки: избыточность (тексты на латинице занимают в 4 раза больше места, чем в ASCII).
Классификация кодировок
По разрядности
- 7-битные (ASCII) — 128 символов.
- 8-битные (Windows-1251, KOI8-R, ISO 8859) — 256 символов.
- 16-битные (UCS-2, ранние версии Юникода) — 65536 символов.
- 32-битные (UCS-4, UTF-32) — более 4 миллиардов символов.
По области применения
- Телеграфные коды: Бодо, ITA2.
- Компьютерные кодировки: ASCII, расширения ASCII, Юникод.
- Специализированные кодировки: EBCDIC (использовалась в мейнфреймах IBM), Base64 (кодирование двоичных данных в текстовый формат).
Применение
Веб-технологии
Современные веб-страницы и электронные письма почти всегда используют UTF-8. В HTML и XML кодировка указывается в заголовке документа (например, <meta charset="UTF-8">). Это обеспечивает корректное отображение текстов на любых языках, включая кириллицу, китайские иероглифы, арабскую вязь и т.д.
Операционные системы
- Windows использует UTF-16 для внутреннего представления строк (API-функции, файловая система NTFS).
- Linux и macOS используют UTF-8 как системную кодировку по умолчанию.
- Мобильные платформы (Android, iOS) также поддерживают UTF-8.
Базы данных
Современные СУБД (MySQL, PostgreSQL, Oracle) поддерживают Юникод. Рекомендуется использовать кодировку UTF-8 (или UTF-8MB4 для MySQL, поддерживающую эмодзи) для хранения текстовых данных.
Протоколы передачи данных
HTTP, SMTP, FTP и другие протоколы поддерживают указание кодировки в заголовках. Например, в HTTP заголовок Content-Type: text/html; charset=UTF-8 сообщает браузеру, в какой кодировке передаётся документ.
Критика и проблемы
Избыточность UTF-8 для кириллицы
В UTF-8 кириллические символы занимают 2 байта, тогда как в 8-битных кодировках (Windows-1251, KOI8-R) — 1 байт. Для текстов, содержащих преимущественно кириллицу, объём данных увеличивается примерно вдвое. Это может быть критично для систем с ограниченным трафиком или хранилищем.
Проблемы с нормализацией
Юникод допускает несколько способов записи одного и того же символа (например, буква «ё» может быть представлена как отдельный символ U+0451 или как комбинация буквы «е» U+0435 и диакритического знака U+0308). Это приводит к проблемам при сравнении строк, поиске и сортировке. Для решения этой проблемы используются алгоритмы нормализации (NFC, NFD, NFKC, NFKD).
Поддержка старых систем
Многие устаревшие программы и базы данных до сих пор используют 8-битные кодировки. При интеграции с современными системами требуется конвертация, которая может приводить к потере данных или искажению символов, отсутствующих в целевой кодировке.
Интересные факты
- Кодовая таблица ASCII была разработана на основе кода для телетайпов и включала такие управляющие символы, как «звонок» (BEL, код 7), который заставлял устройство издавать звуковой сигнал.
- В кодировке KOI8-R русские буквы располагались в соответствии с их произношением, близким к латинским буквам (например, «А» — код 0xE1, что соответствует латинской «a» в ASCII). Это позволяло читать текст даже при потере старшего бита, хотя и с искажениями.
- Юникод включает не только символы письменностей, но и эмодзи (смайлики), математические символы, знаки валют, нотные знаки, иероглифы мёртвых языков (например, древнеегипетские иероглифы) и даже символы для игры в шахматы.
- Стандарт Юникод постоянно пополняется. Каждый год выходят новые версии, добавляющие сотни и тысячи новых символов. Например, версия 15.0 (2022 год) добавила 4489 символов, включая новые эмодзи и иероглифы.
Источники
- Стандарт Unicode, версия 15.0. Консорциум Юникода, 2022.
- «Кодирование информации. ASCII, Юникод и другие системы». — М.: Бином, 2018.
- «История развития кодировок символов». — Журнал «Компьютерра», № 34, 2005.
- «Телеграфные коды: от Морзе до Юникода». — Энциклопедия «Техника связи», 2010.
- «Проблемы совместимости кодировок в российском сегменте интернета». — Доклад на конференции РИФ, 2003.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →