全角英数字を半角に、半角カナを全角に簡単に変換 但しXSS脆弱性に注意

書籍等で使われているタイトルにある表記のゆらぎを減らすため、全角英数字を半角に、半角カナを全角に等、変換しようと思います。


preg_replaceを使って、正規表現で指定するものだと思っていました。
しかしちょっと(自分で書くのは面倒なため例示を探して)調べたところ、もっと簡単な方法をみつけました。


mb_convert_kanaを使う方法です。
方法というより当たり前の話なのですが、見落としていたのでテイクノートです。




mb_convert_kanaは、半角・全角を簡単に変換することのできる関数です。


「この関数は、日本語のみで使用可能です」とかmb_convert_kanaとありますが、「『半角』英数字を『全角』に変換」するオプションもあります。

<?php
/* 「仮名」を全て「全角カタカナ」に変換します */
$str = mb_convert_kana($str, "KVC");

/* 「半角カタカナ」を「全角カタカナ」に変換し、「全角」英数字を「半角」
   に変換します。 */
$str = mb_convert_kana($str, "KVa");
?>


以上のように、変換する文字とオプションを順位指定します。
一度に複数のオプションが指定できるので便利ですね。


オプションの種類はマニュアルをご覧ください。


PHP: mb_convert_kana - Manual
 http://jp2.php.net/manual/ja/function.mb-convert-kana.php



なお、以下の指摘もあるので注意。

mb_convert_kana()のaオプションがちょっと厄介で、英数字だけでなく、ASCII記号までも半角にされてしまうわけで、要は→>までもが>に変換されるという事態に


▽mb_convert_kana()のaオプションの脆弱性について(PAPALOG)
 http://papalog.graffi.jp/notes/mb_convert_kana%E3%81%AEa%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/


▽mb_convert_kana の a オプションで XSS 脆弱性(yuriko.net)
 http://www.yuriko.net/arc/2009/01/17/mb_convert_kana-xss/


つまり、aオプションを使う場合で、かつ外部からの入力を処理する場合、注意が必要です。
私の場合、今のところ、xhtmlrssで出力する関係で出力時にhtmlspecialcharsを通すから大丈夫だと思いますが、ついうっかり……を考えると使わない方が安全ですね。