強欲にHTTPレスポンスをUTF-8にエンコーディングするDiggin_Http_Response_Charsetについて

githubもしくはopenpearでのコミットログを見ていると気づいてるかと思われますが、
最近は、Diggin_Http_Response_Charsetというのを作成しました。
http://openpear.org/package/Diggin_Http_Response_Charset
http://github.com/sasezaki/Diggin_Http_Response_Charset


利用方法のわかりやすい例として、Zend_Http_Responseのラッパーを用意しました。

もともと、Htmlscrapingのエンコーディング部分だけを切り離して、Diggin_Http_Response_Encodingというクラスに置き換えてたのですが、
Http_Response_Encodingという名前は、「"content-encoding"などを無視していると弾言できる(Enjoy!)」*1と思い、ちょびっと手直ししたもの*2を作成しているところでした。
ですが、CharactorEncodingというのがタイポなのと、以下のisssueトラッカーにお寄せいただいたバグのために書き換えが必要だったという次第です。
http://code.google.com/p/diggin/issues/detail?id=1


バグの内容は、レスポンスのconten-typeが'Shift-JIS'だったために、
'SJIS-win'な○付き1とかが化けるという事象です。


細かくどう変更したかは、
Htmlscrapingクラス、Diggin_Http_Response_Encoding、
Diggin_Http_Response_Charset_Detector_Htmlをそれぞれ見比べてもらうとして、

・ mb_list_encodings()の中で、mb_preferred_mime_name()を通すと変更されるものは、
デフォルトでレスポンスボディ(HTML)をmb_detect_encoding()強制するようにした。
(SJIS-winなど)
・ デフォルトのdetectエンコーディングリストを
'ASCII, JIS, UTF-8, eucJP-win, EUC-JP, SJIS-win, SJIS'にした(かなり適当です)

という所です。


デフォルトのエンコード方法としては、上述のDetectorの結果をDiggin_Http_Response_Charset_Encoder_Htmlが用いてエンコードします。
使いかたの例としては、以下のような形で、レスポンスボディ(HTML)とレスポンスヘッダーのcontent-typeを渡します(conten-typeがない場合はnull)。
http://github.com/sasezaki/Diggin_Http_Response_Charset/blob/master/sandbox.php
デフォルトではDiggin_Http_Response_Charset_Encoder_Htmlである程度動作すると思われますが、特定のサイトにurlの正規表現などで、エンコード方法を細かく指定したい場合もあります。

そのために、Diggin_Http_Response_Charset_Front_UrlRegexというのを用意しました。
これは、addEncoderメソッドに対象のURL正規表現とDiggin_Http_Response_Charset_Encoder_EncoderAbstractを拡張したエンコーダーを設定し細かいエンコード設定ができます。使い方の例としては、
http://github.com/unpush/p2-php/blob/master/cookie.php
のように、ブラウザでも化けるようなHTMLの特定の一部についても、
http://github.com/sasezaki/Diggin_Http_Response_Charset/blob/master/sandbox_github.php
のような感じで、_initBody()という事前フィルタ処理を行うことで、HTMLすべてUTF-8変換というところまで試みてます。


なお、まだリリースしてないDiggin 0.7ではこのDiggin_Http_Response_Charsetを使います。すでに変更対応分のコミットはしてます。
http://openpear.org/repository/Diggin_Scraper_Adapter_Htmlscraping/trunk/library/Diggin/Scraper/Adapter/Htmlscraping.php
0.7では投入しようとした、robots.txtなどのハンドラー"Diggin_RobotRules"を一旦ギブアップしてもう近々リリースするつもりです。