web-dev-qa-db-ja.com

Ruby `split ':UTF-8の無効なバイトシーケンス(ArgumentError)

ムービーオブジェクトにデータを入力しようとしていますが、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

回避策はありますか?

21
kashive

各行のエンコードを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}
21
kashive

Rubyは文字エンコードの問題にやや敏感です。あなたはあなたの問題を解決するかもしれない多くのことをすることができます。例えば:

  1. ソースファイルの先頭にエンコーディングコメントを配置します。

    # encoding: utf-8
    
  2. 分割する前に、行を明示的にエンコードします。

    line = line.encode('UTF-8').split("|")
    
  3. Encoding :: InvalidByteSequenceError例外を発生させる代わりに、無効な文字を置き換えます。

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

これらの提案を試してみて、どれもうまくいかない場合は質問を更新してください。それが役に立てば幸い!

13
Todd A. Jacobs