概要:オープンURIを介してUTF-8をNokogiriにフィードする場合open(...).read
は、結果の文字列を使用してNokogiriに渡します。
分析:
curlを使用してページをフェッチすると、ヘッダーが正しく表示Content-Type: text/html; charset=UTF-8
され、ファイルの内容に有効なUTF-8が含まれます"Genealogía de Jesucristo"
。しかし、Rubyファイルに魔法のコメントを付けてdocエンコーディングを設定しても、それは良くありません。
# encoding: UTF-8
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(open('http://www.biblegateway.com/passage/?search=Mateo1-2&version=NVI'))
doc.encoding = 'utf-8'
h52 = doc.css('h5')[1]
puts h52.text, h52.text.encoding
#=> Genealogà a de Jesucristo
#=> UTF-8
これはopen-uriのせいではないことがわかります。
html = open('http://www.biblegateway.com/passage/?search=Mateo1-2&version=NVI')
gene = html.read[/Gene\S+/]
puts gene, gene.encoding
#=> Genealogía
#=> UTF-8
これは、open-uriを扱う際ののこぎりの問題のようです。これは、HTMLを生の文字列としてNokogiriに渡すことで回避できます。
# encoding: UTF-8
require 'nokogiri'
require 'open-uri'
html = open('http://www.biblegateway.com/passage/?search=Mateo1-2&version=NVI')
doc = Nokogiri::HTML(html.read)
doc.encoding = 'utf-8'
h52 = doc.css('h5')[1].text
puts h52, h52.encoding, h52 == "Genealogía de Jesucristo"
#=> Genealogía de Jesucristo
#=> UTF-8
#=> true