gpt4 book ai didi

ruby - 为什么将字符串保存到文件时,\r\n 会被转换为\n?

转载 作者:数据小太阳 更新时间:2023-10-29 07:43:55 24 4
gpt4 key购买 nike

该字符串作为返回值源自:

> msg = imap.uid_fetch(uid, ["RFC822"])[0].attr["RFC822"]

如果我在控制台中键入 msg,则会显示一个长字符串,其中包含双引号和\r\n 分隔每一行:

> msg
"Delivered-To: email@test.com\r\nReceived: by xx.xx.xx.xx with SMTP id;\r\n"

如果我用正则表达式匹配它的一部分,返回值有\r\n:

> msg[/Delivered-To:.*?\s+Received:/i]
=> "Delivered-To: email@test.com\r\nReceived:"

如果我将字符串保存到文件中,将其读回并将其与相同的正则表达式匹配,我得到\n 而不是\r\n:

> File.write('test.txt', msg)
> str = File.read('test.txt')
> str[/Delivered-To:.*?\s+Received:/i]
=> "Delivered-To: email@test.com\nReceived:"

当字符串保存到文件时,\r\n 是否被转换为\n?有没有办法将字符串保存到文件中,在不修改行尾的情况下将其读回?

最佳答案

这包含在 the IO.new documentation 中:

The following modes must be used separately, and along with one or more of the modes seen above.

"b"  Binary file mode
Suppresses EOL <-> CRLF conversion on Windows. And
sets external encoding to ASCII-8BIT unless explicitly
specified.

"t" Text file mode

换句话说,与许多其他语言一样,Ruby 会感知其所在的操作系统,并在以文本模式读取/写入文件时自动转换“\r\n” <-> “\n” 之间的行结束符。使用二进制模式避免翻译。


str = File.read('test.txt')

更好的做法是使用 foreach 读取文件,这样就无需关心行尾;您将分别获得每一行。另一种方法是使用 readlines,但它使用 slurping which can be very costly在大文件上。

此外,如果您要处理邮件文件,我强烈建议您使用已编写的工具来执行此操作,而不是自己编写。 Mail gem 就是这样一个预先构建并经过良好测试的软件包。

关于ruby - 为什么将字符串保存到文件时,\r\n 会被转换为\n?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34274642/

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