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

标签 ruby regex newline

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

> 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/

相关文章:

regex - 正则表达式中反斜杠后面的数字是什么意思?

C - 如何在不篡改输出文本中现有行的情况下编写新行?

c - C 中的 fscanf 没有读取整行?

ruby-on-rails - 为 delayed_job 设置 MAX_RUN_TIME - 我可以设置多少时间?

ruby - 将 .doc 或 .pdf 转换为图像并在 Ruby 中显示缩略图?

ruby-on-rails - 如何在 Ruby 中调用 super.super 方法

linux - 如何在 unix 中只删除 > [大于] 和 < [小于] 之间的一个换行符

ruby-on-rails - Rails 继续使用旧版本的图像

python - 正则表达式匹配超过预期

java - 正则表达式检测代码中的注释