Открыть сервис

Кодировка символов

Кодировка символов — это совокупность правил, устанавливающих соответствие между каждым символом (буквой, цифрой, знаком препинания, управляющим символом) и его числовым представлением (кодом) в цифровом устройстве. Кодировки необходимы для хранения, обработки и передачи текстовой информации в компьютерных системах и сетях. Без единой системы кодирования обмен данными между разными устройствами и программами был бы невозможен, так как один и тот же набор байтов мог бы интерпретироваться как разные символы.

История развития

Ранние телеграфные коды

Первые попытки стандартизировать представление символов были предприняты в телеграфии. В 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). В набор входили:

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 →