Nokogiri::HTML#to_htmlのエンコーディング処理で失敗する


こちらのページを解析したく  
<http://www.monex.co.jp/DealInfo/00000000/sinyo/meig/kiseiichiran/hyji?mop=>

[code]

    url = 'http://www.monex.co.jp/DealInfo/00000000/sinyo/meig/kiseiichiran/hyji?mop='
    doc = Nokogiri::HTML(open(url, 'r:CP932'))
    doc.to_html(encoding: 'cp932')
    
[/code]

とすると以下のエラーになってしまいます。

[code]

    encoding error : output conversion failed due to conv error, bytes 0x97 0x70 0xC2 0x83
    
[/code]

encodingを`shift_jis`にしても結果は同じですし、`to_html`に引数をつけないと`unknown encoding name -
x-sjis`のエラーになってしまいました。

どうエンコーディング処理の指定をするのが正しいのでしょうか？




`Nokogiri::HTML`は第一引数が`#encoding`に反応すればそれを利用し、反応しない場合ソースのmetaヘッダ等から類推しようとします。

[code]

    source = open(url).read
    source.encoding #=> #<Encoding:Shift_JIS>
    Nokogiri::HTML(source).encoding #=> 'Shift_JIS'
    # したがって
    Nokogiri::HTML(open(url).read).encoding #=> 'Shift_JIS'
    
    #一方で
    f = open(url)
    f.encoding #=> NoMethodError
    Nokogiri::HTML(open(url)).encoding #=> 'x-sjis'  (metaヘッダに由来)
    
[/code]

今回のようにmetaヘッダからの推測では不都合がある場合など、文字エンコーディングを明示的に指定する場合は第三引数で設定します。

[code]

    Nokogiri::HTML(open(url), nil, 'Shift_JIS').encoding # => 'Shift_JIS'
    
[/code]

問題はパーサに不適切なエンコーディングが指定されてしまっていることです。`#to_html`に渡すエンコーディングは出力時のものなので、ここに何を指定するかは問題とは無関係です。




`Nokogiri::HTML`は第一引数が`#encoding`に反応すればそれを利用し、反応しない場合ソースのmetaヘッダ等から類推しようとします。

[code]

    source = open(url).read
    source.encoding #=> #<Encoding:Shift_JIS>
    Nokogiri::HTML(source).encoding #=> 'Shift_JIS'
    # したがって
    Nokogiri::HTML(open(url).read).encoding #=> 'Shift_JIS'
    
    #一方で
    f = open(url)
    f.encoding #=> NoMethodError
    Nokogiri::HTML(open(url)).encoding #=> 'x-sjis'  (metaヘッダに由来)
    
[/code]

今回のようにmetaヘッダからの推測では不都合がある場合など、文字エンコーディングを明示的に指定する場合は第三引数で設定します。

[code]

    Nokogiri::HTML(open(url), nil, 'Shift_JIS').encoding # => 'Shift_JIS'
    
[/code]

問題はパーサに不適切なエンコーディングが指定されてしまっていることです。`#to_html`に渡すエンコーディングは出力時のものなので、ここに何を指定するかは問題とは無関係です。

