Windows 上的 Data.ByteString.Lazy.Char8 换行符转换——文档是否具有误导性?

2024-02-14

我对字节串库中的 Data.ByteString.Lazy.Char8 库有疑问。具体来说,我的问题涉及 readFile 函数,其记录如下:

将整个文件延迟读取到 ByteString 中。在 Windows 上使用“文本模式”来解释换行符

我对这个函数将“使用 Windows 上的文本模式来解释换行符”的说法感兴趣。该函数的源码如下:

-- | Read an entire file /lazily/ into a 'ByteString'. Use 'text mode'
-- on Windows to interpret newlines
readFile :: FilePath -> IO ByteString
readFile f = openFile f ReadMode >>= hGetContents

我们看到,从某种意义上说,文档中的声明是完全正确的:openFile函数(相对于openBinaryFile) 已被使用,因此将为文件启用换行转换。

But,然后该文件将被传递给 hGetContents。这将调用Data.ByteString.hGetNonBlocking(见源代码here http://hackage.haskell.org/packages/archive/bytestring/0.9.1.5/doc/html/src/Data-ByteString-Lazy.html#hGetContents and here http://hackage.haskell.org/packages/archive/bytestring/0.9.1.5/doc/html/src/Data-ByteString-Lazy.html#hGetContentsN),这意味着它是一个非阻塞版本Data.ByteString.hGet (see 文档 http://hackage.haskell.org/packages/archive/bytestring/0.9.1.7/doc/html/Data-ByteString.html#v%3ahGetNonBlocking);和(最后)Data.ByteString.hGet calls GHC.IO.Handle.hGetBuf (see 文档 http://hackage.haskell.org/packages/archive/bytestring/0.9.1.7/doc/html/Data-ByteString.html#v%3ahGet or 源代码 http://hackage.haskell.org/packages/archive/bytestring/0.9.1.7/doc/html/src/Data-ByteString.html#hGet)。这个函数的文档 http://hackage.haskell.org/packages/archive/base/4.2.0.2/doc/html/GHC-IO-Handle.html#v%3ahGetBuf

hGetBuf 忽略 Handle 当前使用的任何 TextEncoding,并直接从底层 IO 设备读取字节。

这表明我们使用打开文件的事实readFile而不是readBinaryFile是无关紧要的:尽管问题开头提到的文档中存在声明,但数据将在不转换换行符的情况下被读取。

那么,问题的核心是: 1.我错过了什么吗? “Data.ByteString.Lazy.Char8.readFile 在 Windows 上使用文本模式来解释换行符”这一说法是否正确?或者文档只是误导性的?

附:测试还表明,这个函数(至少当我简单地使用它时)在 Windows 上不会进行换行转换。


FWIW,软件包维护者 Duncan Coutts,回应了一些非常有帮助和启发性的评论。我已经请求他允许将它们张贴在这里,但在此期间,这里有一个释义。

基本点是文档曾经是正确的,但现在可能不正确了。特别是,当人们在 Windows 中打开文件时,操作系统本身允许您以“文本”或“二进制”模式打开它。和...之间的不同readFile and readBinaryFile used即在操作系统的文本模式下打开文件,在 Win32 上以二进制模式打开文件。 (它们在 POSIX 上都会做同样的事情。)重要的是,如果您以操作系统的二进制模式打开一个文件,就会有no way您可以从文件中读取而无需换行符转换:它发生了always.

当事情像这样设置时,问题中提到的文档是正确的——Data.ByteString.Lazy.Char8.readFile会使用System.IO.readFile;这将告诉操作系统打开文件“文本”,并且换行符将被转换,即使hGetBuf正在被使用。

然后,后来,哈斯克尔的System.IO进行了改进,使其对换行符的处理更加灵活——特别是允许在 POSIX 操作系统上运行 Haskell 版本,其中没有使用操作系统内置的换行符读取文件的功能,但支持使用 Windows 样式换行符读取文件;或者更准确地说,支持Python风格“通用”换行符转换 http://www.python.org/dev/peps/pep-0278/在两个操作系统上。这意味着:

  1. 换行符的处理被引入 Haskell 库;
  2. 文件是always在 Windows 上以二进制模式打开,无论您使用readFile or readBinaryFile; and
  3. 相反,选择readFile and readBinaryFile会影响是否System.IO的库代码设置为nativeNewlineMode or noNewlineTranslation。这将导致 Haskell 库转换为您执行适当的换行符转换。您现在还可以选择询问universalNewlineMode.

大约在同一时间,Haskell 获得了内置的适当编码支持System.IO(而不是假设输入为 latin-1 并简单地将输出字符截断为前 8 位)。总的来说,这是一件好事。

但是,至关重要的是,新的换行符转换现在内置于库中,永远不会影响什么hPutBuf does---大概是因为人们建造新的System.IO功能认为,如果以二进制方式读取罚款,任何插入自身的换行转换都可能是not程序员想要的,即是一个错误。事实上,99% 的情况可能都是如此:但在这种情况下,它会导致上述问题:-)

邓肯说,这些文档可能会发生变化,以在该库的未来版本中反映这个美丽的新世界。在过渡期,这个问题的另一个答案中列出了一个解决方法。 https://stackoverflow.com/a/6860159/194894

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 上的 Data.ByteString.Lazy.Char8 换行符转换——文档是否具有误导性? 的相关文章

随机推荐

  • 我应该对 UDP 使用(非阻塞)NIO 吗?

    根据这个帖子 https stackoverflow com questions 569555 non blocking udp i o vs blocking udp i o in java UDP 只是不阻塞 使用 非阻塞 NIO AP
  • 如何通过 UTC 偏移量确定时区?

    我有一个场景 我有一个时区偏移 以分钟为单位 需要确定它的时区 我知道所有数据都不可用 例如 可能有几个时区的偏移量为 240 分钟 但 最佳猜测 是可以接受的 我的第一遍看起来像这样 foreach var info in TimeZon
  • 无法让 Django/Postgres 应用程序设置在 Heroku 上运行

    我正在使用 Two Scoops of Django 模板制作一个 Django 应用程序 收到此 Heroku 错误 我的 Postgres 生产设置是否已关闭 操作错误 无法连接到服务器 连接被拒绝 服务器是否在主机 localhost
  • 如何向弹出窗口添加页脚并使内容可滚动?使用 Twitter 引导程序 3

    这是图片 我必须做的 如何向弹出窗口添加页脚并使内容可滚动 使用 Twitter 引导程序 3 要创建带页脚的弹出窗口 您必须更改弹出窗口template并添加一些 CSS 来设置页脚的样式 在这里 我还在页脚中放置了一个按钮 正如您在绘图
  • 毛里求斯国旗问题

    我已经为该问题制定了解决方案荷兰国旗问题 http en wikipedia org wiki Dutch national flag problem已经 但这一次 我想尝试一些更困难的事情 毛里求斯国旗问题 4 种颜色 而不是 3 种 对
  • 用逗号格式化json文件?

    我有一个 json 文件 bla bla bla bla bla bla bla bla 如何将它们格式化为有效的 json 类型 例如 bla bla bla bla bla bla bla bla bla bla 每个后面插入逗号 除了
  • Python中如何查找引发异常的位置

    如何确定在哪个函数中引发了异常 例如存在两个函数 foo 和 bar 在 foo 中 异常将随机引发 import random def foo if random randint 1 10 2 raise Exception bar de
  • 在doctrine2中是否可以有一个不是主键的自动增量列?

    在doctrine2中 我有一个实体 它有一个从Web服务提供的主键 并且还有一个应该是自动增量的索引 我可以在mysql中手动设置 但无法在doctrine2中进行此设置 I used columnDefinition of INT AU
  • Windbg lm:“延迟”是什么意思?

    我正在 WinDbg 中调试 NET 2 0 程序集的故障转储文件 当我在 WinDbg 中输入 lm 时 我会得到一长串已加载的模块 如下所示 723c0000 72950000 mscorwks deferred 这里的 延期 是什么意
  • 接口和@RequestBody

    我目前正在开发一个项目 该项目允许用户 通过网络 预订在给定时间段内使用所选资源 在这个程序中 我试图遵循 Spring 的接口编程哲学 以及一般的最佳实践 因此我尝试在具体类中重复功能的任何地方使用接口 我创建的一个接口称为 Bookab
  • 当我从 Process.Start(url) 打开 url 时,c# Google chrome 在某些 PC 上崩溃

    在某些 PC 上 当我想显示网址时 Google Chrome 会崩溃 我用了Process Start url and UseShellExecute true 请注意 它在我尝试过的大多数电脑上都能正常工作 但在某些电脑上却不能 Chr
  • 使用 requirejs + uglify 限制行长度

    我们正在使用requirejs optimize config 在我们的构建脚本中使用 uglify2 来缩小我们的生产 JavaScript 代码 我们希望将缩小后的行长度限制为大约 80 个字符 这样即使在生产代码中也可以更轻松地调试
  • Angular 5 中 value 和 ngValue 的区别

    今天 我意识到 Angular 5 中的反应式表单出现了意外的 对我来说 行为 服务器从应用程序接收到一个值为 null 的字符串 而不是我想要的 null 值 我做了以下测试 https stackblitz com edit angul
  • 如何减少 androidx.compose.material3.OutlinedTextField 的高度

    我在降低高度时遇到困难OutlinedTextField在撰写中 我正在尝试在里面做一个搜索栏TopAppBar就像许多谷歌应用程序 Gmail Play Store 中所做的那样 我无法在材料3中实现这一点 我尝试复制OutlinedTe
  • Chrome扩展从内容脚本到后台html的sendMessage错误

    我刚刚将我的 chrome 扩展更新为 json 版本 2 并尝试让我的扩展再次工作 问题是 sendRequest 一路上被贬值了 所以我复制代码https developer chrome com extensions messagin
  • 确定 C 可执行文件名称

    当我们编译 C 程序时 输出存储在 a out 中 我们如何将编译后的输出重定向到另一个文件 大多数 C 编译器为此提供了一个选项 例如 o选项gcc和其他一些 gcc o gentext gentext c cc o mainprog L
  • 如何获取neo4j路径中的最后一个节点?

    在这个密码查询中 将返回与 STATUS on 属性有关系的节点之间的最长路径 但我还想获取路径的最后一个节点 query START n node MATCH p n rels INCLUDE gt m WHERE ALL rel IN
  • 具有负权重的 Dijkstra 算法

    我们可以使用具有负权重的 Dijkstra 算法吗 STOP 在你认为 哈哈 你可以在两点之间无休止地跳跃并获得一条无限便宜的路径 之前 我更倾向于考虑单向路径 其应用是具有点的山区地形 显然 从高到低并不需要能量 事实上 它会产生能量 因
  • Facebook 身份验证对话框:开发人员关于使用“显示”类型“弹出窗口”的警告

    从今天开始 我们在身份验证对话框中收到开发人员警告 其中包含以下消息 您在大型浏览器窗口或选项卡中使用 弹出窗口 显示类型 为了获得更好的用户体验 请使用我们的 JavaScript SDK 显示此对话框 而不指定显式显示类型 SDK 将为
  • Windows 上的 Data.ByteString.Lazy.Char8 换行符转换——文档是否具有误导性?

    我对字节串库中的 Data ByteString Lazy Char8 库有疑问 具体来说 我的问题涉及 readFile 函数 其记录如下 将整个文件延迟读取到 ByteString 中 在 Windows 上使用 文本模式 来解释换行符