gpt4 book ai didi

haskell -\r\n 在 Haskell 中转换为\r\r\n

转载 作者:行者123 更新时间:2023-12-02 10:29:34 25 4
gpt4 key购买 nike

我使用的是 Windows 7 64 位。

我的程序需要从外部源检索一些文本(Utf8 编码),用它做一些事情,然后将其保存到磁盘。原始文本使用“\r\n”序列来表示换行符(我很乐意保持这种方式)。

问题:当使用 Data.Text.writeFile 时,每个“\r\n”序列似乎被翻译为“\r\r\n”,即每个“\n”都是翻译为“\r\n”,即使在原始文本中它前面已经有“\r”。据我所知,在 Windows 操作系统上写入文件时, '\n' 应该翻译为 "\r\n",如果前面没有 '\r' ,但将 "\r\n"翻译为“\r\r\n”似乎不对。

使用 ByteString.writeLine 应用于encodeUtf8版本的文本效果很好(没有在“\r\n”序列中插入额外的“\r”)

一个简单的例子:

{-# LANGUAGE OverloadedStrings #-}
import qualified Data.ByteString as B
import qualified Data.Text as T
import qualified Data.Text.IO as T (writeFile)
import qualified Data.Text.Encoding as T (encodeUtf8)

str = "Line 1 is here\r\nLine 2 is here\r\nLine 3 is here" :: T.Text

main = do
B.writeFile "byt.bin" $ T.encodeUtf8 str
T.writeFile "txt.bin" str

使用十六进制编辑器查看此代码生成的每个文件,可以看到通过 T.writeFile 行生成的文件中每个 x0A 前面添加了额外的 x0D。

B.writeFile: enter image description here

T.writeFile: enter image description here

我的问题:我做错了什么?有没有办法在 Windows 上使用 T.writeFile,而不是将“\r\n”转换为“\r\r\n”?

最佳答案

你的答案在 the docs :

Beginning with GHC 6.12, text I/O is performed using the system or handle's current locale and line ending conventions.

由于您自己没有打开句柄,因此该库很可能以文本模式打开文件,导致操作系统翻译结束行字符。您可以做的是使用 openBinaryFile 以二进制模式打开文件然后使用 Data.Text.hPutStr以防止这种情况发生。

但是,处理编码的操作系统也可能不是您想要的。根据您的场景,像使用 ByteString 那样显式编码/解码字符串可能是更好的主意。

关于haskell -\r\n 在 Haskell 中转换为\r\r\n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30997720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com