• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Ruby RSSの文字置換について)

Ruby RSSの文字置換について

このQ&Aのポイント
  • RubyでRSSリーダーを作成する際に、エンコードの違いからエラーが発生することがあります。エラーメッセージを参考にして文字の置換方法を探しているのですが、Stringクラスではないためtrメソッドが使えません。どのようにすれば文字を置換できるのか教えていただけますか。
  • 質問者はRubyでRSSリーダーを作成中で、読み込んだRSSのエンコードとプログラムのエンコードが異なるためにエラーが発生しています。エラーメッセージを参考にして文字の置換方法を探しているそうです。ただし、RSSはStringクラスではないため、trメソッドが使えないとのことです。
  • RubyでRSSリーダーを作成中の質問者は、読み込んだRSSのエンコードとプログラムのエンコードの違いによるエラーに困っています。文字の置換方法を探しているそうですが、trメソッドはStringクラスではないため使えないとのことです。どのようにすれば文字を置換できるのか教えてほしいとのことです。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

>無事正常に出力されましたが、この書き方であってますでしょうか。 良いと思います。 エンコーディング変換の別の方法は、あらかじめ、 STDOUT.set_encoding("CP932") としておけば、あとは単に puts すれば自動的に変換してくれたりもします。 また、出力先が、ファイルやパイプで無くコマンドプロンプトのコンソール表示の場合は、 ユニコードのままで、よしなに表示してくれます。 >変換できなかった文字は「-」で、「?」で出力されました。 特定の文字だけおかしいなら、その文字を tr しておけばいいと思います。 それ以外の変換不能文字が今後出てて来るかもしれないので、 :replace=> は無指定もしくは"〓"(下駄記号)のように明らかに変換不能とわかる方がいいです。

jet888
質問者

お礼

再度回答ありがとうございます。 >STDOUT.set_encoding("CP932") このやり方だと何度もCP932を記述しなくて済むので便利ですね。 また、コンソール出力では改めてエンコーディングしなくても、 プログラムのエンコードで表示してくれるのですね。 実際に試してみたらきちんと表示されました。 >:replace=> は無指定もしくは"〓"(下駄記号)のように明らかに変換不能とわかる方がいいです。 :replaceは無指定に修正して、プログラムを書き換えることにします。 変換不能文字の表示方法に加えて、 複数のエンコーディング変換の方法も教えていただき、大変勉強になりました。 2回ともわかりやすく回答していただき、改めて感謝申し上げます。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.1

>rssはStringクラスではないため、trメソッドが使えません。 rssはStringクラスではありませんが、item.title. や item.description はStringです。 そもそもStringでないものは、encodeでコード変換できませんよ。 まずは、tr等せずに、:undef => :replace だけ指定して、どんな文字が変換できないのか調べることから始めるのがいいと思います。 その他のコメント。 (1) encodeで変換元エンコーディングを指定していますが、その前にforce_encodingでUTF-8にしているので不要です。逆に、毎回変換元エンコーディングを指定するなら、force_encodingは不要。 (2) 最初のRSS取得は、 xml = open("http://codezine.jp/rss/new/20/index.xml") { |http| http.read } と書くのが普通でしょう。

jet888
質問者

補足

回答ありがとうございます。 まず、変数xml、item.titleなどはStringオブジェクトだったのですね。 失礼しました。 ご指摘の箇所を修正して、プログラムを書きなおしました。 <プログラム> ------------------------------------------------------- # encoding: cp932 require 'open-uri' require 'rss' xml = open("http://codezine.jp/rss/new/20/index.xml") { |http| http.read } rss = RSS::Parser.parse(xml.force_encoding('utf-8')) puts "#{rss.channel.title.encode('cp932')}"\    + "#{rss.channel.pubDate.strftime("%Y/%m/%d %X")}" rss.items.each do |item|    puts '--------------------------'    puts item.title.encode('cp932')    puts item.pubDate.strftime("%Y/%m/%d %X")    puts item.description.encode('cp932', :undef => :replace, :replace => '-') end ------------------------------------------------------ 無事正常に出力されましたが、この書き方であってますでしょうか。 変換できなかった文字は「-」で、「?」で出力されました。 encodeメソッドで引数オプションに:undef => :replaceとして、 :replaceを指定しないとデフォルトで「?」と表示されるのですね。

すると、全ての回答が全文表示されます。

関連するQ&A