我正在使用最近添加了Unicode BOM头(U + FEFF)的数据源,而我的rake任务现在被它搞砸了.
我可以跳过前3个字节,file.gets[3..-1]
但有没有更优雅的方式来读取Ruby中的文件,无论BOM是否存在,都能正确处理?
使用ruby 1.9.2,您可以使用该模式 r:bom|utf-8
text_without_bom = nil #define the variable outside the block to keep the data File.open('file.txt', "r:bom|utf-8"){|file| text_without_bom = file.read }
要么
text_without_bom = File.read('file.txt', encoding: 'bom|utf-8')
要么
text_without_bom = File.read('file.txt', mode: 'r:bom|utf-8')
如果BOM在文件中可用,则无关紧要.
您也可以将编码选项与其他命令一起使用:
text_without_bom = File.readlines(@filename, "r:utf-8")
(你得到一个包含所有行的数组).
或者使用CSV:
require 'csv' CSV.open(@filename, 'r:bom|utf-8'){|csv| csv.each{ |row| p row } }
我不会盲目地跳过前三个字节; 如果生产者再次停止添加BOM怎么办?你应该做的是检查前几个字节,如果它们是0xEF 0xBB 0xBF,则忽略它们.这是BOM字符(U + FEFF)采用UTF-8形式的形式; 在尝试解码流之前,我更愿意处理它,因为从一种语言/工具/框架到下一种语言/工具/框架,BOM处理是如此不一致.
事实上,这就是你应该如何处理BOM.如果文件已作为UTF-16提供,则必须在开始解码之前检查前两个字节,以便知道是将其读取为big-endian还是little-endian.当然,UTF-8 BOM与字节顺序无关,它只是让你知道编码是UTF-8,以防你还不知道.