Четыре основных режима
Каждый режим меняет разнообразие символов на плотность. Цифровой режим обрабатывает только цифры, но упаковывает три из них в 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. Без него считыватель иногда может ошибиться и показать искажённые символы.