12月

このブログでは広告を表示するのにWPAdsプラグインを利用しています。このプラグインは重み付けによって複数の広告を切り替えて表示する機能など非常に便利なものですが、広告の「Description」や「HTML Code」に日本語を入れると文字化けしてしまう問題があります。

今日はちょっと時間があったので文字化けの原因について調べてみました。

日本語の文字を含んだ広告を作成してWPAdsのデータベースを直接見てみたところ正常に保存されているようなので、原因は管理ページの表示部分にあると予想して wpads-options.php を見たところ、以下のようなコードになっていました。

<tr>
    <td valign="top">Description</td>
    <td>
        <input name="banner_description" type="text" size="50" value="<?php echo htmlentities($banner->banner_description);?>" /><br />
        Any text that helps you identify this banner
    </td>
</tr>
<tr>
    <td valign="top">HTML Code</td>
    <td>
        <textarea name="banner_html" rows="6" cols="80"><?php echo htmlentities($banner->banner_html);?></textarea><br />
        Copy and paste the HTML code to show the ad (for example, the Google AdSense code)
    </td>
</tr>

どうもhtmlentities()によるエスケープ処理で日本語が化けてしまっているようです。htmlentities() は文字コードを省略されると ISO-8859-1 として処理されるようなので、正しく処理するように ‘UTF-8’ を渡します。(ついでに XSS の問題がありそうなので ENT_QUOTES オプションを追加。)

修正後のソースは以下のようになります

<tr>
    <td valign="top">Description</td>
    <td>
        <input name="banner_description" type="text" size="50" value="<?php echo htmlentities($banner->banner_description, ENT_QUOTES, 'UTF-8');?>" /><br />
        Any text that helps you identify this banner
    </td>
</tr>
<tr>
    <td valign="top">HTML Code</td>
    <td>
        <textarea name="banner_html" rows="6" cols="80"><?php echo htmlentities($banner->banner_html, ENT_QUOTES, 'UTF-8');?></textarea><br />
        Copy and paste the HTML code to show the ad (for example, the Google AdSense code)
    </td>
</tr>

patch: wpads-utf8.patch

関連するエントリ

関連書籍

Comment / Trackback[7 Comments]

Post Comment