QA@IT
«質問へ戻る

質問を投稿

NokogiriでNodeSetに日本語を代入すると文字化けしてしまいます。

以下のようなコードがあるとします。

# -*- coding: utf-8 -*-
require 'nokogiri'
html = <<EOF
<p>
  hello
</p>
<p>
  ストーリー
</p>
EOF
doc = Nokogiri::HTML(html, nil, 'utf-8')

これは正確に日本語を出力してくれます。

しかし中のNodeSetを置き換えようとすると文字化けが起きてしまいます。

doc.css('p').each do |d|
  p d.inner_html
  d.inner_html = 'new'
  p d.inner_html
  d.inner_html = 'ニュー'
  p d.inner_html
end
puts doc

こんな感じです。

[Documents]$ ruby unicode_mojibake.rb 
"\n  hello\n"
"new"
"ã\u0083\u008Bã\u0083¥ã\u0083¼"
"\n  ストーリー\n"
"new"
"ã\u0083\u008Bã\u0083¥ã\u0083¼"
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>ãã¥ã¼</p>
<p>ãã¥ã¼</p>
</body></html>
以下のようなコードがあるとします。

~~~ruby
# -*- coding: utf-8 -*-
require 'nokogiri'
html = <<EOF
<p>
  hello
</p>
<p>
  ストーリー
</p>
EOF
doc = Nokogiri::HTML(html, nil, 'utf-8')

~~~

これは正確に日本語を出力してくれます。

しかし中のNodeSetを置き換えようとすると文字化けが起きてしまいます。

~~~ruby
doc.css('p').each do |d|
  p d.inner_html
  d.inner_html = 'new'
  p d.inner_html
  d.inner_html = 'ニュー'
  p d.inner_html
end
puts doc
~~~

こんな感じです。

~~~
[Documents]$ ruby unicode_mojibake.rb 
"\n  hello\n"
"new"
"ã\u0083\u008Bã\u0083¥ã\u0083¼"
"\n  ストーリー\n"
"new"
"ã\u0083\u008Bã\u0083¥ã\u0083¼"
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>ニュー</p>
<p>ニュー</p>
</body></html>
~~~