60

I'm trying to figure out how to encode newlines in the DESCRIPTION part of an iCal file in such a way that they will import properly into Outlook, Google Calendar and the Apple Calendar.

The original code I inherited used "=0D=0A" with a quoted-printable encoding, which works great in Outlook, but not in Google Calendar.

The spec seems to say you should use "\n" to represent a newline. This works great in Google Calendar, but Outlook just puts the literal "\n" characters in there.

Is there a way you've done this that will work consistently accross calendaring systems?

Eric Petroelje
  • 59,820
  • 9
  • 127
  • 177

9 Answers9

62

OK, looks like I'm answering my own question.

The correct way to do it is to use "\n" for line breaks. Outlook did not recognize this because I had "ENCODING=quoted-printable" on the description. Once I removed that, Outlook displayed the new lines correctly.

Also, to get the file to open correctly in Apple iCal, you need to use "VERSION:2.0" for the file version. If you use "VERSION:1.0", it will tell you it can't read the file (even though it conforms to the 1.0 spec).

NOTE: As others have mentioned, the file actually has to contain the literal string \n. Since most languages treat that as an escape sequence meaning a newline character, you probably need to use the string \\n in your code.

Eric Petroelje
  • 59,820
  • 9
  • 127
  • 177
  • 5
    for anyone who added \n to create new line and it still didn't work, I ended up using \\n as noted by @periklis – Sergiu Z Jan 18 '17 at 22:20
37

The comment with the link to the RFC from Matthew Bucket above in the original post helped me. Quoting from there:

A BACKSLASH character in a "TEXT" property value MUST be escaped with another BACKSLASH character

So, I did a

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

and it worked

periklis
  • 10,102
  • 6
  • 60
  • 68
  • Quote and code don't seem to match. Code replaces Windows line feeds with literal `\n` sequences. – Álvaro González Jan 14 '14 at 16:51
  • 4
    This is incredibly weird seeing `\\n` and next to impossible to comprehend properly. In .NET land I created `const string textLineFeed = @"\" + "n";` – Chris Marisic Aug 15 '14 at 18:05
  • Your solution was the magic bullet for me. I tried all the others on this page unsuccessfully. Thank you. – Krafty Apr 23 '15 at 02:56
24

Might be worth saying that you need the literal \n, not the newline symbol, literally backslash then n in the ical. Also don't forget to do the 75 character "folding" too.

Tony Johnson
  • 261
  • 2
  • 4
  • also one needs to use CRLF, but here is [more about content folding](https://icalendar.org/iCalendar-RFC-5545/3-1-content-lines.html) – yellowsir Mar 14 '23 at 13:52
10

Your output file should be like below---

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

Here you have to take care of Version, it should be 2.0 and Escape char ... \n(newline), semicolon(;) and comma(,). If you are writing in .net then it should like ... "\\n", "\\;" and "\\,".

You can check your output file on this site as well... https://icalendar.org/validator.html

Thanks, Bhaskar

Alex Khimich
  • 788
  • 9
  • 10
Bhaskar
  • 101
  • 1
  • 4
  • 1
    +1 for the validator, and also mentioning the other characters that need escaping – Matt Kemp Oct 30 '14 at 01:47
  • 1
    Lines should not contain more than 75 characters: http://tools.ietf.org/html/rfc5545#section-3.1 – ofaurax Apr 19 '16 at 07:33
  • The validator mentioned in the answer isn't available anymore. Here's two others, that give different results (but reasonable in both cases): https://icalendar.org/validator.html, http://ical-validator.herokuapp.com/ – tcmb Feb 11 '18 at 13:48
6

According to this RFC:

Content lines are delimited by a line break, which is a CRLF sequence (CR character followed by LF character).

So you should use \r\n. I used this in strings without additional backslash escaping.

Community
  • 1
  • 1
Serhii Maksymchuk
  • 5,124
  • 2
  • 14
  • 20
2

This is my answer for DESCRIPTION

$filev = str_replace("\r\n", '\\n', $p);
$filev = str_replace("<br>",'\\n',$filev);
$filev = (str_replace(";","\;",str_replace(",",'\,',$filev)));
rene
  • 41,474
  • 78
  • 114
  • 152
0

=0D=0A works with Outlook, but you'll need to change the DESCRIPTION key, so that line breaks can be interpreted.

DESCRIPTION;ENCODING=QUOTED-PRINTABLE:

Enter your text after the colon, using =0D=0A for line breaks. Outlook will read the line breaks correctly. Using \\n only works if you're using DESCRIPTION without ENCODING:QUOTED-PRINTABLE.

I'm using VERSION:2.0

Wassim Katbey
  • 298
  • 4
  • 9
0

According to RFC 5545, the correct way to fold lines longer than 75 characters is to add a CRLF and a space at the end of such lines. The following Python code will do it:

import re
def word_wrap(text):
   return re.sub("(.{75})", "\\1\r\n ", text, 0, re.DOTALL)

The white space after the "\r\n" is critical! Without it, calendar applications like Apple Calendar will not correctly import the .ics file.

0

I had to escape the output in the string to set a literal "\n" in the output file. Like so. Worked a charm.

$events .= "DESCRIPTION:" . str_replace("\n","\\n",str_replace(";","\;",str_replace(",",'\,',get_event_contents()))) . "\n";
Josh Brule
  • 116
  • 4