PHP の関数 mb_convert_kana による英数字変換の挙動

2007-01-16

#PHP

PHP5 の mbstring 関数の一つ mb_convert_kana() は、全角文字と半角文字の変換を行う大変便利な関数だ。
しかし、英数字の全角半角変換に関しては注意しなければならない点がある。

変換方式による違い

mb_convert_kana() では変換オプションを指定することで様々な文字の変換が可能だ。
そのうち、全角英数字から半角への変換に関するオプションは以下のものがある。

r   「全角」英字を「半角」に変換します。
n   「全角」数字を「半角」に変換します。
a   「全角」英数字を「半角」に変換します(“a”, “A” オプションに含まれる文字は、U+0022, U+0027, U+005C, U+007Eを除く U+0021 - U+007E の範囲です)。
― PHPマニュアル日本語版より引用

一見すると、a オプションと rn(nr)オプションは同等かのように思えるが、実はそうではない。
a オプションの「U+0022, U+0027, U+005C, U+007E を除く U+0021 - U+007E の範囲」という所がポイントだ。

a オプションを指定した場合は ”’¥~ を除くASCII記号も変換されるのである。
つまり、下記の記号が全て半角への変換対象となる。

!#$%&()*+,-./:;<=>?@[]^_`{|}

一方、r オプションは a-z 及び A-Z、n オプションは 0-9 の数字のみを変換する為、rn(nr)オプションを指定した場合には記号の変換は一切行われない。

以上の事はもちろん、半角から全角への変換についても同様である。

安全性の懸念

a オプションを用いて変換を行った場合は上記の通り &<> なども変換される為、意図しないタグが生成される等のセキュリティホールや誤動作の原因になり得る。使用の際は細心の注意が必要だろう。

※ PHP5.1.2 (Windows版) の mb_convert_kana() 関数で確認。

QooQ