当前位置:  开发笔记 > 后端 > 正文

如何避免在读取文件时跳过UTF-8 BOM

如何解决《如何避免在读取文件时跳过UTF-8BOM》经验,为你挑选了2个好方法。

我正在使用最近添加了Unicode BOM头(U + FEFF)的数据源,而我的rake任务现在被它搞砸了.

我可以跳过前3个字节,file.gets[3..-1]但有没有更优雅的方式来读取Ruby中的文件,无论BOM是否存在,都能正确处理?



1> knut..:

使用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 }
}


我认为这是可能的.使用`CVS.read(filename,:encoding =>'utf-8')`你可以用CSV设置编码(或者它是`CSV.load`?).我认为这对于bom-logic也是可能的:`:encoding =>'bom | utf-8')`.我自己无法测试它 - 抱歉.
有没有办法使用ruby内置的CSV库对CSV文件执行此操作?我尝试将`:encoding =>“ r:bom | utf-8”`传递给CSV的foreach,但它仍然读取BOM,好像它是标题的第一列一样。
您也可以使用File#open的block.version:`File.open(@ filename,'r:bom | utf-8'){| file | csv = CSV.new(file,faster_csv_options)csv.each {| row | p row}}`甚至更短,我测试成功:`CSV.open(@ filename,'r:bom | utf-8',faster_csv_options){| csv | csv.each {| row | p row}}`和`CSV.read(@ filename,'r:bom | utf-8').each {| row | p row}`

2> Alan Moore..:

我不会盲目地跳过前三个字节; 如果生产者再次停止添加BOM怎么办?你应该做的是检查前几个字节,如果它们是0xEF 0xBB 0xBF,则忽略它们.这是BOM字符(U + FEFF)采用UTF-8形式的形式; 在尝试解码流之前,我更愿意处理它,因为从一种语言/工具/框架到下一种语言/工具/框架,BOM处理是如此不一致.

事实上,这就是你应该如何处理BOM.如果文件已作为UTF-16提供,则必须在开始解码之前检查前两个字节,以便知道是将其读取为big-endian还是little-endian.当然,UTF-8 BOM与字节顺序无关,它只是让你知道编码是UTF-8,以防你还不知道.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有