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