【问题标题】:What is the universal newline for all operating systems? (LF and CR)所有操作系统的通用换行符是什么? (LF 和 CR)
【发布时间】:2011-04-12 20:18:49
【问题描述】:

当我使用 Delphi 编写文件时,它在 Windows 机器上,它输出的文本文件在 Windows 上运行良好。当我在 Mac 上使用它时,它期望格式会有所不同。在 Mac 上,换行符不同,它不能总是读取 Windows 文件。

如何让我的文件被 mac 程序读取?

【问题讨论】:

  • 您在打开文件时是否看到 ^M 字符?只是好奇。我记得我认为在“Classic Shell Scripting”中读过一些关于此的内容。我很好奇答案会是什么。抱歉帮不上什么忙。 :-) 我希望你必须编写一个 shell 脚本,在你在 mac 上打开它们之前清理你的这个字符的文件。
  • Mac 上的目的地是什么?即,什么会打开您正在创建的文件?
  • @Mledbetter,如果您看到这一点,通常意味着三件事是正确的:首先,您正在查看 Windows 或旧的 Mac 文本文件。其次,您的编辑器处于 Linux 或新的 Mac 模式。第三,您的编辑器会显示带有抑扬符的控制字符,后跟一个非控制字符。
  • 根据 Deep Thought,答案是“42”
  • @mjustin,啊……*字符。这一切都加起来了。

标签: windows delphi macos newline


【解决方案1】:
  • 对于 Windows,它是 CRLF
  • 对于 UNIX,它是 LF
  • 对于 MAC(直到版本 9)它是 CR
  • 对于 MAC OS X,它是 LF

简单的事实是所有操作系统都不同。没有“通用”换行符。你能做的最好的就是意识到这些差异。

【讨论】:

  • 唯一的“通用”换行符事实是没有 LFCR 这样的东西。这个事实可以被滥用来处理来自所有 3 个操作系统的文件:首先检查它是否是 LF,否则如果它是 CR 检查下一个字符是否是 LF。
  • 几乎正确 - 但有些系统不使用 CR 或 LF 的任何组合作为行尾。当然,有些系统使用 EBCDIC 和其他非 ASCII 相关的字符集。甚至有一些系统,我相信(也许有人可以证实?),使用 ASCII 但对文本文件使用比简单的字符代码序列更复杂的数据结构,因此根本没有行尾字符。跨度>
  • +1 表示没有通用的方法;你应该提到en.wikipedia.org/wiki/Newline,因为你提到的例子不止4个
  • 注意 Mac 上旧版本的 Excel(甚至可能是当前版本 - 但我使用的是 Office 2011),因为我相信它使用 Windows 行尾,而不是 OS X,这是如果您尝试通过脚本处理这些文件,则有点混乱。
【解决方案2】:

没有适用于所有操作系统的通用换行符。您必须在一些上使用换行符,在另一些上使用回车,在其他一些上同时使用。

大多数文本编辑器可以处理多种换行符 - 请查看您的文档。还有很多实用程序可以为您翻译行尾。

【讨论】:

    【解决方案3】:

    在系统单元中有一个基于操作系统设置的全局变量 DefaultTextLineBreakStyle。它可以是 tlbsLF 或 tlbsCRLF。 如果是 tlbsLF,使用 #10,如果是 tlbsCRLF,使用 #13 #10。

    来自系统:

    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};
    

    我只是想知道为什么它是 var 而不是 const。

    【讨论】:

    • 在系统单元中还有一个 sLineBreak 常量,定义为 {$IFDEF LINUX} #10 {$ENDIF} {$IFDEF MSWINDOWS} #13#10 {$ENDIF}。
    • 它是一个变量,这样你就可以编写一个处理 Windows 文本文件的 Linux 程序,例如;只需为该变量分配一个新值,其他一切都会正常工作。
    【解决方案4】:

    您可以编写“通用格式”而不是“通用换行符”,例如 JSONXML、PDF 等,具体取决于您的输出是否注定要用作另一个程序的数据或要读取的报告文档人类。

    【讨论】:

      【解决方案5】:

      http://en.wikipedia.org/wiki/Newline

      因此,对于最高版本 9 的 MacOS,您必须编写 $0D,对于 MacOS X,您必须编写 $0A

      【讨论】:

        【解决方案6】:

        非常古老的线程仍然非常相关。 当您从不同的操作中获取文本数据时,处理这种情况和其他情况的最简单方法是首先对信息进行规范化。 这是 Javascript,但您应该能够轻松地将其更改为任何其他语言。

                body = body.replace(/(\r\n|\r)/g,"\n");
        

        在大多数语言中,它可以翻译成这个(但在 JS 中,它只会替换第一次出现。)

                body = body.replace("\r\n","\n");
                body = body.replace("\r","\n");
        

        它只会确保换行符由 "\n" 表示,如果您想要例如 windows 格式,您只需在上面添加..

                body = body.replace("\n","\r\n");
        

        【讨论】:

          猜你喜欢
          • 2019-03-14
          • 1970-01-01
          • 2013-06-22
          • 1970-01-01
          • 2018-06-20
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多