Все статьи

Gzip + Base64: сжатие данных для передачи текстом

Gzip и Deflate сжимают данные, но результат — бинарный, а не текстовый. Если сжатые данные нужно передать каналом, рассчитанным на текст (URL, cookie, JSON-поле), их дополнительно кодируют в Base64 — отсюда пара «Gzip/Deflate ↔ Base64», которую часто используют инструменты для «ссылки с состоянием»: например, сервисы построения диаграмм или шаринга больших конфигов кодируют весь JSON прямо в query-параметр.

Как кириллица ведёт себя при сжатии

Каждая кириллическая буква в UTF-8 занимает 2 байта против 1 байта у латиницы — казалось бы, русский текст должен сжиматься хуже. На практике разница почти стирается: у русского языка сильная избыточность на уровне букв и слов (частые окончания, предлоги, повторяющиеся корни), и Gzip именно на этой избыточности и работает. В итоге коэффициент сжатия для связного русского текста обычно близок к английскому, несмотря на вдвое больший «сырой» размер в байтах.

Типичный порядок операций

  1. Исходный текст сжимается алгоритмом Gzip или Deflate — размер уменьшается.
  2. Сжатый бинарный результат кодируется в Base64 — размер немного растёт обратно, но данные становятся текстом.
  3. Полученная строка безопасно передаётся через текстовый канал.

Декодирование происходит в обратном порядке: сначала Base64 → бинарные данные, затем распаковка Gzip/Deflate → исходный текст.

Типичные сценарии использования

  • Компактное представление длинных JSON-конфигураций в query-параметре URL (например, «поделиться ссылкой с состоянием»).
  • Хранение сжатых данных в cookie или текстовом поле базы данных.
  • Диагностика: распаковать и прочитать содержимое, закодированное подобным образом сторонней системой.

Gzip против «сырого» Deflate

Gzip — это фактически формат-обёртка вокруг алгоритма Deflate: он добавляет собственный заголовок и контрольную сумму (CRC32) поверх сжатых данных. «Сырой» Deflate не имеет этих служебных байтов, поэтому результат чуть компактнее, но распаковать его gzip-утилитой без явного указания, что это именно raw-формат, нельзя. Путаница между этими двумя вариантами — частая причина ошибки «invalid header» при попытке распаковать данные.

Попробовать инструмент