Перейти к основному содержимому
OpenQRS
Инструменты
Текущий язык: Русский
100% приватно

Генератор QR-кода мероприятия

100% приватно и локально — ваши данные никогда не покидают браузер. Эти QR-коды постоянны и никогда не истекают.

Настройки: Мероприятие

Становится свойством SUMMARY и заголовком записи в календаре.

Введите название мероприятия. Оно становится заголовком записи в календаре.

Обязательно. Оставьте оба поля времени пустыми, чтобы получилось событие на весь день.

24-часовой формат. Пустое поле означает событие на весь день, а не начало в полночь.

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

Пустое поле при заданном времени начала даёт событие длиной в час — именно это предполагает большинство приложений календаря.

Плавающее время подходит для мероприятия на одной площадке. UTC подходит для онлайн-встречи с участниками в разных поясах.

Свободный текст в свойстве LOCATION. По нажатию приложения календаря передают его своему картографическому сервису.

Переводы строк сохраняются. Каждый символ здесь увеличивает код, поэтому оставьте только то, что нужно для напоминания.

Записывается в свойство URL. Поддержка разная: одни приложения показывают его нажимаемой ссылкой, другие прячут.

Дизайн

Форма модулей
Пресеты
Рамка углов
Добавить логотип в центр
Выберите изображение или перетащите его сюдаPNG, JPEG, WebP или GIF, до 1000 КБ

Изображение читается на этой странице и встраивается в код как data: URL. Оно никуда не загружается и остаётся внутри файла, который вы скачиваете.

Ещё параметры дизайна

Тёмная половина кода. Держите её заметно темнее фона по светлоте.

Закрашивает и свободную зону, и промежутки между модулями. Прозрачный фон исключает его из файла, поэтому им ничего не рисуется.

Контраст 11.5:1 между модулями и фоном.

Пресеты

PNG и WebP сохраняют альфа-канал; в SVG прямоугольник фона просто отсутствует. Светлой половиной контраста становится то, на чём код размещён.

Градиент

Градиент заливает только тёмные модули. Контраст, который реально получает сканер, задаёт его светлый конец, поэтому оба конца должны оставаться тёмными.

Второй цвет, используется только при выбранном градиенте. Контраст измеряется по нему наравне с первым.

45°

Градусы по часовой стрелке от направления слева направо. Радиальный градиент расходится из центра, поэтому угол действует только для линейного.

Форма модулей

Скруглённые формы закрывают меньшую часть каждой ячейки. Центр остаётся закрытым, а именно его считывает декодер, но плотный код в мелкой печати надёжнее читается квадратами.

Рамка углов

Кольцо трёх поисковых узоров.

Центр углов

Зрачок внутри каждого поискового узора.

4 мод.

Пустое поле вокруг кода, измеряется в модулях. Стандарт задаёт минимум 4.

Более высокий уровень переносит больше повреждений и стоит ёмкости, поэтому то же содержимое даёт более плотный символ.

В центре стоит логотип, и он удерживает уровень H. Предел его ширины следует за символом: 14% на самом маленьком коде и 30% на плотном.

Предпросмотр и экспорт

Экспорт

Экспорт

Растр, для экранов

Заполните форму, чтобы включить скачивание.

Размер экспорта и закодированный текст
Данные
Пока не закодировано
Символ
Ещё не построен
Коррекция
M

Ожидание ввода

Размер экспорта

От 64 до 4096 пикселей. Экспорт при 1024 px.

Закодированный текст

Соберите полное событие iCalendar и напечатайте его. Полезная нагрузка — само содержимое .ics, поэтому телефон создаёт запись, ничего и ниоткуда не скачивая.

Когда его сканируют

Большинство современных камер и сканеров распознают заголовок BEGIN:VCALENDAR и предлагают добавить событие в календарь по умолчанию, а некоторые старые или простые сканеры вместо этого просто показывают текст как есть.

Полезная нагрузка iCalendar, в точности

Код несёт полный объект по RFC 5545, а не ссылку на него. Он открывается строкой BEGIN:VCALENDAR, несёт VERSION:2.0 и PRODID, опознающий этот генератор, оборачивает один VEVENT и закрывается END:VCALENDAR. Внутри события лежат UID и DTSTAMP, которых требует спецификация, рядом с DTSTART, DTEND, SUMMARY и теми из LOCATION, DESCRIPTION и URL, которые вы заполнили.

Каждая содержательная строка заканчивается возвратом каретки и переводом строки — именно в этом порядке. Парсеры строги к этому: объект с голыми переводами строки — это то, из-за чего в остальном корректное событие не импортируется. Строки длиннее 75 октетов сворачиваются вставкой CRLF и одного пробела, а читающая сторона склеивает их обратно перед разбором — поэтому длинное описание не ломает объект.

Поскольку всё событие живёт в узоре, телефону не нужна сеть, чтобы создать запись. Это же означает, что событие заморожено: смена площадки потом означает создание и печать нового кода, потому что обновлять нечего.

Плавающее местное время против UTC

В плавающем режиме DTSTART записывается как YYYYMMDDTHHMMSS, без завершающей Z и без параметра TZID. RFC 5545 называет это плавающим временем, и означает оно ровно то, что сказано: 19:00 — это 19:00 на том устройстве, которое его открыло, где бы это устройство ни находилось. Для концерта, рыночного прилавка или дня открытых дверей в школе почти всегда нужно именно это, потому что все, кто читает афишу, стоят в том же часовом поясе, что и площадка.

В режиме UTC то же свойство записывается как YYYYMMDDTHHMMSSZ, и завершающая Z фиксирует момент. Каждое устройство при импорте переводит его в местное время, поэтому событие, назначенное на 14:00 UTC, показывается как 15:00 в Берлине и 09:00 в Нью-Йорке. Для вебинара это верный выбор, для сельского праздника — неверный.

Именованная зона — DTSTART;TZID=Europe/London — это третья возможность в спецификации, и этот инструмент её не предлагает. Чтобы сделать это правильно, нужно встроить компонент VTIMEZONE с полным набором правил перехода на летнее время, а это добавляет несколько сотен байт к полезной нагрузке, которая обязана поместиться в один символ; объект же, ссылающийся на TZID, который он не определяет, некорректен. Плавающее время и UTC покрывают случаи печатной афиши без этой платы.

Экранирование, события на весь день и размер

Текстовые значения экранируются так, как требует спецификация, прежде чем попасть в полезную нагрузку. Сначала экранируются обратные косые черты, затем точки с запятой и запятые, затем переводы строки; в любом другом порядке дважды экранируются те обратные косые черты, которые вы только что ввели. Двоеточие внутри текстового значения не трогают — RFC 5545 прямо запрещает его экранировать, хотя более старый RFC 2445 этого требовал, отчего часть самодельных генераторов до сих пор делает это неверно.

Событие на весь день использует форму даты: DTSTART;VALUE=DATE:20260904. Его DTEND исключающий, поэтому один день 4 сентября записывается с DTEND;VALUE=DATE:20260905. Ошибка здесь и даёт событие, которое короче или длиннее на один день.

Практический предел здесь — размер. Символ QR вмещает не более 2953 байт на самом низком уровне коррекции, а одна только календарная обёртка тратит около двухсот, прежде чем начнётся ваш текст. Длинное описание поднимает символ на версию выше с более мелкими модулями, а это требует либо более крупной печати, либо более близкого сканирования. Предпросмотр показывает версию по мере набора — следите за ней.

  • Обратная косая черта становится \\, точка с запятой — \;, запятая — \,
  • Перевод строки становится двумя символами \n
  • Двоеточия в текстовых значениях RFC 5545 не экранируются никогда

Вопросы и ответы

Почему телефон показывает стену текста вместо предложения добавить в календарь?

Сканер не распознал ссылку и откатился на показ полезной нагрузки. Большинство современных приложений камеры замечают заголовок BEGIN:VCALENDAR и предлагают создать событие, но простой сканер может уметь только ссылки. Отдельное приложение-сканер QR или собственная камера телефона вместо стороннего приложения обычно решают вопрос.

Может ли один код нести повторяющееся событие?

Этим инструментом — нет. RFC 5545 выражает повторение свойством RRULE, и хотя синтаксис компактен, сочетания интервала, дня недели, счётчика и дат-исключений требуют собственной формы, чтобы их можно было ввести без ошибок. Этот инструмент строит одно событие с одним началом и одним концом.

Понесёт ли событие напоминание или будильник?

Нет. Компонент VALARM добавлял бы байты в каждый код ради настройки, которую сканирующий обычно хочет задать сам, а поведение напоминаний по умолчанию резко различается между приложениями календаря. Запись попадает в календарь и наследует то умолчание, которое применяет этот календарь.

Что будет, если один и тот же напечатанный код отсканируют двое?

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

Как работает статический QR-код

Каждый код на этом сайте статический: данные записаны в сами чёрно-белые модули. При чтении кода ничего не запрашивается, ни один наш сервер в этом не участвует и никакая подписка не держит напечатанный код на плаву. То же свойство и есть ограничение: после печати изменить его содержимое нельзя.

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