在Windows上,CR仍然在Common Lisp中的读取行之后

时间:2013-07-29 14:23:48

标签: lisp newline common-lisp sbcl ccl

我有一个函数在Windows上读取一个文本文件(因此一个CRLF作为行结尾的文件),当我在这个文件上调用 read-line 时,我得到以CR结尾的字符串,并且这与SBCL或Clozure CL。使用MKCL,CR和LF都被删除了。

所以我想知道,哪种实现是对的?

根据标准,主要值line是读取的行,表示为字符串(没有尾随换行符,如果有的话)。(参见here) 。因此,我认为应该没有CR或LF,但对我来说不是很清楚。

当然,有一些解决方法,但它很烦人,我想知道它是一个错误,还是仅仅依赖于实现。

2 个答案:

答案 0 :(得分:5)

我会说SBCL和Clozure CL违反了Unicode Newline Guidelines

  

即使您知道哪些字符代表您的特定平台上的NLF,在输入和解释中,也可以将CR,LF,CRLF和NEL视为相同。只有在输出时才需要区分它们。

但是,我认为修剪返回值是错误的解决方案。

我认为您需要使用特定于实现的:external-format参数来open具有正确(windows / CRLF)行终止模式的文件。

答案 1 :(得分:5)

CCL和SBCL是Windows实现,Windows支持相对较弱。两者似乎都没有认识到CRLF是Windows上的行结束格式。虽然你可以和维护者讨论 - 有些人甚至认为这不需要支持。

正确的做法是在Windows下读取一行并正确处理CRLF。 Common Lisp认为行结束字符由单个NEWLINE字符表示。 NEWLINE最好映射到Windows上的CRLF。有几个实现正在做这件事。

解决此问题的一种方法是使用特殊外部格式打开文件。例如,CCL具有:http://ccl.clozure.com/manual/chapter4.5.html然后您可以像往常一样阅读流而无需修剪字符。