Gzip и Deflate сжимают данные, но результат — бинарный, а не текстовый. Если сжатые данные нужно передать каналом, рассчитанным на текст (URL, cookie, JSON-поле), их дополнительно кодируют в Base64 — отсюда пара «Gzip/Deflate ↔ Base64», которую часто используют инструменты для «ссылки с состоянием»: например, сервисы построения диаграмм или шаринга больших конфигов кодируют весь JSON прямо в query-параметр.
Как кириллица ведёт себя при сжатии
Каждая кириллическая буква в UTF-8 занимает 2 байта против 1 байта у латиницы — казалось бы, русский текст должен сжиматься хуже. На практике разница почти стирается: у русского языка сильная избыточность на уровне букв и слов (частые окончания, предлоги, повторяющиеся корни), и Gzip именно на этой избыточности и работает. В итоге коэффициент сжатия для связного русского текста обычно близок к английскому, несмотря на вдвое больший «сырой» размер в байтах.
Типичный порядок операций
- Исходный текст сжимается алгоритмом Gzip или Deflate — размер уменьшается.
- Сжатый бинарный результат кодируется в Base64 — размер немного растёт обратно, но данные становятся текстом.
- Полученная строка безопасно передаётся через текстовый канал.
Декодирование происходит в обратном порядке: сначала Base64 → бинарные данные, затем распаковка Gzip/Deflate → исходный текст.
Типичные сценарии использования
- Компактное представление длинных JSON-конфигураций в query-параметре URL (например, «поделиться ссылкой с состоянием»).
- Хранение сжатых данных в cookie или текстовом поле базы данных.
- Диагностика: распаковать и прочитать содержимое, закодированное подобным образом сторонней системой.
Gzip против «сырого» Deflate
Gzip — это фактически формат-обёртка вокруг алгоритма Deflate: он добавляет собственный заголовок и контрольную сумму (CRC32) поверх сжатых данных. «Сырой» Deflate не имеет этих служебных байтов, поэтому результат чуть компактнее, но распаковать его gzip-утилитой без явного указания, что это именно raw-формат, нельзя. Путаница между этими двумя вариантами — частая причина ошибки «invalid header» при попытке распаковать данные.