我知道File
应该使用encoding: 'bom|utf-8'
,但是流没有等效项。我的服务器正在获取一个zip文件,其中包含一个带bom的csv。将csv保存为文件与仅使用CSV.new(Zip::InputStream::open(zip_file).get_next_entry.get_input_stream)
相比似乎很愚蠢,但是没有一个人可以检测并剥离字节顺序标记(bom),并且CSV
尝试在bom解析标题时失败在那儿。
我看到CSV.new
将encoding
作为选项,但是至少在2.3.0中,它无法识别bom
(ArgumentError: unknown encoding name - bom
)
答案 0 :(得分:1)
好像在IO
中实现了BOM的处理-也许您可以将zip流包裹在IO
对象周围?
https://ruby-doc.org/core-2.3.1/IO.html#method-c-new-label-Open+Mode
答案 1 :(得分:0)
由于可以倒带流,答案是获取第一个字符,看看它们是否是bom,如果是,则消耗它们;否则,倒带该流。
BYTE_ORDER_MARKS_LENGTHS =
{"\xEF".bytes.first => 2, "\xFE".bytes.first => 1, "\xFF".bytes.first => 1}
# checks if input_stream starts with a byte order mark and if so skips over it
def skip_bom(input_stream)
entry = BYTE_ORDER_MARKS_LENGTHS[input_stream.read(1).bytes.first]
if entry
input_stream.read(entry)
else
input_stream.rewind
end
end
答案 2 :(得分:0)
我的情况与此类似,但我还需要删除多余的双引号:
authorize()