以二进制模式打开文件并保存它会添加新行

时间:2014-08-15 07:27:06

标签: ruby file-io binary newline

为什么这会为文件中的每一行添加一个新行?

text = File.read('1.txt', mode: 'rb', encoding: 'UTF-8')  
File.write('1.txt', text, encoding: 'UTF-8')

如果我删除二进制模式,它再次正常,但我需要它用于另一种编码(UTF-16LE)。

测试 - http://asdfasd.net/ruby/binary_adds_newline.zip

1 个答案:

答案 0 :(得分:4)

我做了一些测试;这取决于你的线路结束的方式。当他们以 <{em> LF\n)或CR\r)结束时,它会产生您期望的输出。也就是说,没有添加新行。但是,如果您有CRLF\r\n),则会在每一行后面添加一个CR字符,从而有效地结束CRCR+LF,从而产生额外的行。

大多数编程编辑器允许您选择使行结束可见的选项。

我不确定为什么会发生这种情况,但可能与'b'模式下the IO docs的以下代码段有关:

  

抑制EOL&lt; - &gt; Windows上的CRLF转换。

使用二进制模式时,CRLF(Windows上的默认行尾)将转换为LF。因此,简单的解决方案似乎只是用\r\n\n替换所有\r。你可以这样做:

File.open('converted.txt', 'wb') do |converted|
  File.open('1.txt', 'rb').each_line do |line|
    converted << line.gsub("\r\n", "\n") # Replace CRLF with LF
  end
end

如果你在同一个文件上多次运行脚本,你应该确保在写回之前用CRL替换CRLF:

# Note the .gsub at the end here
text = File.read('1.txt', mode: 'rb', encoding: 'UTF-8').gsub("\r\n", "\n")
File.write('1.txt', text, encoding: 'UTF-8')