Apacheアクセスログと私(Ruby1.8になったせい?の変更)

しばらく放っておいたアクセスログ表示Rubyスクリプトですが,ちょっと前に見てみたら,エラーが出るようになっていました.さくらインターネットがRubyを入れ替えてくれてたから,その影響かなあ.

というわけで,悪戦苦闘した結果,どうもリファラーをエンコードしている部分でエラーが出ていることを突き止めたので,前に作った def referer_unencodeにちょっと書き加えました.

def referer_unencode #リファラーを返す(アンエンコード済)
  begin #ここからエラー処理付け加え
    ref = CGI.unescape(@referer)
    case NKF.guess(ref)
      when 0
        chr_in = "-J"
      when 1
        chr_in = "-S"
      when 2
        chr_in = "-E"
      when 3
        begin
          return Uconv.u8toeuc(ref) + NKF.guess(ref).to_s
          rescue
            return NKF.nkf("-e", ref)
        end
    end
    return NKF.nkf("-e" + chr_in, ref)
  rescue Exception #うまくコンバートできない場合は.
    return @referer #そのまま返す
  end

end

太字が,付け加えたところ.なんのこたあない,よく分かんないけど例外処理!の力業ですな.

ああ,このアクセスログ表示も1年経つ前に完成させたかった.

そうです,新しい契約をしてから8/19で1年経ちました.正式引っ越しは9/1でしたが.は!なんかやんないとダメ? まあ,いいや.なんも思いつかないから.

2005.8.26追記

で,すぐ気づいたんですが,こうすると,ほとんどエンコードされません.う~ん.

2005.8.27追記

調べた結果,やっと分かりました.Rubyが1.8.2になったときに,nkfがVer.2相当に対応したため,挙動が変っていたんですね.

しかも,このバージョンのnkfはUTF-8に対応してるんですよ.なんてナイスなんだ!これで,文字コード判別→Uconv渡しをしなくて済みますよ.

よって,2004年10月15日に書いたnkfだけ使うコードに戻しました.怖かったので,例外処理は一応残しておきます.

  def referer_unencode #リファラーを返す(アンエンコード済)
    begin #ここからエラー処理付け加え
      ref = CGI.unescape(@referer)
      NKF.nkf("-e", ref)
    rescue Exception #うまくコンバートできない場合は.
      return @referer #そのまま返す
    end
  end

日時: 2005年8月26日 | PC/Web > Ruby |

コメントを投稿

(空欄でもかまいません)

(メールアドレスは管理人に通知されますが,Web上には表示されません)

Powered by Movable Type