#Prepare test file
File.open('file.txt', "w:utf-8"){|f|
f << "\xEF\xBB\xBF" #add BOM
f << 'some content'
}
#Read file and skip BOM if available
File.open('file.txt', "r:bom|utf-8"){|f|
pos =f.pos
p content = f.read #read and write file content
f.pos = pos #f.rewind goes to pos 0
p content = f.read #(re)read and write file content
}
6条答案
按热度按时间h7appiyu1#
在ruby〉= 1.9.2中,你可以使用
r:bom|utf-8
模式这应该可以工作(我还没有结合json测试它):
BOM表是否在文件中可用并不重要。
Andrew说,
File#rewind
不能与BOM一起使用。如果你需要一个rewind-function,你必须记住这个位置,并将
rewind
替换为pos=
:uyto3xhc2#
因此,解决方案是通过gsub在BOM上进行搜索和替换!我强制将字符串编码为UTF-8,并强制将正则表达式模式编码为UTF-8。
我能够通过查看http://self.d-struct.org/195/howto-remove-byte-order-mark-with-ruby-and-iconv和http://blog.grayproductions.net/articles/ruby_19s_string推导出解决方案
inn6fuwd3#
您还可以使用
File.read
和CSV.read
方法指定编码,但不指定read
模式。ru9i0ody4#
轰炸|如果你只读取文件一次,UTF-8”编码可以很好地工作,但是如果你调用File#rewind,就像我在代码中做的那样,就会失败。为了解决这个问题,我做了以下操作:
这似乎工作得很好。不确定是否有其他类似的类型字符需要注意,但它们可以很容易地内置到这个方法中,可以在您倒带或打开的任何时候调用。
8iwquhpp5#
服务器端清理utf-8 bom字节,对我有用:
63lcw9qa6#
我刚刚为smarter_csv gem实现了这个,并希望在有人遇到这个问题时分享这个。
问题是要删除与字符串编码无关的字节序列。解决方案是使用
String
类中的方法bytes
和byteslice
。参见:https://ruby-doc.org/core-3.1.1/String.html#method-i-bytes