【问题标题】:Ruby `split': invalid byte sequence in UTF-8 (ArgumentError)Ruby `split':UTF-8 中的无效字节序列(ArgumentError)
【发布时间】:2012-06-19 10:13:34
【问题描述】:

我正在尝试填充电影对象,但在解析 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

有解决办法吗??

【问题讨论】:

  • od -c 对有问题的行有什么看法?
  • 它适用于我发布的语料库。 @IgnacioVazquez-Abrams 可能是对的:您需要使用十六进制编辑器来查看数据文件中是否有隐藏字符。

标签: ruby character-encoding argument-error


【解决方案1】:

我不得不将每一行的编码强制为 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}

【讨论】:

  • 您可以指定 Ruby 在使用 open 时应该使用什么编码,例如File.open 'data.txt', 'r:iso-8859-1' do ...。见the docs
【解决方案2】:

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

  1. 在源文件顶部添加编码注释。

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

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

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

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

【讨论】:

  • 他得到的错误暗示编码已经是UTF-8。
  • 所以,我在程序尝试拆分之前检查了每一行。事实证明,错误出现在带有花哨的标点符号的行中 这是发生错误的记录: 543|Misérables, Les (1995)|01-Jan-1995||us.imdb.com/M/… 我也尝试了第三个选项,没有t 工作...有什么想法吗?或其他方式...
  • 这似乎解决了你的边缘情况:stackoverflow.com/a/10466273/1301972
  • 从这个问题中找到了一个可行的解决方案:stackoverflow.com/questions/7047944/…
猜你喜欢
  • 2012-12-11
  • 2023-04-03
  • 2015-07-04
  • 2016-07-05
  • 2013-08-20
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 2017-03-31
相关资源
最近更新 更多