2

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

所以我想知道,哪个实现是正确的?

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

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

4

2 回答 2

6

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

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

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

于 2013-07-29T15:15:28.313 回答
5

我会说 SBCL 和 Clozure CL 违反了Unicode 换行指南

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

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

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

于 2013-07-29T15:15:19.217 回答