2009-03-20 32 views
34

Tôi đang cố gắng tìm hiểu cách mã hóa dòng mới trong phần MÔ TẢ của tệp iCal theo cách mà chúng sẽ nhập đúng vào Outlook, Lịch Google và Lịch Apple.Mã hóa dòng mới trong các tệp iCal

Mã ban đầu tôi kế thừa được sử dụng "= 0D = 0A" với mã hóa có thể in được, có thể hoạt động tốt trong Outlook, nhưng không hoạt động trong Lịch Google.

Thông số này có vẻ như bạn nên sử dụng "\ n" để đại diện cho dòng mới. Điều này hoạt động tốt trong Lịch Google, nhưng Outlook chỉ đặt các ký tự "\ n" theo nghĩa đen trong đó.

Có cách nào bạn đã thực hiện việc này sẽ hoạt động liên tục trên các hệ thống lịch không?

+2

Phần của đặc điểm kỹ thuật iCal được đề cập là: http://tools.ietf.org/html/rfc5545#section-3.3.11 –

Trả lời

31

OK, có vẻ như tôi đang trả lời câu hỏi của riêng mình.

Cách chính xác để thực hiện việc này là sử dụng "\ n" cho ngắt dòng. Outlook không nhận ra điều này vì tôi đã có "ENCODING = quoted-printable" trên mô tả. Khi tôi đã xóa, Outlook hiển thị các dòng mới chính xác.

Ngoài ra, để mở tệp một cách chính xác trong Apple iCal, bạn cần sử dụng "VERSION: 2.0" cho phiên bản tệp. Nếu bạn sử dụng "VERSION: 1.0", nó sẽ cho bạn biết nó không thể đọc tệp (mặc dù nó tuân theo thông số 1.0).

+1

cho bất kỳ ai đã thêm \ n để tạo dòng mới và vẫn không hoạt động , Tôi đã kết thúc bằng cách sử dụng \\ n như được ghi chú bởi @periklis –

19

Có thể đáng nói rằng bạn cần chữ \ n, không phải ký hiệu dòng mới, nghĩa là dấu gạch chéo ngược rồi n trong ical. Cũng đừng quên làm 75 nhân vật "gấp" quá.

0

Tôi phải thoát khỏi đầu ra trong chuỗi để đặt chữ "\ n" trong tệp đầu ra. Như vậy. Làm việc một say mê.

$events .= "DESCRIPTION:" . str_replace("\n","\\n",str_replace(";","\;",str_replace(",",'\,',get_event_contents()))) . "\n"; 
21

Nhận xét có liên kết tới RFC từ Matthew Bucket ở trên bài đăng gốc đã giúp tôi. Trích dẫn từ đó:

Một nhân vật xuyệc ngược trong một "TEXT" giá trị tài sản PHẢI được thoát với một nhân vật xuyệc ngược

Vì vậy, tôi đã làm một

$description = str_replace("\r\n", "\\n", $description); 

và nó làm việc

+0

Trích dẫn và mã dường như không khớp. Mã thay thế nguồn cấp dữ liệu dòng Windows bằng các chuỗi '\ n' theo nghĩa đen. –

+2

Điều này thật kỳ lạ khi thấy '\\ n' và bên cạnh không thể hiểu đúng. Trong NET đất tôi tạo ra 'const chuỗi textLineFeed = @" \ "+" n ";' –

+0

Giải pháp của bạn là viên đạn ma thuật cho tôi. Tôi đã thử tất cả những người khác trên trang này không thành công. Cảm ơn bạn. – Krafty

6

Tệp đầu ra của bạn phải như sau ---

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//2013//#Ur Site Name#//EN 
BEGIN:VEVENT 
UID:[event]2012 
DTSTART:20130101T100000 
DTEND:20130101T120000 
LOCATION: 
SUMMARY:#Meeting Title here# 
DESCRIPTION:What is realistic for financial services companies to achieve via Social Media channels? \n\nJoin us on 11th September 2013 at 4pm (BST) where we 
-----bla bla bla ---- 
END:VEVENT 
END:VCALENDAR 

Ở đây bạn phải chăm sóc Phiên bản, nó phải là 2.0 và Escape char ... \ n (dòng mới), dấu chấm phẩy (;) và dấu phẩy (,). Nếu bạn đang viết trong .net thì nó sẽ giống như ... "\\ n", "\\;" và "\\".

Bạn cũng có thể kiểm tra tệp đầu ra của mình trên trang web này ...http://icalvalid.cloudapp.net/

Cảm ơn, Bhaskar

+0

+1 cho trình xác thực và cũng đề cập đến các ký tự khác cần thoát –

+0

Các dòng không được chứa nhiều hơn 75 ký tự: http://tools.ietf.org/html/rfc5545#section-3.1 – ofaurax

+0

Trình xác thực được đề cập trong câu trả lời không còn khả dụng nữa. Dưới đây là hai trường hợp khác, cho kết quả khác nhau (nhưng hợp lý trong cả hai trường hợp): https://icalendar.org/validator.html, http://ical-validator.herokuapp.com/ – tcmb

1

Đây là câu trả lời của tôi cho DESCRIPTION

$filev = str_replace("\r\n", '\\n', $p); 
$filev = str_replace("<br>",'\\n',$filev); 
$filev = (str_replace(";","\;",str_replace(",",'\,',$filev))); 
0

Theo this RFC:

dòng nội dung được giới hạn bởi một ngắt dòng, mà là một CRLF chuỗi (ký tự CR theo sau ký tự LF).

Vì vậy, bạn nên sử dụng \r\n. Tôi đã sử dụng điều này trong chuỗi mà không có thêm dấu gạch chéo ngược.