Кодировка символов
Кодировка символов задаёт представление текстовых символов или кодовых позиций последовательностями байтов и обратное декодирование.
Определение
Кодировка символов определяет, как элементы текста преобразуются в числа или байты для хранения и передачи и как эти значения превращаются обратно в текст. Отправитель и получатель должны использовать одну кодировку.
ASCII, UTF-8, UTF-16 и устаревшие кодовые страницы являются кодировками или схемами кодирования. Юникод задаёт общий набор и кодовые позиции, а UTF-8 и UTF-16 — их конкретное представление.
Как это работает
Кодировщик сопоставляет символам допустимую последовательность байтов, а декодер применяет обратные правила. В UTF-8 символ A записывается байтом 41, а € — байтами E2 82 AC. В кодировках переменной длины позиции занимают разное число байтов.
HTTP charset, объявление формата файла или соглашение протокола указывает программе нужный декодер. Без контекста одни байты могут превратиться в разный текст.
Практический пример
Байты UTF-8 E2 82 AC при правильном декодировании дают €. Если применить постороннюю однобайтовую кодировку, появятся другие символы. Такое видимое искажение часто называют кракозябрами.
Для конвертации сначала правильно декодируют исходные байты, а затем кодируют полученные символы в целевой кодировке. Простая смена метки байты не преобразует.
Ошибки и ограничения
Некорректную последовательность декодер может отклонить или заменить символом U+FFFD. Целевая кодировка также может не поддерживать часть символов, что приводит к ошибке, подстановке или потере данных.
Маркер порядка байтов, порядок байтов, нормализация Unicode и окончания строк — связанные, но отдельные вопросы. Кодировка символов — представление, а не шифрование.
Нет. Юникод назначает символам позиции и свойства, а UTF-8 кодирует эти позиции последовательностями байтов.
Байты могли декодировать неверной кодировкой либо исходные символы заменили, потому что целевая кодировка не могла их представить.
Нет. Некоторые байты допустимы сразу в нескольких кодировках, особенно короткий ASCII-текст. Нужны метаданные, BOM или внешний контекст.