1

私は C# を使用して単純な iCalendar を作成していますが、RFC 2445 のセクション 4.1 によるコンテンツの折りたたみがかなりの頭痛の種であることがわかりました (私にとっては :-)。

http://www.apps.ietf.org/rfc/rfc2445.html#sec-4.1

長い行の場合、いくつかの文字 (バックスラッシュ、セミコロン、コンマ、改行だと思います) をエスケープしてから、行が 75 オクテットを超えないように折り畳む必要があります。これを行うためのいくつかの簡単な方法をウェブで見つけました。最も簡単な方法は、問題の文字をエスケープされたバージョンに置き換えてから、75 文字ごとに CRLF を挿入することです。何かのようなもの:

// too simple, could break at an escape sequence boundary or multi-byte character may overflow 75 octets
txt = txt.Replace(@"\", "\\\\").Replace(";", "\\;").Replace(",", "\\,").Replace("\r\n", "\\n");
var regex = new System.Text.RegularExpressions.Regex( ".{75}");
var escape_and_folded = regex.Replace( txt, "$0\r\n ");

2 つの問題があります。CRLF がエスケープされたシーケンスに挿入されている可能性があります。たとえば、エスケープされた改行シーケンス「\n」が「\CRLF」になるような挿入が発生した場合 (「n」は次の行になります)。2 番目の問題は、マルチバイト文字がある場合です。計算は文字単位であるため、行が 75 オクテットを超える可能性があります。

簡単な解決策は、文字列を 1 文字ずつ調べ、エスケープして折り畳むことですが、これはかなり力ずくのように思えます。誰もがよりエレガントなソリューションを持っていますか?

4

3 に答える 3

2

まず、代わりにRFC5545を確認してください。RFC2445 は廃止されました。ここで私の PHP 実装を見つけることができます。

https://github.com/fruux/sabre-vobject/blob/master/lib/Property.php#L252

PHP には mb_strcut 関数があります。.NET に相当するものがあるかどうかはわかりませんが、少なくともそれは物事をより簡単にするでしょう。これまでのところ、エスケープ シーケンス ( \) を半分に折りたたむことに問題はありませんでした。優れたパーサーは、最初に行を展開してから、アンエスケープ処理を行います。特にどの文字をエスケープする必要があるかは、実際のプロパティによって異なります。(時々,または;エスケープされますが、そうでない場合もあります)。

于 2012-10-29T11:53:59.930 に答える