简体中文

文本和日常工具·文本工具包

CR、LF 和 CRLF:行尾从何而来以及粘贴文本为何中断

· 背景

行结束符 文本清理 数据导出

回车和换行控制字符连接和分隔文本行
原始 ToolAcre 矢量图

解释回车和换行的电传打字机起源、为什么操作系统选择不同的约定,以及这些选择如何在粘贴的文本中显示为双空行和杂散字符。

导出时每行后都有一个空行 - 为什么来自另一个系统的文件粘贴的行数是原来的两倍

您粘贴三行导出并在每条记录后看到一个空行。人们很容易立即责怪 Windows CRLF,但符合标准的文本区域通常会以标准化形式显示换行符。双行通常意味着早期转换将回车符和换行符视为两个独立的分隔符,或在记录之间插入额外的换行符。

保留原始版本,直到知道哪个阶段更改了它。在可以显示控制字符的编辑器中比较源代码,然后比较粘贴的行数。 ToolAcre 故意接受 CRLF、LF 和单独的 CR 作为一个边界,因此未更改的三记录文件应该生成三行而不是六行,仅仅因为它来自 Windows。

额外的空白行是一种症状,并不能证明 CRLF 单独导致它

这些名称描述了打印终端上的物理操作。回车将笔架移动到当前行的开头,而换行则将纸张推进到下一行。它们是单独的控件,因为任一运动都可以独立请求。 ASCII 将它们保留为十进制 13 处的控制字符 CR 和十进制 10 处的 LF。

现代屏幕不再移动纸张,但字节值在文件、协议和编程接口中仍然存在。历史解释了为什么 CR 和 LF 不是可互换的标点符号以及为什么 CRLF 是两个字符序列。这并不意味着每个现代应用程序都单独处理它们;解析器通常将这一对识别为一个逻辑行结尾。

三种约定 - Unix 和现代 macOS 上的 LF、Windows 上的 CRLF、经典 Mac 操作系统上的 CR,以及为什么每种约定看起来都很合理

Unix 和类 Unix 系统通常使用 LF 作为行结尾,现代 macOS 也遵循该约定。 Windows 文本文件通常使用 CRLF。经典Mac OS单独使用CR,但Mac OS X采用了Unix基础和LF。当工具在未就规范化达成一致的情况下交换纯文本时,这些选择仍然可见。

没有任何约定可以使词语本身有所不同。问题出现在读者只期望一种表示形式或天真地在每个控制字符上分割的边界处。强大的行解析器在检查单独的 CR 或 LF 之前先将 CRLF 作为一对进行检查。 ToolAcre 正是使用有序模式 ` | | `,然后将转换后的输出与 LF 连接。

浏览器文本框中发生的情况 - 通常如何在粘贴时规范换行符以及仍然出现杂散字符的位置

HTML 定义了文本控件中换行符的特殊处理。在文本区域值中,浏览器将公开值中的 CRLF 和单独的 CR 规范化为 LF,而表单提交可以应用表单数据规则来换行。因此,在盒子中看起来正确的粘贴仍然可以由另一层以不同的方式序列化,或者按照另一种约定复制到软件中。

当文本绕过普通文本区域、显示转义字节(例如文字字符 `\r`)或解析器仅在 LF 上拆分并将 CR 附加到每个字段时,杂散 CR 仍然可能出现。浏览器只是路径中的一个阶段,而不是文件、剪贴板生成器、API 和命令行使用者的通用修复服务。

浏览器规范文本区域换行符,但剪贴板和下游格式仍然不同

空白行和尾随回车符需要不同的诊断。在 ToolAcre 识别出所有三种行结束样式后,“删除空行”会删除内容为空或空格的行。修剪线删除每一行的前导和尾随空白。由于 ToolAcre 的分离器消耗真正的 CR 分隔符,因此通常不需要仅仅为了擦除该分隔符而进行修剪。

仅当存在空格、制表符或未使用的文字字符时才使用修剪,并在更改之前检查有意义的缩进。如果文本包含可见的 `^M`,请确定查看器正在渲染实际的 CR 还是这两个可打印字符。毯子更换可能会损坏预期内容,而检查之前和之后的计数会给出可审查的结果。

删除空行修复空行; ToolAcre正确分割CR后通常不需要修剪

对于可重现的示例,从三个名称开始,其损坏的中间表示在每个名称之间包含一个空行:`Ada`、空白、`Grace`、空白、`Linus`。字数和字符计数器报告五行。这是故意加倍输入;仅真正的 CRLF 序列将被识别为一个边界,并且不会在 ToolAcre 中创建那些空行。

选择“删除空行”,输出变为用 LF 连接的三行。计数器现在应该报告三。如果导入的值还带有填充,请单独运行修剪线并查看结果。将这些操作分开可以证明每个操作修复了哪些缺陷,而不是将每个清理都归因于 Windows 文本的模糊转换。

工作示例:清理故意加倍的导出并验证行数

行结束清理不会修复硬包装,其中一个逻辑句子被故意以列宽打断。从该材料中删除每个换行符也会加入真正的段落和列表项。在对整个块应用线条操作之前,确定边界是否代表一条记录、一个段落或视觉换行。

它也不诊断字符编码。 UTF-8 字节顺序标记、替换菱形、mojibake 和解码失败涉及字节如何变成字符,而不是 CR 或 LF 是否将这些字符分隔成行。在将奇怪的可见符号视为行结尾之前,保留原始文件并使用适当的文件感知工具识别其编码。

要点 — 行结尾是你可以看到的历史;文本工具包的线条工具和计数器可让您在几秒钟内修复症状

CR、LF 和 CRLF 是历史控件,具有当今的兼容性后果。最安全的心智模型是具有多种物理表示的一条逻辑线边界。在删除任何内容之前,计算记录数、检查源约定并确定引入空行或保留控制字符的阶段。

对于粘贴的材料,请打开位于 `/tools/text/` 的文本工具包,记下初始行数,仅在真正不需要空行时应用“删除空行”,并仅对周围的空白使用“修剪行”。之后重新检查计数和样本记录。这个简短的审核将不可见的格式问题转化为受控的、可逆的文本转换。