web-dev-qa-db-ja.com

iCalファイルの改行のエンコード

Outlook、Googleカレンダー、およびApple Calendar。

私が継承した元のコードでは、「= 0D = 0A」とquoted-printableエンコーディングを使用していましたが、これはOutlookでは機能しますが、Googleカレンダーでは機能しません。

仕様では、改行を表すには「\ n」を使用する必要があると記載されているようです。これはGoogleカレンダーでうまく機能しますが、Outlookはリテラルの「\ n」文字をそこに配置するだけです。

カレンダーシステム全体で一貫して機能する方法はありますか?

44
Eric Petroelje

はい、私は自分の質問に答えているようです。

正しい方法は、改行に「\ n」を使用することです。説明に「ENCODING = quoted-printable」と記載されていたため、Outlookはこれを認識しませんでした。それを削除すると、Outlookは新しい行を正しく表示しました。

また、Apple iCalでファイルを正しく開くには、ファイルバージョンに「VERSION:2.0」を使用する必要があります。「VERSION:1.0」を使用すると、ファイルを読み取ることができません(1.0仕様に準拠していますが)。

注:他の人が述べたように、ファイルには実際にはリテラル文字列\nが含まれている必要があります。ほとんどの言語ではこれを改行文字を意味するエスケープシーケンスとして扱うため、コードでは文字列\\nを使用する必要があります。

39
Eric Petroelje

元の投稿にある上記のMatthew BucketからのRFCへのリンクを含むコメントが役に立ちました。そこから引用:

「TEXT」プロパティ値のバックスラッシュ文字は、別のバックスラッシュ文字でエスケープする必要があります

だから、私はやった

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

そしてそれはうまくいった

29
periklis

改行記号ではなくリテラル\ nが必要であり、icalで文字どおりバックスラッシュとnが必要であることを言う価値があるかもしれません。また、75文字の「折りたたみ」を行うことも忘れないでください。

21
Tony Johnson

出力ファイルは以下のようになります---

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

ここでは、バージョンに注意する必要があります。バージョン2.0とエスケープ文字...\n(改行)、セミコロン(;)、コンマ(、)である必要があります。あなたが.netで書いているなら、それは... "\\ n"、 "\\;"のようになります。および「\\」。

このサイトで出力ファイルを確認することもできます... http://icalvalid.cloudapp.net/

ありがとう、バスカー

6
Bhaskar

これがDESCRIPTIONに対する私の答えです

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

このRFC によると:

コンテンツ行は、CRLFシーケンス(CR文字の後にLF文字が続く)である改行で区切られます。

したがって、\r\nを使用する必要があります。これを追加のバックスラッシュエスケープなしの文字列で使用しました。

1

文字列の出力をエスケープして、出力ファイルにリテラル「\ n」を設定する必要がありました。そのようです。魅力的に働いた。

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