« Gungho をインライン化してみた | メイン | 負荷に応じてキャッシュを自動調節する Perl モジュール »

2007年04月23日

Re: PoCo::Client::HTTP が勝手に文字コードを変えてしまう件

 PoCo::Client::HTTPでGETしまくってたら、一部のサーバーのどの日本語ページも$res->content_typeの文字コードと実際の文字コードが合わなくておかしいと思ってたんだけど、こういうことだな?多分0.80以降のXangoベースのアプリも壊れる予感。

 うぅ、こいつは小さな親切、大きなお世話の類いだな・・・GunghoではしょうがないのでPOEエンジン内で、またエンコードしなおすという荒技を使う事にしてみる。

PoCo::Client::HTTP decodes content (w/o Permission) - D-5 出張版

 この件ですが、charset が宣言されていない場合にも ISO-8859-1 として decode してくれてしまうようです。その場合もエンコードしなおすとして、任意のバイト列について $bytes eq encode('iso-8859-1', decode('iso-8859-1', $bytes)) が成立するか自信がなかったので、逆変換ではなく変換自体を抑止するようなパッチを書いてみました

package HTTP::Response;

sub decoded_content {
    my ($self, %opt) = @_;
    my $caller = Devel::StackTrace->new()->frame(2)->subroutine;
    if ($caller eq 'POE::Component::Client::HTTP::Request::return_response') {
        $opt{charset} = 'none';
    }
    $self->SUPER::decoded_content(%opt);
}

 これで OK のはず。lestrrat さんのやりかたとどっちがいいのかは全然知りません (^^;

 ちょっとずれた感想ですが、スーパークラスのメソッドかどうか、あるいは AUTOLOAD かどうか、によってラッパーの書き方が変わるのが面倒だなと思いました。

投稿者 kazuho : 2007年04月23日 14:01 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1223

このリストは、次のエントリーを参照しています: Re: PoCo::Client::HTTP が勝手に文字コードを変えてしまう件:

» [開発] Gungho vs PoCo::Clieht::HTTP from D-5 出張版
おお、毎度ありがとうございます。 http://labs.cybozu.co.jp/blog/kazuho/archives/2007/04/poco_... [続きを読む]

トラックバック時刻: 2007年04月24日 10:21

コメント

$bytes eq encode('iso-8859-1', decode('iso-8859-1', $bytes))

は必ず成立します。なぜなら、iso-8859-1は、全byteをmappingに使っているからです。以下、テストコード。

perl -MEncode -le 'use bytes; my $e=shift; for (0..255){ my $c = pack "C", $_; print $_ if encode($e,decode($e, $c)) ne $c}' latin1

何もprintされません。latin1をasciiにしてみてください。今度は128から255がprintされます。

Dan the Encode Maintainer

投稿者 : 2007年04月25日 02:20

ありがとうございます。勉強になります。

投稿者 kazuho : 2007年04月25日 05:35