2009-03-20 19 views
34

Ich versuche herauszufinden, wie man Zeilenumbrüche im DESCRIPTION-Teil einer iCal-Datei so codiert, dass sie korrekt in Outlook, Google Kalender und den Apple-Kalender importiert werden.Codierung von Zeilenumbrüchen in iCal-Dateien

Der ursprüngliche Code, den ich geerbt habe, verwendete "= 0D = 0A" mit einer quoted-printable Codierung, die in Outlook funktioniert, aber nicht in Google Kalender.

Die Spezifikation scheint zu sagen, dass Sie "\ n" verwenden sollten, um eine neue Zeile darzustellen. Dies funktioniert in Google Kalender sehr gut, aber Outlook fügt nur die Buchstaben "\ n" ein.

Gibt es eine Möglichkeit, die Sie über Kalendersysteme konsistent arbeiten werden?

+2

Der Teil der iCal-Spezifikation in Frage ist: http://tools.ietf.org/html/rfc5545#section-3.3.11 –

Antwort

31

OK, sieht aus, als würde ich meine eigene Frage beantworten.

Der richtige Weg ist es, "\ n" für Zeilenumbrüche zu verwenden. Outlook hat das nicht erkannt, weil ich auf der Beschreibung "ENCODING = quoted-printable" hatte. Nachdem ich das entfernt hatte, zeigte Outlook die neuen Zeilen korrekt an.

Damit die Datei in Apple iCal korrekt geöffnet wird, müssen Sie für die Dateiversion "VERSION: 2.0" verwenden. Wenn Sie "VERSION: 1.0" verwenden, wird Ihnen mitgeteilt, dass die Datei nicht gelesen werden kann (obwohl sie der Spezifikation 1.0 entspricht).

+1

für jeden, der \ n hinzugefügt hat, um neue Zeile zu erstellen, und es hat immer noch nicht funktioniert , Endete ich mit \\ n wie von @periklis –

19

Kann es wert sein zu sagen, dass Sie das Literal brauchen \ n, nicht das Newline-Symbol, buchstäblich Backslash dann n in der ical. Vergessen Sie auch nicht das 75 Zeichen "Falten" zu machen.

0

Ich musste die Ausgabe in der Zeichenfolge, um ein Literal "\ n" in der Ausgabedatei festlegen zu entkommen. Wie so. Arbeitete einen Charme.

$events .= "DESCRIPTION:" . str_replace("\n","\\n",str_replace(";","\;",str_replace(",",'\,',get_event_contents()))) . "\n"; 
21

Der Kommentar mit dem Link zum RFC von Matthew Bucket oben im ursprünglichen Beitrag hat mir geholfen. Zitiert von dort:

ein Backslash in einem "TEXT" Eigenschaft Wert muss mit einem anderen Backslash

So entwertet wird, habe ich ein

$description = str_replace("\r\n", "\\n", $description); 

und es funktionierte

+0

erwähnt Zitat und Code scheinen nicht zu entsprechen. Code ersetzt Windows-Zeilenvorschübe durch literale '\ n'-Sequenzen. –

+2

Das ist unglaublich komisch, wenn man '\\ n' sieht und es fast unmöglich ist, es richtig zu verstehen. In .NET land habe ich 'const string textLineFeed = @" \ "+" n "erstellt;' –

+0

Ihre Lösung war die magische Kugel für mich. Ich habe alle anderen auf dieser Seite erfolglos versucht. Vielen Dank. – Krafty

6

Ihre Ausgabedatei sollte wie folgt sein ---

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 

Hier muss man auf Version achten, es sollte 2.0 sein und Escape char ... \ n (newline), Semikolon (;) und Komma (,). Wenn Sie in .net schreiben, dann sollte es mögen ... "\\ n", "\\;" und "\\,".

Sie können Ihre Ausgabedatei auch auf dieser Website überprüfen ...http://icalvalid.cloudapp.net/

Danke, Bhaskar

+0

+1 für den Validator, und auch die anderen Zeichen, die zu entkommen müssen –

+0

Linien sollten nicht mehr als 75 Zeichen enthalten: http://tools.ietf.org/html/rfc5545#section-3.1 – ofaurax

+0

Der Validator in der Antwort erwähnt ist nicht mehr verfügbar. Hier sind zwei andere, die unterschiedliche Ergebnisse liefern (aber in beiden Fällen vernünftig): https://icalendar.org/validator.html, http://ical-validator.herokuapp.com/ – tcmb

1

Dies ist meine Antwort für DESCRIPTION

$filev = str_replace("\r\n", '\\n', $p); 
$filev = str_replace("<br>",'\\n',$filev); 
$filev = (str_replace(";","\;",str_replace(",",'\,',$filev))); 
0

Nach this RFC:

Inhalt Linien durch einen Zeilenumbruch begrenzt sind, die ein CRLF ist Sequenz (CR-Zeichen gefolgt von LF-Zeichen).

Sie sollten also \r\n verwenden. Ich habe das in Strings ohne zusätzlichen Backslash-Code verwendet.

Verwandte Themen