JeffreyFrancesco.org 公開日 タグ Tag Permalink 現在地 Facebook page Twitter RSS feed

という訳で、1回目。

ダウンロードしたのをそのまま plugin ディレクトリに放り込んだだけでは、日本語環境だと少し不具合が起こりました。デフォルトの状態でブラウザからテスト投稿してみると、文字コードの変換は全く起こってない状態にも関わらず、何故か一部のコメントが文字化けしてしまうんです。

色々調べてみると、feedback プラグインは投稿されたコメントを処理する際に、& < > " を実体参照化するために CGI モジュール内の escapeHTML サブルーチンに処理を任せているのですが、どうやらこのサブルーチンの仕様が悪さをしているようで

escapeHTML() を読むと、文字コードが “ISO-8859-1” か “WINDOWS-1252” だった場合に、 “\x8b” と “\x9b” という二文字をエスケープしてそれぞれ “‹” と “›” にしている。コメントによると、 “# Handle bug in some browsers with Latin charsets” だそうで、ブラウザのバグに対処するためのコードらしい。

この “\x8b” “\x9b” という二文字は、 Terminal.app で文字エンコーディングを「欧米 (Windows Latin 1)」にしたときに以下のようにすると表示される文字(UTF-8 だと ? になってしまう)。 wordpress で作ってあるブログのタイトル部分によく使われている、 < と > の小さいっぽい文字のようだ。

ということなのですが、おそらくプラグインから escapeHTML に処理を渡す部分で文字コード (UTF-8) を指定して渡していないため、デフォルトの “ISO-8859-1” と判断されて上記引用部分のエスケープ処理がされ、この二つのバイトを含む文字が化けてしまうのだと思います。なので、プラグインの内部に新規で escape_HTML というサブルーチンを作り:

sub escape_HTML {
    my $text = shift;

    $text =~ s/&/&amp;/mg;
    $text =~ s/</&lt;/mg;
    $text =~ s/>/&gt;/mg;
    $text =~ s/"/&quot;/mg;
    $text =~ s/'/&#39;/mg;  # 無くてもいいかもしれないけど一応

    return $text;
}

んで、コメント処理 etc. で escapeHTML を呼び出しているところを escape_HTML に変更し、実体参照化をプラグイン内部で行なってやるようにすることで対処しておくことにしました。オリジナルのコードでいうと 1157 行目辺りと 1216 行目辺りの2ヶ所になりますね。やってることはほぼ同じ、余計な処理だけ省いたってだけなんですが (笑) とりあえずこれで普通の文字化け (謎) は回避することが出来ます。

という訳で、次回は普通じゃない文字化け (?) への対処法を、近いうちに書きます。