在Windows上,在阅读了Common Lisp中的行之后,CR仍然在这里



我有一个函数在Windows上读取一个文本文件(因此是一个以CRLF为行结尾的文件),当我调用该文件上的读取行时,我会得到以CR结尾的字符串,以及以SBCL或Clozure CL结尾的字符串。使用MKCL,CR和LF都会被删除。

所以我想知道,哪种实施方式是正确的?

根据标准,主值line是读取的行,表示为字符串(如果有,则不包含尾部换行符)(请参见此处)。因此,我认为应该没有CR或LF了,但这对我来说不是很清楚

当然,也有变通办法,但这很烦人,我想知道这是一个bug,还是仅仅取决于实现。

CCL和SBCL是对Windows支持相对较弱的CL实现。两者似乎都没有意识到CRLF是Windows上的行尾格式。尽管您可以与维护人员争论,但有些人甚至可能认为这不需要支持。

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

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

我认为SBCL和Clozure CL违反了Unicode Newline准则:

即使您知道在特定平台上哪些字符代表NLF,在输入和解释时,也要对CR、LF、CRLF和NEL一视同仁。只有在输出时,才需要区分它们。

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

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

最新更新