私は 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 文字ずつ調べ、エスケープして折り畳むことですが、これはかなり力ずくのように思えます。誰もがよりエレガントなソリューションを持っていますか?