如果没有格式化问题,则无法将IP写入文本文件

时间:2017-07-24 21:15:37

标签: ruby

我无法从文本文件中读取IP并将其正确写入另一个文本文件。它将文件中写入的IP显示为:“ÿþ19 2。1 6 8. 1 1 0.4”

#Read the first line for the IP
def get_server_ip
  File.open("d:\\ip_addr.txt") do |line|
    a = line.readline()
    b =  a.to_s
  end
  end

#append the ip to file2
def append_ip
  FileUtils.cp('file1.txt', 'file2.txt')
  file_names = ['file2.txt']
  file_names.each do |file_name|
  text = File.read(file_name)
  b = get_server_ip
  new_contents = text.gsub('ip_here', b)
  File.open(file_name, "w") {|file| file.puts new_contents }
  end
  end

我试过.strip和.delete('')没有运气。有谁能看到这个问题?

谢谢

1 个答案:

答案 0 :(得分:3)

该文件是在Windows上使用记事本生成的。它编码为UTF-16LE

文件中的前两个字节包含代码0xFF0xFE;这是UTF-16LE的{​​{3}}。

每个字符编码为2个字节(16位),最低有效字节编码(Less Endian顺序)。 输出中可打印字符之间的空格实际上是Bytes Order Mark(代码为0的字符)。

您可以做的事情(除了将文件转换为更合适的格式,例如UTF-8甚至ISO-8859-1)是将'rb:BOM|UTF-16LE'作为NUL characters的第二个参数传递

  • r告诉File#open以只读模式打开文件(默认情况下也是如此);
  • b表示“二进制模式”;它是BOM|UTF-16;
  • 所必需的
  • :BOM|UTF-16LE告诉Ruby读取并忽略文件中存在的BOM,并期望文件的其余部分编码为UTF16-LE

如果可以的话,我建议你使用一个不错的编辑器(甚至可以使用记事本)将文件编码转换为UTF-8ISO-8859-1,所有这些问题都会消失。