0

あなたの助けが必要です。私は.icsphp関数を使ってiCalファイル形式を書いています。

iCalでファイルを開く.icsと、アプリケーションに「カレンダーはこのカレンダーファイルを読み取ることができません。カレンダーにイベントが追加されていません」と表示されます。

ただし、オンラインの.icsバリデーターを使用してファイルを検証すると、。を除いてすべてが正常であると表示されますline endingsバリデーターはこれを言います:

カレンダーで無効な改行形式が使用されています。単に\nではなく\r\ nを使用して行を終了するようにしてください(RFC2445§4.1)。おめでとう; カレンダーが検証されました!

しかし、これが私のiCalがファイルを読み取れない「本当の」問題であるかどうかはわかりません。まず、この行末を変更するにはどうすればよいでしょうか。

<?php

function wpse63611_events_feed_output(){
    $filename = urlencode( 'My-Events-' . date('Y') . '.ics' );

    // Start collecting output
    ob_start();

    header( 'Content-Description: File Transfer' );
    header( 'Content-Disposition: attachment; filename=' . $filename );
    header( 'Content-type: text/calendar' );
    header( "Pragma: 0" );
    header( "Expires: 0" );
?>
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//<?php  get_bloginfo('name'); ?>//NONSGML Events //EN
CALSCALE:GREGORIAN
X-WR-CALNAME:<?php echo get_bloginfo('name');?> - Events
<?php
    if ( have_posts() ):
        $now = new DateTime();
        $datestamp =$now->format('Ymd\THis\Z');
        while( have_posts() ): the_post();
            global $post;
            $uid = md5(uniqid(mt_rand(), true))."@mydomain.com";
            $start = unixToiCal(get_event_date($post, true, true), 2.0);
            $end = unixToiCal(get_event_end_date($post, true, true), 2.0);
            $summary = wpse63611_esc_ical_text(get_the_title());
            $description = apply_filters('the_excerpt_rss',  get_the_content());
            $description = wpse63611_esc_ical_text($description); ?>
BEGIN:VEVENT
UID:<?php echo $uid; ?>
<?php echo "\r\n"; ?>
DTSTAMP:<?php echo $datestamp; ?>
<?php echo "\r\n"; ?>
DTSTART:<?php echo $start; ?>
<?php echo "\r\n"; ?>
DTEND:<?php echo $end; ?>
<?php echo "\r\n"; ?>
SUMMARY:<?php echo $summary; ?>
<?php echo "\r\n"; ?>
DESCRIPTION:<?php echo $description; ?>
<?php echo "\r\n"; ?>
END:VEVENT
<?php endwhile; endif; ?>
END:VCALENDAR
<?php
    // Collect output and echo 
    $eventsical = ob_get_contents();
    ob_end_clean();
    echo $eventsical;
    exit();
}

function unixToiCal( $uStamp = 0, $tzone = 0.0 ) {
    $uStampUTC = $uStamp + ($tzone * 3600);       
    $stamp  = date("Ymd\THis\Z", $uStampUTC);
    return $stamp;       
}

function wpse63611_esc_ical_text( $text='' ) {
    $text = str_replace("\\", "", $text);
    $text = str_replace("\r", "\r\n ", $text);
    $text = str_replace("\n", "\r\n ", $text);
    return $text;
}

?>

これに何か問題がありますか?カレンダーが機能しない原因は何ですか?


更新 まあ、私は行末を修正しました、そしてカレンダーは今うまく検証します。したがって、検証時にエラーは発生しませんが、iCalで動作させることはできません。それを開くと、それでもカレンダーファイルが読み取れないと表示されます。これが私のスクリプトによって生成された実際のファイルです…<ahref="http://cl.ly/383D3M3q3P32"rel="nofollow"> http://cl.ly/383D3M3q3P32

4

2 に答える 2

3

出力を正規化するwpse63611_esc_ical_text()機能がありますが、それを一部の出力フラグメントにのみ適用します。面白いことに、このような関数はUnixスタイルの入力("\n")を期待しますが、メカニズム全体はソースコードをWindowsスタイル("\r\n")として保存することに依存しています。さらに、同じテキストで関数を2回呼び出すことがあります。

根本的な問題は、行末が何であるかを本当に知らないことだと思います。キーボードのEnterキーを押すと、コンピュータがWindowsを実行しているか、ある種のUnix(LinuxやMacOSなど)を実行しているかによって、実際には異なる文字が表示されます。Windowsでは、実際にはPHPのように2つの文字が表示されます。"\r\n"Unixでは、PHPのように表される1つの文字を取得します。"\n"エディターが十分に優れている場合は、コンピューターの実行に関係なく、選択した行末でファイルを保存できます。詳細については、[名前を付けて保存]ダイアログを確認してください。

実際にICSファイルを入力しているわけではないため、PHPが適切な文字を生成することを確認する必要があります。最も簡単な方法は、ソースコードを好きなように入力して保存してから、完全な出力を1回変換することです。

$output = strtr($output, array(
    "\r\n" => "\r\n",
    "\r" => "\r\n",
    "\n" => "\r\n",
));

おそらく、最初にコードをクリーンアップする必要があります。

于 2012-09-27T14:00:09.530 に答える
3

icalファイルを見ると2つのトピックがあります。

  1. 上記のように、すべての行は\ r \ nで終了する必要があります(つまり、次のことを確認する必要があります)

BEGIN:VCALENDAR

バージョン:2.0

..

また、適切に終了します

2.テキスト内のコンマをエスケープする必要があります(RFC5545§3.3.11:https ://www.rfc-editor.org/rfc/rfc5545#section-3.3.11を参照)

オンラインのicalendarバリデーターを介してそれらを実行することもできます:https ://stackoverflow.com/a/4812081/1167333の投稿の回答を参照してください

于 2012-10-01T17:35:11.210 に答える