RubyのIO#readが反応を返しません。


require 'open-uri'
file = open("http://www.yahoo.co.jp/")
puts file.read # ここで固まる
# ここへ制御が移らないように見える。puts file.readをコメントすると制御が移る

上記を、ソースAの中に追加したところreadの部分で固まってしまいます。
原因を究明するため、上記のsnippetをソースAの中ではなく独立したスクリプトに記述したところ問題なくreadは成功します。
ソースAの中の他の部分が悪影響を起こしていると考えているのですが、原因を探る方法について知恵を貸して頂けないでしょうか。

回答の条件
  • 1人3回まで
  • 13歳以上
  • 登録:2013/10/02 13:21:03
  • 終了:2013/10/09 13:25:04
id:heboprog

別Threadで実行していたので(?)、どうも例外が見えていなかったようです。
begin rescueで囲んでみたところ、readのところで
<Encoding::UndefinedConversionError: U+798F from UTF-8 to ASCII-8BIT>
が発生していました。
情報不足申し訳ありません。

更に追記:
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]にて、
例外処理対応を追加することと、Encoding.default_internal = 'utf-8'を設定することで解決しました。
雲をつかむような質問に対して、いろいろとありがとうございました。

回答(0件)

回答はまだありません

  • id:taknt
    require "net/http"
    require "uri"
    url = URI.parse("http://www.ruby-lang.org/ja/")
    http = Net::HTTP.start(url.host, url.port)
    doc = http.get(url.path)
    puts doc

    こんな感じでやらないとダメなんじゃないかな?

    http://www.notwork.org/tanoshiiruby4/list/
  • id:iwadon
    私の環境ではうまく動きました。

    >||
    irb(main):001:0> require "open-uri"
    => true
    irb(main):002:0> file = open("http://www.yahoo.co.jp/")
    => #<Tempfile:/var/folders/vb/qg4hhl_14d99j5s0kczx8r340000gn/T/open-uri20131002-9990-1yuf4cv>
    irb(main):003:0> file.read
    => "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<meta http-equiv=\"content-type\" content=\
    (長いので以下略)
    ||<

    OSはMac OS X 10.8.5で、Rubyは以下のバージョンです。
    ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin11.4.2]

    お使いのOSやRubyはわかりますか?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません