22

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

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

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

该错误仅在尝试使用花哨的国际标点符号分割行时发生。

这是一个示例

543|悲惨世界 (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

有解决办法吗??

4

2 回答 2

21

我不得不将每一行的编码强制为 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}
于 2012-06-17T14:07:48.617 回答
13

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

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

    # encoding: utf-8
    
  2. 在拆分之前显式编码您的行。

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

    line.encode('UTF-8', :invalid => :replace).split("|")
    

试一试这些建议,如果它们都不适合您,请更新您的问题。希望能帮助到你!

于 2012-06-16T18:42:12.937 回答