本を読む

読書やコンピュータなどに関するメモ

Temtter + expand-tinyurl + Ruby 1.9で文字コード異種結合のエラーになるとき

 RubyとかGithubとかgitとか、よくわかってないので、ブログでメモ。

 TermtterをRuby 1.9で動かしているときに、たまに文字コード異種結合のエラーをくらっちゃう。

in `gsub!': incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)

 これは、違うエンコードの文字列をつなげたりしようとしたときのエラーみたい。条件を追ってみると、expand-tinyurlプラグインを組み込んでいて、tinyurlから展開したURLに8bit文字が入っている場合に再現する。たとえば、「http://tinyurl.com/de5my6」から展開したURLとか。

 ソースを追ってみると、こんな感じみたい。

  • termtter(の呼ぶrubytter(の呼ぶjsonライブラリ))は、Twitterから受け取ったJSONテキストをUTF-8文字列とする
  • expand-tinyurlは、文字コード処理を特にしていないので、8bit文字があるとASCII-8BIT文字列とする

 とりあえず自分用には、

res['Location']

って返しているところを、

res['Location'].force_encoding(Encoding::UTF_8)

ってしてみたんだけど、Ruby 1.8との互換性はどうしよう。とりあえずこんなふうにしておけば逃げられるけど、こんなのプラグインの中に書いていいのかな。

unless String.public_method_defined?(:force_encoding)
  class String
    def force_encoding(enc)
      self
    end
  end
end

 いちおう、Githubにも

追記2009-05-12

 Ruby 1.8で動かしてみたら、Encoding::UTF_8が定義されてないよ、って言われちゃった。そりゃそうだ。修正

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/604-be3c56fb

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad