2005年4月4日月曜日

Template::Plugin::TagRescue0.04が特定条件で文字化け

あるサーバに移すとTempalte::Plugin::TagRescueを使ってタグをエスケープした部分の文字が化けるという現象が発生したため、原因を調査してみました。

サーバにインストールされていたのはその時点で最新のTemplate::Plugin::TagRescue0.04。
ソースをのぞくとタグのエスケープにApache::Util::escape_htmlもしくは、HTML::Entities::encode_entitiesが利用されていて、Apache::Utilが利用できない環境ではHTML::Entitiesが使われるという設計になっていました。

問題のサーバを調べてみるとApache::Utilが利用できない環境で、エスケープにはHTML::Entitiesが使われていて、どうやらそのHTML::Entitiesでエスケープを行うと文字化けが発生するようです。

そこでHTML::Entitiesのドキュメントを眺めると、以下のような記述が。

>
encode_entities( $string, $unsafe_chars )
This routine replaces unsafe characters in $string with their entity representation. A second argument can be given to specify which characters to consider unsafe (i.e., which to escape). The default set of characters to encode are control chars, high-bit chars, and the <, &, >, and " characters. But this, for example, would encode just the <, &, >, and " characters:
<

encode_entitiesの2つめの引数に明示的にエスケープを行う文字を指定しないと、マルチバイト文字もエンコードの対象になるようで、これが原因で文字化けしていたようです。試しに第2引数をわたしてやると、文字化けが解消されました。

今回の件は作者のtanimotoさんに報告し、パッチを送ったのですが、送った数時間後には修正しCPANにアップしてくださいました。仕事がはやい!
しかも僕のパッチからさらに改良して、実行速度を向上させるあたり、さすがだなーと思いました。


0 件のコメント:

コメントを投稿