2 lisp newline sbcl common-lisp ccl
我有一个函数在Windows上读取一个文本文件(因此一个CRLF作为行结尾的文件),当我在这个文件上调用read-line时,我得到以CR结尾的字符串,这是用SBCL或Clozure CL.使用MKCL,CR和LF都被删除了.
所以我想知道,哪种实施是正确的?
根据标准,主要值line是读取的行,表示为字符串(没有尾随换行符,如果有的话).(见这里).因此,我认为应该没有CR或LF,但对我来说不是很清楚.
当然,有一些解决方法,但它很烦人,我想知道它是一个错误,还是仅仅依赖于实现.
我会说SBCL和Clozure CL违反Unicode Newline指南:
即使您知道哪些字符代表您的特定平台上的NLF,在输入和解释中,也可以将CR,LF,CRLF和NEL视为相同.只有在输出时才需要区分它们.
但是,我认为修剪返回值是错误的解决方案.
我认为你需要使用一个特定:external-format于实现的参数来open使用正确的(windows/CRLF)行终止模式.
CCL和SBCL是Windows实现,Windows支持相对较弱.两者似乎都没有认识到CRLF是Windows上的行结束格式.虽然你可以和维护者讨论 - 有些人甚至可能认为这不需要支持.
正确的做法是在Windows下读取一行并正确处理CRLF.Common Lisp认为行结束字符由单个NEWLINE字符表示.NEWLINE最好映射到Windows上的CRLF.有几个实现正在做这件事.
解决这个问题的一种方法是使用特殊的外部格式打开文件.CCL有这样的例子:http://ccl.clozure.com/manual/chapter4.5.html那么你可以像往常一样阅读流而不需要修剪字符.