Code Log

プログラミングの勉強メモを残していきます。

Ruby | 日本語の文字列を読み込もうとしてエンコーディングエラー`include?': incompatible character encodings: Windows-31J and UTF-8 (Encoding::CompatibilityError)


<スポンサーリンク>

Rubyで日本語のファイルを読み込もうとしたら、こんなエラーが発生した。

`include?': incompatible character encodings: Windows-31J and UTF-8 (Encoding::CompatibilityError)

コードはこんな感じだった。

# encoding: utf-8

File.open'C:\tmp\test.txt' do |f|
  while line  = f.gets

  	if line.include?("洪庵")
      puts line
	end
  end
end

どうやらエンコーディングがおかしいようなので、一旦エンコードを調べてみる。

line.encodingとやることで、encodingを調べることができる。

# encoding: utf-8

File.open'C:\tmp\test.txt' do |f|
  while line  = f.gets
  	puts line.encoding
  	#if line.include?("洪庵")
    #  puts line
	#end
  end
end

こうすると、結果は「Windows-31J」と表示された。
どうやら、読み込むファイルの文字コードがWindows-31Jとされているようだ。

解決するためには、以下のように、File.open時に、ファイル内の文字列が何のエンコーディングが指定する。

# encoding: utf-8

File.open('C:\tmp\test.txt', 'r:utf-8') do |f|
  while line  = f.gets
  	puts line.encoding
  	#if line.include?("洪庵")
    #  puts line
	#end
  end
end

すると、ここで表示されるのは「UTF-8」となる。

では、再びコードを実行してみる。

# encoding: utf-8

File.open('C:\tmp\test.txt', 'r:utf-8') do |f|
  while line  = f.gets
  	#puts line.encoding
  	if line.include?("洪庵")
      puts line
	end
  end
end

こうすると、ちゃんと文字列を判断して、include?メソッドが使えるようになった。

結果は、「洪庵」という文字列が入った行だけ表示することができる。

 緒方洪庵のことである。
 といって、洪庵は変人ではなかった。どの村やどの町内にもいそうな、ごく普通のおだやかな人がらの人だった。
 そのころ、洪庵のような医者は、蘭方医とよばれていた。
[Finished in 0.1s]


参考)
http://www.slideshare.net/tmtm/ruby-nseg30