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]