我有一个ISO-8859-1编码的csv文件,我尝试打开并用ruby解析:
require 'csv'
filename = File.expand_path('~/myfile.csv')
file = File.open(filename, "r:ISO-8859-1")
CSV.parse(file.read, col_sep: "\t") do |row|
puts row
end
如果我从调用File.open中省略了编码,我会收到错误
ArgumentError:UTF-8中无效的字节序列
我的问题是对puts row
的调用显示的是奇怪的字符,而不是挪威字符æ,ø,å:
BOKFRINGSDATO
如果我在textmate中打开文件,我会得到相同的结果,强制它使用UTF-8编码。
通过将文件内容分配给字符串,我可以检查用于字符串的编码。正如所料,它显示了ISO-8859-1。
所以当我puts
每行时,为什么输出字符串为UTF-8?
它与csv-library有关吗?
我使用ruby 1.9.2。
答案 0 :(得分:4)
通过尝试文档中的不同内容找到自己的答案:
require 'csv'
filename = File.expand_path('~/myfile.csv')
File.open(filename, "r:ISO-8859-1") do |file|
CSV.parse(file.read.encode("UTF-8"), col_sep: "\t") do |row|
# ↳ returns a copy transcoded to UTF-8.
puts row
end
end
正如您所看到的,我所做的就是在CSV解析器获取之前将字符串编码为UTF-8字符串。
修改强>
在macruby-head上尝试这个解决方案,我从encode()获得以下错误消息:
编码:: InvalidByteSequenceError:UTF-8上的“\ xD8”
即使我在打开文件时指定编码,macruby也会使用UTF-8。 这似乎是一个已知的macruby限制:Encoding is always UTF-8
答案 1 :(得分:1)
也许你可以在解析之前使用Iconv将文件内容转换为UTF-8?
答案 2 :(得分:0)
ISO-8859-1和Win-1252在他们的角色集中非常接近。某个应用可以处理该文件并进行转换吗?或者是否可以从默认为Win-1252的机器收到,这是Window的标准设置?
如果0x80到0x9F字节范围内没有字符,则感知代码集的软件可能会出错编码,因此您可以尝试将file = File.open(filename, "r:ISO-8859-1")
设置为file = File.open(filename, "r:Windows-1252")
。 (我认为“Windows-1252”是正确的编码名称。)
我曾经写蜘蛛,HTML因错误标记或嵌入另一个字符集的二进制字符编码而臭名昭着。几年前,在大多数语言实现了UTF-8和Unicode之前,我对这些问题多次使用过一些不好的语言,所以我理解这种挫败感。