回车符是否已过时?


26

我编写了一个开放源代码库,该库可以解析结构化数据,但由于看不到要点,因此特意省去了回车检测。它增加了额外的复杂性和开销,几乎没有好处。

令我惊讶的是,一个用户提交了一个错误,解析器无法正常工作,我发现了问题的原因是数据使用CR行尾而不是LF或CRLF。

自从切换到基于UNIX的平台以来,OSX一直没有使用LF样式的行尾吗?

我知道有些应用程序(例如Notepad ++)可以将行尾更改为显式使用CR,但我不明白为什么有人要这样做。

是否可以安全地排除支持(无论出于何种原因)决定使用旧Mac OS样式行尾的用户的统计上微不足道的支持?

更新:

需要说明的是,支持Windows行尾(即CRLF)不需要CR令牌识别。为了提高效率,词法分析器按每个字符进行匹配。通过静默忽略CR字符,CRLF令牌简化为LF。因此,CRLF令牌本身可以被认为是过时的,但这不是这个问题的目的。

最后一个为CR样式行结尾提供系统范围支持的操作系统是Mac OS 9。具有讽刺意味的是,在OSX中唯一仍将其用作默认值的应用程序是Microsoft Excel。


21
“它增加了额外的复杂性和开销”:我认为额外的复杂性和开销确实很小。
Giorgio

11
@EvanPlaice会不会给您带来更少的头痛,而是让您有更多的时间懒惰只是插入您专心排除的CR支持?
Pieter B

11
“从业务角度而言,机会成本太高。简单来说,我宁愿找到理由来证明自己的懒惰,而不是浪费时间为死平台添加边缘支持。”实施对CR的支持,而不是在此处发布问题以调查此功能的相关性。
乔治

4
@EvanPlaice的文化惰性绝对是一个很好的理由。
Pieter B

5
@EvanPlaice:写这个问题已经花费了您更多的时间,而不仅仅是在CR代码库中增加对换行符的支持。(...如果您坚信事实并非如此,则解析器的设计必须非常忙碌)
ZJR 2012年

Answers:


37

有一种好的做法,就是“对所接受的东西自由的,对所发送的东西是保守的”

换句话说,如果某人有机会(无论有多小)会给您cr行结尾(并希望它能正常工作),则需要提供支持。

TBH,我看不出添加CR支持会花费这么长时间。

当您cr在lexer窥视器中看到a 时,如果下一个字符是a nl,请吞下换行符并发出换行符,如果下一个字符不是a nl,则发出换行符并继续。


23
@ZJR:邮编法律很危险:采用稳健性原则时要非常小心,因为它经常适得其反。我们仍然存在的html解析混乱可以归因于这种思维方式。当程序接受格式错误的输入时,其结果很快就会成为预期行为,并取决于行为,并且以后在技术上正确的情况下,对格式错误的输入进行不同处理或根本不进行处理的任何更改通常都被认为是有缺陷的。
whatsisname 2012年

4
@whatsisname:我不同意。我认为生产质量软件应该功能强大。但是,开发工具链应该强烈不鼓励依赖这种鲁棒性,并且只能产生有效的输出。混乱的html是由近二十年来不良的工具引起的,而不是由浏览器的宽容造成的。
back2dos 2012年

2
@ back2dos:_ _是吗?不良的工具是由浏览器的宽容造成的。
amara 2012年

4
不良的工具是浏览器大战的结果
棘手怪胎

2
@Dibbeke:处理格式错误的输入只会将更大的输入空间映射到现有的状态空间,因此对它没有影响-前提是您的软件具有适当的关注点分离。
back2dos

21

不会。CR并不是过时的(定义为“不再生产或使用”)。您自己已经提供了证据。这也许不常见,但并不过时

至于对CR的“排除支持是否安全 ”?正如您所说,这不是失去销售的问题,您不能支持世界上所有奇怪的字符组合和文件格式,只有您自己知道软件和用户群。因此,我想说,如果您确信不添加它的支持负担(如mouviciel解释)不会超过添加它的时间负担,那么将其排除是安全的。但是在不了解产品和用户群的情况下,我不确定如何具体。


13
+1-IMO,OP正在尝试将CR标记为“过时”,以便他有理由不支持CR。
Stephen C

1
@StephenC我不是想隐藏这个事实。并不是我真的需要借口,我是作者,因此拥有最终发言权。关键是,它提出了一个有趣的问题。
伊万·普赖斯

18

关于懒惰:您必须平衡:

  • 努力更改代码,以便安全地处理CR(然后忘记它)。

  • 努力向用户说明他们数十年来满意的文件为何突然使您的应用程序崩溃,找到可以在不影响您的销售的情况下使用的变通办法,并在此处征求论点和意见。

由您决定哪个路径最懒。


好点,支持肯定要花时间。对于这种特殊情况,“销售”不是问题(即,它是开源的),但值得考虑的范围更大。同样,当遇到表示无效/不受支持的字符的CR时,我也可能在代码中引发异常。
伊万·普赖斯

7
@Evan:当然是开源的。如果不是这样,您的老板会告诉您“我不说'没人'再使用CR了!客户在抱怨。解决它!” :P这是OSS的大事,惹恼了我:缺乏对用户抱怨的实际案例的关注。无论您是否认为它已经过时,仍然有人在使用它。
cHao 2012年

1
因为它是开源的,所以您可以向所有用户写一封公开信,表示您将接受任何补丁对其进行修复。
rwong

1
@EvanPlaice:“注意力就是……货币”这两种方式都起作用。如果您希望人们使用您的应用程序,则它必须能够工作,并且必须解决他们的问题。损坏的应用程序是免费的,因此不能免于批评。我并不是说您需要做所有用户要求的事情;您应该拒绝令人反感的要求。但是,如果您不解决实际用户的问题,那么最终将失去用户。
cHao 2012年

1
@EvanPlaice:顺便说一句,当我的意思是“抱怨”时,我的意思是“提交一个错误报告,概述已损坏的内容和操作方式”,而不是“随意抱怨该软件有多糟糕”。
cHao 2012年

8

是否可以安全地排除支持(无论出于何种原因)决定使用旧Mac OS样式行尾的用户的统计上微不足道的支持?

也许没有太多的用户会检测到它,但是房间里有只大象:Windows行尾(CRLF)。如果您支持这些功能(即使我只使用Windows进行游戏,我通常也会这样做),但要支持这个历史悠久的百慕大三角区的第三部分应该是微不足道的。

如果您不支持这种情况,则至少应在文档中提及(“这不是错误”样式),以及如何更改文件以最简单的方式与工具一起使用(dos2unix例如)。


2
+1表示Windows使用CRLF-这是该操作系统上的默认行。而且没有办法保证.csv文件的来源,因此很容易可以在Windows系统上创建该文件。

1
在Windows中提及CRLF并不重要,因为如果您将LF当作断点,那么您将自动获得CRLF作为奖励。您可以在他的帖子文本中看到,OP知道这一点。
davidethell

@davidethell是的,就是这样完成的。当前,CR字符被静默忽略。尽管有大象。
伊万·普赖斯

6

发送之前,有许多串行设备依赖于CR数据流的结束ETX。这是一个永远不会消失的惯例。



1

从MSDOS开始的MS OS使用CR + LF组合作为行分隔符(我认为主要是因为需要它们的矩阵打印机)。

是的,这真是令人遗憾,但您仍然需要对此事的支持。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.