web-dev-qa-db-fra.com

Encodage de nouvelles lignes dans les fichiers iCal

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?

44
Eric Petroelje

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.

39
Eric Petroelje

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é

29
periklis

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.

21
Tony Johnson

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

6
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)));
2
user8716145

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.

1
Serhii Maksymchuk

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";
0
Josh Brule