#はじめに
通常のファイルのopenと、open-uriを使ってURLをopenするときのオープンモードの違いを把握していなかったのでまとめます。
#通常のファイルでのopen
通常のopenは、ファイルをテキストモードで開きます。
open.rb
p open('hello.html').read.encoding #=> #<Encoding:UTF-8>
テキストモードで開くため、読み込んだ文字列の文字コードは「ASCII-8BIT」にはなりません。
ここで読み込むファイルの文字コードと、開くときのエンコーディングが異なっていると、readで文字列として表示したときに文字化けを起こします。
openするときのエンコーディングは、メソッドの第二引数に指定することができます。
open.rb
p open('hello.html', 'r:Shift_JIS').read.encoding #=> #<Encoding:Shift_JIS>
またバイナリモードでファイルを開きたいときには'rb'
オプションをつけます。(read binaryですね)
open.rb
p open('hello.html', 'rb').read.encoding #=> #<Encoding:ASCII-8BIT>
バイナリモードで開いているため、読み込んだ文字列の文字コードは「ASCII-8BIT」となっています。
#open-uriのopen
open-uriでのopenは、デフォルトでURLをバイナリモードで開きます。
openuri.rb
require 'open-uri'
p open('https://yahoo.jp').read.encoding #=> #<Encoding:ASCII-8BIT>
読み込んだ文字列の文字コードが「ASCII-8BIT」となっていることが確認できます。