Ruby`split':UTF-8中的无效字节序列(ArgumentError)

时间:2012-06-16 18:22:23

标签: ruby character-encoding argument-error

我正在尝试填充电影对象,但在解析u.item文件时出现此错误:

  

`split':UTF-8中无效的字节序列(ArgumentError)

File.open("Data/u.item", "r") do |infile|
            while line = infile.gets
                line = line.split("|")
            end
end

只有在尝试使用精美的国际标点符号拆分行时才会出现错误。

这是一个示例

  

543 |Misérables,Les(1995)| 01-Jan-1995 || http://us.imdb.com/M/title-exact?Mis%E9rables%2C%20Les%20%281995%29 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0

有解决方法吗?

2 个答案:

答案 0 :(得分:20)

我必须强制每行的编码为iso-8859-1 (这是欧洲字符集)...... http://en.wikipedia.org/wiki/ISO/IEC_8859-1

a=[]
IO.foreach("u.item") {|x| a << x}
m=[]
a.each_with_index {|line,i| x=line.force_encoding("iso-8859-1").split("|"); m[i]=x}

答案 1 :(得分:12)

Ruby对字符编码问题有点敏感。你可以做很多事情来解决你的问题。例如:

  1. 在源文件的顶部放置编码注释。

    # encoding: utf-8
    
  2. 在拆分之前对您的行进行明确编码。

    line = line.encode('UTF-8').split("|")
    
  3. 替换无效字符,而不是引发Encoding :: InvalidByteSequenceError异常。

    line.encode('UTF-8', :invalid => :replace).split("|")
    
  4. 提供这些建议,如果这些建议都不适合您,请更新您的问题。希望它有所帮助!