В проекте c ++ я пишу парсер для чтения и записи в файлы .ics. Для этого я проверяю свой синтаксический анализатор на нескольких файлах с максимально возможным числом случаев из нескольких источников (gmail, Yahoo, …). Недавно я обнаружил в тестовом файле ситуацию, в которой я немного запутался и для которой я не смог найти удовлетворительного ответа.
Один из моих тестовых файлов не был импортирован моим парсером. VEVENT, который вызывает проблему, содержит следующую дату начала:
DTSTART;TZID=GMT+04:00:20120103T120000
Это событие соответствует VTIMEZONE, который объявляет свой параметр TZID следующим образом:
TZID:GMT+04:00
AFAIK вместо этого следует использовать символ «:» в качестве разделителя, и я подозреваю, что сам VTIMEZONE искажен в примере, описанном выше, но я не нашел ни одного документа, в котором явно указано, что такая ситуация никогда не может возникнуть. Я также заметил, что несколько приложений, таких как Thunderbird, также не могут импортировать этот файл, по-видимому, по той же причине.
Поэтому мой вопрос: может ли параметр TZID в VTIMEZONE содержать символ «:»?
Кроме того, я не знаю, должен ли я использовать содержимое TZID в качестве ключа для извлечения даты ISO из параметра DTSTART, или я просто отклоняю такое событие, отмечая его как поврежденное и показывая сообщение об ошибке после импорта ?
Право на это — RFC5545 и соответствующие подразделы:
RFC5545 3.2.19. Идентификатор часового пояса
tzidparam = «TZID» «=» [tzidprefix] paramtext
который дополняется
RFC5545 3.1. Линии содержания
param = param-name «=» param-value * («,» param-value)
param-value = paramtext / quoted-string
paramtext = * SAFE-CHAR
[..] SAFE-CHAR = WSP /% x21 /% x23-2B /% x2D-39 /% x3C-7E
/ NON-US-ASCII
; Любой символ, кроме CONTROL, DQUOTE, «;», «:», «,»
Из чего можно сделать вывод, что параметр Time Zone ID не могу содержит символ «:»
Других решений пока нет …