gpt4 book ai didi

string - 什么是已弃用的 `Data.ByteString.Lazy.putStrLn` 的更安全和正确的替代方案,为什么?

转载 作者:行者123 更新时间:2023-12-04 12:51:20 27 4
gpt4 key购买 nike

我想知道为什么Data.ByteString.Lazy.putStrLn已弃用,但Data.ByteString.Lazy.putStrData.ByteString.Lazy.hPutStr
不是?

-- | A synonym for @hPut@, for compatibility
--
hPutStr :: Handle -> ByteString -> IO ()
hPutStr = hPut

-- | Write a ByteString to stdout
putStr :: ByteString -> IO ()
putStr = hPut stdout

-- | Write a ByteString to stdout, appending a newline byte
--
putStrLn :: ByteString -> IO ()
putStrLn ps = hPut stdout ps >> hPut stdout (singleton 0x0a)

{-# DEPRECATED putStrLn
"Use Data.ByteString.Lazy.Char8.putStrLn instead. (Functions that rely on ASCII encodings belong in Data.ByteString.Lazy.Char8)"
#-}

-- | The interact function takes a function of type @ByteString -> ByteString@
-- as its argument. The entire input from the standard input device is passed
-- to this function as its argument, and the resulting string is output on the
-- standard output device.

我认为那是因为字符串中存储的字符
如果不指定编码,将不会正确输出
明确地。

但这应该适用于所有这些功能。

现在我怀疑只有换行符是原因
考虑到这个功能不好。

然后,我可以简单地做
Data.ByteString.Lazy.putStr myString >> System.IO.putStrLn ""

并且在输出时不会丢失信息感到安全吗?
.Char8变体感觉有点危险。

最佳答案

已弃用的 putStrLn假设它知道如何编码 '\n'特点。您列出的其他函数都没有假设任何有关编码的内容;他们只是传递你传递给他们的字节。 (您的工作是确保这些字节对于您打算使用的编码是正确的。)我同意 .Char8模块不是那么热——它使用 latin1整个编码,没有通过 21 世纪的测试。你考虑这个代码:

ByteString.putStr myString >> System.IO.putStrLn ""

我不建议这样做:它让您有机会在用于构造 myString 的编码之间存在不匹配。以及 System.IO.putStrLn 的编码正在使用。相反,请确保 myString最后有一个编码的换行符。

关于string - 什么是已弃用的 `Data.ByteString.Lazy.putStrLn` 的更安全和正确的替代方案,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28965426/

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