質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

3808閲覧

nokogiriと文字

Naggy

総合スコア32

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/02/04 20:04

###質問内容
nokogiriを仕様してスクレイピングをしています。
プライベートなサイトを対象にしているので、サイトの構造を詳しくは書けませんが、
Shift-JISのサイトで、定期的に文章を取得するプログラムを作っています。

ある時、普段と同じような文章なのに、その文章だけ「㎏」という文字が出現した以降の文章が全て空になっていることがありました。
今まで㎏という文字が使われていた文章をparseしたことがなかったのですが、なぜかその文章だけがその文字までしか読み込めなかったのです。

これは何が原因なのでしょうか。
nokogiriと相性がわるい文字が存在するなんてことがあり得るのでしょうか。
もしそうだとすればどのような対策をとるべきでしょうか。。
文字の扱いに疎いので、上記の質問、または参考になるサイトの紹介をしていただけたら幸いです。

###該当のソースコード
ソースコードは平凡なものなのであまり意味がないかもしれませんが念のため。

require 'open-uri' require 'nokogiri' charset = "Shift_JIS" html = open(url, 'User-Agent' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36i') do |f| f.read # htmlを読み込んで変数htmlに渡す end sleep(1) doc = Nokogiri::HTML.parse(html, nil, charset) doc.xpath('//div[@class="report"]').each do |node| str = node.inner_text end

###使用している環境

ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

「㎏」(U+338F)はいわゆる機種依存文字であり、本来のShift_JISには含まれていないため、パース前の文字コード変換で失敗していると思われます。charset"Windows-31J"にして試して見てください。


【解説】

世間で「シフトJIS」と言われるものは実際は一つでは無く、多くの亜種が存在します。主に使われる、または、使われていた物は下記です。

  • Shfit_JIS … IANAに登録されている標準規格のシフトJIS

以下は基本的にこれの拡張。
㎏: 割り当てなし

  • Windows-31J … Windows日本語環境でのシフトJIS

別名CP932、MS932等(Rubyでは別名として"SJIS"も使用できる)。記号等が拡張として追加されている。一般的にシフトJISと言った場合、実際はWindows-31Jの場合がほとんどである。
㎏: 87 73

  • MacJapanese … Mac OS 9.xで使われていたシフトJIS

Mac OS X(macOS 10)からは標準でUTF-8を使用するようになったため、現在は使用されることはほとんど無い。Windows-31Jと同じように記号等を拡張として追加しているが、追加した部分のコードに互換性は無い。そのため、これらの部分を機種依存文字と呼ぶようになった。
Rubyでも認識できるが、他のエンコードとの相互変換はできない。
㎏: 86 4C ※ 他とは異なる

  • SJIS-DoCoMo、SJIS-KDDI、SJIS-SoftBank … 各携帯キャリアが拡張したシフトJIS

Windows-31Jからの拡張で絵文字が追加されている。昔の携帯キャリアメールはWindows-31Jでやり取りしており、絵文字が送れるようにするため拡張した。追加された絵文字にキャリア間の互換性は無いが、キャリア間でメールをやり取りする場合は、相互に変換するように協定が結ばれている。Unicodeでの絵文字追加により、iPhone等のスマホを使っている場合はUTF-8が使われるようになっているため、今後徐々に廃れると思われる。
㎏: 87 73

  • Shfit_JIS-2004 … JIS X 0213に策定に伴い、JIS X 0213に基づくシフトJIS

Shift_JISX0213とも言われる(実際はShift_JISX0213は10文字だけ少ないが、同一視される)。もともとのShift_JISはJIS X 0208を基にしており、JIS X 0213はJIS X 0208の拡張であるため、使用できる文字が増えている。増えた文字の一部はWindows-31Jにも取り入れられているが、もともとWindows-31Jで拡張していた部分(特に機種依存文字の部分)は互換性のためそのままであり、一部互換性が無い所がある。Mac OS X(macOS 10)以降はこちらにも対応している(テキストエディットやSafari等)が、ほとんど使用されていない。Rubyは対応していない。
㎏: 87 73

**自称Shift_JISと言っているサイトのほとんどはWindows-31Jです。**機種依存文字が使われている場合、Shfit_JISとして読み込みすると、処理に失敗したり、文字化けを起こしたりします。ブラウザで見ても、該当のサイトはMac等のWindows以外で見ると文字化けしている可能性が高いです。プライベートなサイトとのことですが、サイト管理者に文字化けしていることを教えて上げるといいと思います。

投稿2017/02/04 23:34

raccy

総合スコア21737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Naggy

2017/02/05 07:39

Windows-31Jにしたらうまくいきました! ありがとうございます! エンコードは本当に奥が深くてよく詰まるので、こういう丁寧な解説は助かります!
guest

0

参考情報

㎏ のことも述べられています。

投稿2017/02/05 00:35

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「㎏」という文字はShift_JISには存在しないので、CP932かWindows-31Jを指定してみて下さい。

投稿2017/02/04 23:10

otn

総合スコア85778

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問