3

重複の可能性:
ruby 1.9:UTF-8の無効なバイトシーケンス

現在、ファイルシステムクローラーを構築していますが、スクリプトの実行時に次のエラーが発生します。

wordcrawler.rb:8:in `block in <main>': invalid byte sequence in UTF-8 (ArgumentError)
    from /Users/Anconia/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/find.rb:41:in `block in find'
    from /Users/Anconia/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/find.rb:40:in `catch'
    from /Users/Anconia/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/find.rb:40:in `find'
    from wordcrawler.rb:5:in `<main>'

そしてここに私のコードがあります:

require 'find'

count = 0

Find.find('/Users/Anconia/') do |file|                   # '/' for root directory on OS X
  if file =~ /\b(\.txt|\.doc|\.docx)\b/                # check if filename ends in desired format
    contents = File.read(file)
      if contents =~ /regex/
      puts file
      count += 1
    end
  end
end

puts "#{count} files were found"

私の開発環境では、ruby1.9.3を使用しています。ただし、ruby 1.8.7に切り替えると、スクリプトは正しく実行されます。そして、できれば1.9.3を使い続けたいと思います。この投稿ですべての解決策を試しましたが(ruby 1.9:UTF-8の無効なバイトシーケンス)、問題は解決しません。助言がありますか?

4

1 に答える 1

6

前述の投稿の内容を正しく理解していませんでした。最低限、これはこの投稿の実装例として使用できます

require 'find'

count = 0

Find.find('/Users/Anconia/') do |file|                                              # '/' for root directory on OS X
  if file =~ /\b(\.txt|\.doc|\.docx)\b/                                           # check if filename ends in desired format
    contents = File.read(file).encode!('UTF-8', 'UTF-8', :invalid => :replace)    # resolves encoding errors - must use 1.9.3 else use iconv
      if contents =~ /regex/
        puts file
        count += 1
    end
  end
end

puts "#{count} files were found"
于 2012-12-26T02:47:34.610 に答える