显示iso-8859-1编码数据给出了奇怪的字符

时间:2010-12-10 22:34:12

标签: ruby encoding csv

我有一个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。

3 个答案:

答案 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之前,我对这些问题多次使用过一些不好的语言,所以我理解这种挫败感。

ISO/IEC_8859-1Windows-1252