Режимы кодирования

Также называют: encoding modes, режимы данных, цифровой режим, буквенно-цифровой режим, байтовый режим, режим кандзи

Определение

Режимы кодирования — это способы, которыми QR-код упаковывает символы в биты. Основных режима четыре: цифровой, буквенно-цифровой, байтовый и кандзи, и один код может переключаться между ними.

Четыре основных режима

Каждый режим меняет разнообразие символов на плотность. Цифровой режим обрабатывает только цифры, но упаковывает три из них в 10 битов, а байтовый принимает любой байт, но тратит на каждый 8 битов.

Буквенно-цифровой режим охватывает набор из 45 символов: цифры 0–9, заглавные латинские буквы A–Z, пробел и символы $ % * + - . / и двоеточие. Строчных букв в наборе нет, поэтому URL целиком заглавными буквами может дать код меньше, чем тот же URL строчными.

  • Цифровой: цифры 0–9, 10 битов на 3 цифры
  • Буквенно-цифровой: 45 символов, 11 битов на 2 символа
  • Байтовый: любое 8-битное значение, 8 битов на байт
  • Кандзи: двухбайтовые символы Shift JIS, по 13 битов на символ

Индикаторы режима и сегменты

Каждый фрагмент данных начинается с 4-битного индикатора режима и счётчика символов, длина которого зависит от режима и версии. В коде может быть несколько таких сегментов, например цифровой для длинной последовательности цифр и байтовый для остального, что может уменьшить результат.

Другие 4-битные индикаторы обозначают не наборы символов, а возможности: ECI — для объявления кодировки символов, структурное добавление — для разделения данных на несколько кодов, а FNC1 — для GS1 и других отраслевых форматов данных. Данные завершает ограничитель из четырёх нулевых битов.

  • Цифровой 0001, буквенно-цифровой 0010, байтовый 0100, кандзи 1000
  • ECI 0111, структурное добавление 0011
  • FNC1 в первой позиции 0101, во второй позиции 1001
  • Ограничитель 0000

Байтовый режим и наборы символов

По умолчанию стандарт трактует байтовый режим как ISO-8859-1 (Latin-1), но сегодня большинство генераторов записывают UTF-8, чтобы сохранялись буквы с диакритикой, другие письменности и эмодзи. Считыватели обычно определяют UTF-8 по анализу байтов.

Если набор символов должен определяться однозначно, его можно явно объявить заголовком ECI. Без него считыватель иногда может ошибиться и показать искажённые символы.

Частые вопросы

Почему мой QR-код получается больше со строчными буквами?

Строчных букв нет в буквенно-цифровом наборе, поэтому текст приходится кодировать в байтовом режиме — по 8 битов на символ вместо 5,5. Заглавные буквы, цифры и несколько символов упаковываются плотнее.

Может ли QR-код хранить эмодзи или нелатинский текст?

Да, в байтовом режиме с UTF-8, который поддерживают большинство генераторов и телефонных считывателей. Каждый такой символ занимает несколько байтов, поэтому ёмкость снижается.

Можно ли в одном QR-коде смешать цифровые и текстовые данные?

Да. Данные можно разделить на сегменты, у каждого из которых свой режим, а хорошие кодировщики выбирают такое разбиение, при котором код получается наименьшим.

Источники и стандарты

Все термины