2010-09-15 34 views
9

Khi tôi viết một tập tin bằng cách sử dụng Delphi nó trên một máy Windows và các tập tin văn bản nó đặt ra làm việc tốt trên cửa sổ. Khi tôi sử dụng nó trên máy Mac mặc dù nó hy vọng định dạng sẽ khác một chút. Trên Mac dòng mới là khác nhau và nó không phải luôn luôn có thể đọc các tập tin Windows.Dòng mới phổ quát cho tất cả các hệ điều hành là gì? (LF và CR)

Làm cách nào để các tệp của tôi có thể đọc được các tệp của tôi?

+0

Bạn có thấy^M char khi bạn mở tệp không? Chỉ tò mò thôi. Tôi nhớ đọc điều gì đó về điều này trong "Classic Shell Scripting" Tôi nghĩ vậy. Tôi tò mò muốn biết câu trả lời sẽ là gì. Xin lỗi không giúp đỡ nhiều. :-) Tôi hy vọng rằng bạn phải viết một kịch bản lệnh shell sẽ làm sạch các tệp của bạn của ký tự này trước khi bạn mở chúng trên mac. – mledbetter

+0

Điểm đến trên máy Mac là gì? tức là, những gì sẽ mở tập tin mà bạn đang tạo ra? – dawg

+0

@Mledbetter, nếu bạn thấy điều đó, điều đó thường có nghĩa là ba điều là đúng: Trước tiên, bạn đang xem tệp văn bản Mac hoặc Windows cũ. Thứ hai, trình soạn thảo của bạn ở chế độ Linux hoặc Mac mới. Và thứ ba, trình soạn thảo của bạn hiển thị các ký tự điều khiển với dấu mũ theo sau bởi một ký tự không kiểm soát. –

Trả lời

25
  • Đối với Windows, nó là CRLF
  • Đối với UNIX, nó là LF
  • Đối với MAC (qua phiên bản 9), đó là CR
  • Đối với MAC OS X, đó là LF

Thực tế đơn giản là nó khác nhau đối với tất cả các hệ điều hành. Không có dòng mới "phổ quát". Điều tốt nhất bạn có thể làm là nhận thức được sự khác biệt.

+4

Thực tế dòng mới "phổ quát" duy nhất là không có thứ gì như LFCR. Thực tế này có thể bị lạm dụng để có thể xử lý các tệp từ tất cả 3 hệ điều hành: trước tiên hãy kiểm tra xem đó có phải là LF nếu CR kiểm tra xem ký tự tiếp theo là LF hay không. – slebetman

+0

Gần đúng - nhưng có các hệ thống không sử dụng bất kỳ kết hợp CR hoặc LF nào cho các đầu cuối dòng.Chắc chắn có những hệ thống sử dụng EBCDIC và các bộ ký tự không liên quan đến ASCII khác. Thậm chí có một số hệ thống, tôi tin (có lẽ ai đó có thể xác nhận?), Sử dụng ASCII nhưng sử dụng cấu trúc dữ liệu tinh vi hơn cho các tệp văn bản hơn là một chuỗi ký tự đơn giản, vì vậy không có ký tự đầu dòng nào cả. – Steve314

+1

+1 để đề cập đến không có cách phổ quát; bạn nên đề cập đến http://en.wikipedia.org/wiki/Newline vì có nhiều hơn 4 ví dụ bạn đã đề cập –

8

Không có dòng mới cho tất cả các hệ điều hành. Bạn phải sử dụng linefeed trên một số, vận chuyển trở lại trên những người khác, và cả hai trên một số người khác.

Phần lớn trình chỉnh sửa văn bản có thể xử lý nhiều loại kết thúc dòng - kiểm tra tài liệu của bạn. Ngoài ra còn có rất nhiều tiện ích có thể dịch kết thúc dòng cho bạn.

2

Thay vì "dòng mới phổ quát", bạn có thể viết "định dạng chung" như JSON, XML, PDF v.v. tùy theo đầu ra của bạn được sử dụng làm dữ liệu cho chương trình khác hoặc tài liệu báo cáo được đọc bởi con người.

4

Trong đơn vị hệ thống, có một biến toàn cục DefaultTextLineBreakStyle được đặt dựa trên hệ điều hành. Nó có thể là tlbsLF hoặc tlbsCRLF. Nếu nó là tlbsLF, sử dụng # 10, nếu nó là tlbsCRLF sử dụng # 13 # 10.

Từ hệ thống:

type 
    TTextLineBreakStyle = (tlbsLF, tlbsCRLF); 

var { Text output line break handling. Default value for all text files } 
    DefaultTextLineBreakStyle: TTextLineBreakStyle = 
    {$IFDEF LINUX} tlbsLF {$ENDIF} 
    {$IFDEF MSWINDOWS} tlbsCRLF {$ENDIF} 
    {$IFDEF MACOS} tlbsLF {$ENDIF}; 

Tôi chỉ tự hỏi tại sao đó là một var và không phải là một const.

+2

Cũng trong đơn vị Hệ thống có hằng số sLineBreak được định nghĩa là {$ IFDEF LINUX} # 10 {$ ENDIF} {$ IFDEF MSWINDOWS} # 13 # 10 {$ ENDIF}. –

+2

Đó là một biến để bạn có thể viết một chương trình Linux xử lý các tệp văn bản Windows, ví dụ; chỉ cần gán một giá trị mới cho biến đó và mọi thứ khác hoạt động bình thường. –

+0

Âm thanh hợp lý với tôi. –

Các vấn đề liên quan