Php Can';似乎无法写入有效的.ics文件?

Php Can';似乎无法写入有效的.ics文件?,php,icalendar,line-endings,Php,Icalendar,Line Endings,我需要你的帮助。我正在用php函数编写一个iCal.ics文件格式 如果我用iCal打开.ics文件,应用程序会显示:“日历无法读取此日历文件。没有事件添加到您的日历。” 但是,如果我用一个验证文件,它会说除了行结尾之外,一切都应该正常。报告说: 您的日历使用的换行符格式无效。确保使用 \r\n到结束行,而不仅仅是\n(RFC 2445§4.1)。 祝贺您的日历已验证 但我不确定这是否是我的iCal无法读取文件的“真正”问题。 首先,我想知道如何改变这一行的结尾 <?php functi

我需要你的帮助。我正在用php函数编写一个iCal
.ics
文件格式

如果我用iCal打开
.ics
文件,应用程序会显示:“日历无法读取此日历文件。没有事件添加到您的日历。”

但是,如果我用一个验证文件,它会说除了
行结尾之外,一切都应该正常。报告说:

您的日历使用的换行符格式无效。确保使用 \r\n到结束行,而不仅仅是\n(RFC 2445§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;
}

?>

开始:VCALENDAR
版本:2.0
PRODID:-///非GML事件//EN
CALSCALE:格里高利
X-WR-CALNAME:-事件
开始:VEVENT
UID:
DTSTAMP:
DTSTART:
数据终端:
总结:
说明:
完:维文特
完:VCALENDAR

您可以使用
wpse63611_esc_icial_text()
函数对输出进行规范化,但您只能将其应用于某些输出片段。有趣的是,这样的函数需要Unix风格的输入(
“\n”
),但整个机制依赖于将源代码保存为Windows风格(
“\r\n”
)。此外,有时对同一文本调用函数两次

我认为根本问题在于你不知道什么是行尾。当您按下键盘的Enter键时,实际上会得到一个不同的字符,这取决于您的计算机运行的是Windows还是某种Unix(如Linux或MacOS)。在Windows上,实际上会得到两个字符,在PHP中表示为“\r\n”
”。在Unix上,您将得到一个字符,在PHP中表示为
“\n”
。如果你的编辑器足够好,不管你的计算机运行什么,它都允许你用你选择的行尾保存文件。查看“另存为”对话框了解更多信息

由于您实际上没有键入ICS文件,因此需要确保PHP生成适当的字符。最简单的方法是键入并保存源代码,然后转换一次完整的输出:

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

您可能需要首先清理代码。

您有
wpse63611_esc_icial_text()
函数来规范化输出,但您只将其应用于某些输出片段。有趣的是,这样的函数需要Unix风格的输入(
“\n”
),但整个机制依赖于将源代码保存为Windows风格(
“\r\n”
)。此外,有时对同一文本调用函数两次

我认为根本问题在于你不知道什么是行尾。当您按下键盘的Enter键时,实际上会得到一个不同的字符,这取决于您的计算机运行的是Windows还是某种Unix(如Linux或MacOS)。在Windows上,实际上会得到两个字符,在PHP中表示为“\r\n”
”。在Unix上,您将得到一个字符,在PHP中表示为
“\n”
。如果你的编辑器足够好,不管你的计算机运行什么,它都允许你用你选择的行尾保存文件。查看“另存为”对话框了解更多信息

由于您实际上没有键入ICS文件,因此需要确保PHP生成适当的字符。最简单的方法是键入并保存源代码,然后转换一次完整的输出:

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

您可能需要首先清理代码。

查看您的ical文件会带来两个主题:

  • 如上所述,您的所有行都需要结束于\r\n(即,您需要确保
  • 开始:VCALENDAR

    版本:2.0

    也有适当的结束

    2.需要在文本中转义逗号(参见RFC5545§3.3.11:)


    您还可以通过在线icalendar验证器运行这些功能。请参阅以下帖子答案:

    查看您的ical文件会带来两个主题:

  • 如上所述,您的所有行都需要结束于\r\n(即,您需要确保
  • 开始:VCALENDAR

    版本:2.0

    也有适当的结束

    2.需要在文本中转义逗号(参见RFC5545§3.3.11:)


    您也可以通过在线icalendar验证器运行这些内容。请查看以下帖子答案:

    您是否使用正确的行尾进行了尝试?好吧,行尾不是问题!我修复了行尾,但文件仍然无效!我更新了上面的问题。在修复问题时,请不要编辑问题,这会呈现当前答案没用。如果你有其他问题,请创建一个新问题。你能共享一个指向实际生成的ical文件的链接吗?@oberron我用生成的文件更新了我的问题!你用正确的行尾尝试了吗?好吧,行尾不是问题!我修复了行尾,但文件仍然无效!我更新了上面的问题。修复问题时请不要编辑问题,这会使当前答案无效。如果您有其他问题,请创建一个新问题。您可以共享指向实际生成的ical文件的链接吗?@oberron我用生成的文件更新了我的问题!谢谢,我已经更新了该文件。它现在可以验证,并且每个.ics验证程序都会告诉我该文件是100%正确。但是肯定缺少一些东西。谢谢,我已经更新了。现在验证很好,每个。ics验证程序都告诉我文件是100%正确的。但是肯定缺少一些东西。好的,我更新了我的代码,看起来像这样……输出的日历在所有这些验证中都得到了完美的验证。1分100分00.但是,我无法在mac上的“日历”应用程序中打开它。同时,在mac OSX下,“iCal”被重命名为“Calendar”…输出的文件如下所示:“.ics”文件可以在旧版本的iCal中打开,但似乎也不能正常工作。没有添加任何事件,但可以读取日历文件(因此,在打开时没有错误消息,但没有e。)