J'essaie de comprendre comment coder les sauts de ligne dans la partie DESCRIPTION d'un fichier iCal de telle manière qu'ils seront importés correctement dans Outlook, Google Calendar et le Apple Calendar.
Le code d'origine dont j'ai hérité utilisait "= 0D = 0A" avec un encodage imprimable entre guillemets, qui fonctionne très bien dans Outlook, mais pas dans Google Agenda.
La spécification semble indiquer que vous devez utiliser "\ n" pour représenter une nouvelle ligne. Cela fonctionne très bien dans Google Agenda, mais Outlook met simplement les caractères "\ n" littéraux dedans.
Existe-t-il un moyen de faire cela qui fonctionnera de manière cohérente sur tous les systèmes de calendrier?
OK, on dirait que je réponds à ma propre question.
La façon correcte de le faire est d'utiliser "\ n" pour les sauts de ligne. Outlook n'a pas reconnu cela car j'avais "ENCODING = quoted-printable" sur la description. Une fois que j'ai supprimé cela, Outlook a correctement affiché les nouvelles lignes.
De plus, pour que le fichier s'ouvre correctement dans Apple iCal, vous devez utiliser "VERSION: 2.0" pour la version du fichier. Si vous utilisez "VERSION: 1.0", il vous le dira ne peut pas lire le fichier (même s'il est conforme à la spécification 1.0).
REMARQUE: comme d'autres l'ont mentionné, le fichier doit en fait contenir la chaîne littérale \n
. Étant donné que la plupart des langues traitent cela comme une séquence d'échappement signifiant un caractère de nouvelle ligne, vous devez probablement utiliser la chaîne \\n
dans votre code.
Le commentaire avec le lien vers le RFC de Matthew Bucket ci-dessus dans le message d'origine m'a aidé. Citant de là:
Un caractère BACKSLASH dans une valeur de propriété "TEXT" DOIT être échappé avec un autre caractère BACKSLASH
J'ai donc fait un
$description = str_replace("\r\n", "\\n", $description);
et ça a marché
Il vaut peut-être la peine de dire que vous avez besoin du littéral\n, pas du symbole de nouvelle ligne, littéralement de la barre oblique inverse, puis de n dans l'ical. N'oubliez pas non plus de "plier" les 75 caractères.
Votre fichier de sortie doit être comme ci-dessous ---
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//2013//#Ur Site Name#//EN
BEGIN:VEVENT
UID:[event]2012
DTSTART:20130101T100000
DTEND:20130101T120000
LOCATION:
SUMMARY:#Meeting Title here#
DESCRIPTION:What is realistic for financial services companies to achieve via Social Media channels? \n\nJoin us on 11th September 2013 at 4pm (BST) where we
-----bla bla bla ----
END:VEVENT
END:VCALENDAR
Ici, vous devez prendre soin de la version, elle doit être 2.0 et Escape char ...\n (nouvelle ligne), point-virgule (;) et virgule (,). Si vous écrivez en .net alors il devrait aimer ... "\\ n", "\\;" et "\\,".
Vous pouvez également vérifier votre fichier de sortie sur ce site ... http://icalvalid.cloudapp.net/
Merci, Bhaskar
Ceci est ma réponse pour DESCRIPTION
$filev = str_replace("\r\n", '\\n', $p);
$filev = str_replace("<br>",'\\n',$filev);
$filev = (str_replace(";","\;",str_replace(",",'\,',$filev)));
Selon ce RFC :
Les lignes de contenu sont délimitées par un saut de ligne, qui est une séquence CRLF (caractère CR suivi de LF).
Vous devez donc utiliser \r\n
. J'ai utilisé cela dans des chaînes sans échappement supplémentaire de barre oblique inverse.
J'ai dû échapper la sortie dans la chaîne pour définir un littéral "\ n" dans le fichier de sortie. Ainsi. A fonctionné un charme.
$events .= "DESCRIPTION:" . str_replace("\n","\\n",str_replace(";","\;",str_replace(",",'\,',get_event_contents()))) . "\n";