【问题标题】:How to read a file with a UTF-8 BOM using File.foreach in ruby如何在 ruby​​ 中使用 File.foreach 读取带有 UTF-8 BOM 的文件
【发布时间】:2019-08-07 16:45:56
【问题描述】:

我想使用 ruby​​ 的 file.foreach 读取带有 UTF-8 Bom 的文本文件。通过添加作为第一行将 bom 插入文件中: myFile.write "\uFEFF"。 从此链接下载 myFile.txt:

https://wetransfer.com/downloads/b42363faaff561e7e3ca2edbe850d88d20190807164816/c6e4e1

我只是尝试像这样读取文件

  File.foreach(myFile).with_index do |line, line_num|
    puts "line = " + line
    puts "line.bytes = " + line.bytes.to_s()
    puts "line.bytes.map(&:chr) = " + line.bytes.map(&:chr).to_s()
  end

问题是该行看起来文件的每一行都是空的。但是我可以看到那里有一些使用字节的东西。还尝试使用 File.foreach 的编码参数如下

  File.foreach(myFile, :encoding=> 'r:bom|utf-8').with_index do |line,line_num|
    puts "line = " + line
    puts "line.bytes = " + line.bytes.to_s()
    puts "line.bytes.map(&:chr) = " + line.bytes.map(&:chr).to_s()
  end

但我得到了相同的结果。在这两种情况下,ruby 似乎都可以识别 utf-8 bom,因为puts line.encoding 会产生“utf-8”。但是我不能像往常一样访问行字符串的字符。例如,使用 myFile.txt 永远不会触发以下条件。

   if line[0,5] == 'Hello'
     puts "Hello catched"
   end  

你知道如何使用 file.foreach 命令读取我的文件吗?

问候

【问题讨论】:

  • 请不要在下载前使用wetransfer或其他不可读的文件托管。最好使用pastebin.com
  • "a text file with an UTF-8 Bom" – 您的文件以0xFF 0xFE 开头,这是 UTF-16 的字节顺序标记(小字节序)。
  • Ruby 将编码显示为 utf-8 的事实意义不大。 Ruby 很容易导致编码错误,在这种情况下该值毫无意义,您需要自己修复它。
  • @lacostenycoder:我无法让它发挥作用。您可以像这样在 ruby​​ 中创建 myFile.txt: myFile = File.new('myFile.txt', "w") myFile.write "\uFEFF" myFile.write "Hello\n" myFile.write "我可能包含 UTF -8 个字符为 DøRBLAD\n" myFile.flush myFile.close

标签: ruby utf-8 byte-order-mark


【解决方案1】:

问题似乎是您有一个混合编码的文件,我们无法确定其来源。因此,确定如何“读取”这些数据并不像将其转换为任何内容那么容易。不过,你可以试试这个看看发生了什么。

File.read('myFile.txt').encode("Windows-1252", invalid: :replace, undef: :replace)
=> "?Hello\nI may contain UTF-8 characters as D\xF8RBLAD\n"

这可能不是一个完整的答案,但您可能想参考this article,其中包含有关如何解决您的问题的想法。

【讨论】:

    猜你喜欢
    • 2018-07-30
    • 2014-03-04
    • 1970-01-01
    • 2010-10-07
    • 2011-01-28
    • 2011-06-21
    相关资源
    最近更新 更多