しばらく放っておいたアクセスログ表示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