无法读取文件字符集 utf-16le,除非放入 ruby
Can't read file charset utf-16le except puts in ruby
我需要读取 ruby 中的外部文件。
运行 file -i
本地显示
text/plain; charset=utf-16le
我在 ruby CSV 格式中用分隔符 '\t' 打开它,一行显示为:
<CSV::Row "\xFF\xFEC\x00a\x00n\x00d\x00i\x00d\x00a\x00t\x00e\x00 \x00n\x00u\
...
row.to_s 产生 \x000\x000\x000\x001\x00\t\x00E\x00D\x00O
运行 puts row
正确显示数据:
0001 EDOARDO A
...
(这些值也在 vim 和 LibreOffice Calc 中清晰显示)
有什么关于如何在 ruby 中获取数据的建议吗?我尝试了用 external_encoding: 'utf-16le', internal_encoding: "utf-8"
等打开 CSV 的各种组合,但 puts
是唯一提供清晰值的东西
它还在ruby CSV 中表示ASCII-8BIT。
<#CSV io_type:StringIO encoding:ASCII-8BIT lineno:0 col_sep:"\t" row_sep:"\n" quote_char:"\"" headers:true>
文件本身是作为 XLS 文件生成的。我已经上传了一个编辑过的版本 here (edited i gvim)
这对我来说很好用:
require 'csv'
CSV.foreach("file.xls", encoding: "UTF-16LE:UTF-8", col_sep: "\t") do |row|
puts row.inspect
end
这将产生以下输出:
["Candidate number", "First name", "Last name", "Date of birth", "Preparation centre", "Result", "Score", "Reading and Writing", "Listening", "Speaking", "Result enquiry", "Raised on", "Raised by", "Enquiry status", "Withdrawn on", "Withdrawn by", nil]
["0001", "EDOARDO", "AGNEW", "20/01/2001", "Fondazione Istituto Massimo", "RY5-G8-Y2", "-", nil, nil, nil, "-", "00000000", nil, nil, "00000000", nil, nil]
如您所见,每一行都是文档中每一列的字符串数组。
问题是我正在读取回形针附件,在保存之前需要设置(覆盖)编码。
在模型中添加 s3_headers 有效:
has_attached_file :attachment, s3_headers: lambda { |attachment|
{
'content-Type' => 'text/csv; charset=utf-16le'
}
}
感谢 Julien 告诉我这个问题与回形针附件有关(该解决方案可以直接读取文件)
我需要读取 ruby 中的外部文件。
运行 file -i
本地显示
text/plain; charset=utf-16le
我在 ruby CSV 格式中用分隔符 '\t' 打开它,一行显示为:
<CSV::Row "\xFF\xFEC\x00a\x00n\x00d\x00i\x00d\x00a\x00t\x00e\x00 \x00n\x00u\
...
row.to_s 产生 \x000\x000\x000\x001\x00\t\x00E\x00D\x00O
运行 puts row
正确显示数据:
0001 EDOARDO A
...
(这些值也在 vim 和 LibreOffice Calc 中清晰显示)
有什么关于如何在 ruby 中获取数据的建议吗?我尝试了用 external_encoding: 'utf-16le', internal_encoding: "utf-8"
等打开 CSV 的各种组合,但 puts
是唯一提供清晰值的东西
它还在ruby CSV 中表示ASCII-8BIT。
<#CSV io_type:StringIO encoding:ASCII-8BIT lineno:0 col_sep:"\t" row_sep:"\n" quote_char:"\"" headers:true>
文件本身是作为 XLS 文件生成的。我已经上传了一个编辑过的版本 here (edited i gvim)
这对我来说很好用:
require 'csv'
CSV.foreach("file.xls", encoding: "UTF-16LE:UTF-8", col_sep: "\t") do |row|
puts row.inspect
end
这将产生以下输出:
["Candidate number", "First name", "Last name", "Date of birth", "Preparation centre", "Result", "Score", "Reading and Writing", "Listening", "Speaking", "Result enquiry", "Raised on", "Raised by", "Enquiry status", "Withdrawn on", "Withdrawn by", nil]
["0001", "EDOARDO", "AGNEW", "20/01/2001", "Fondazione Istituto Massimo", "RY5-G8-Y2", "-", nil, nil, nil, "-", "00000000", nil, nil, "00000000", nil, nil]
如您所见,每一行都是文档中每一列的字符串数组。
问题是我正在读取回形针附件,在保存之前需要设置(覆盖)编码。
在模型中添加 s3_headers 有效:
has_attached_file :attachment, s3_headers: lambda { |attachment|
{
'content-Type' => 'text/csv; charset=utf-16le'
}
}
感谢 Julien 告诉我这个问题与回形针附件有关(该解决方案可以直接读取文件)