【PHP】入力した値がShift-JISか判定する(文字コード判定)

データベースの文字コードがEUC-JPとかShift-JISとかだと、ユーザが入力したデータが文字化けしないでちゃんとデータベースに保存できるかチェックしたいときがあります。

PHPだとmb_check_encodingという便利な関数があるので、これでチェックすればいいやーと思っていましたが、実装してみるとうまく判定してくれず。ソースファイルの文字コードによって返値が変わってくる。例えば、UTF-8nのファイルに次のコードを記述して実行すると値はfalse。

var_dump( mb_check_encoding( '1', 'Shift-JIS')); //全角の1

これは正しい?使い方間違っている?

しょうがないので、mb_check_encodingはあきらめて、mb_convert_encodingを使って、一度チェックした文字コードに変換して、元に戻した結果が同じかどうかでチェックすることに。

こんな感じ↓

$sMoji = "1";
$sTemp = mb_convert_encoding($sMoji, 'Shift-JIS'); //変換
$sTemp = mb_convert_encoding($sTemp, 'UTF-8', 'Shift-JIS'); //元に戻す
if ($sMoji === $sTemp) {
    echo "Shift-JISで表現できる文字:$sMoji";
} else {
    echo "Shift-JISで表現できない文字:$sMoji";
}

ちなみにShift-JISで表現できない文字で有名なのが森鴎外の鴎(かもめ)がメでなくて品となっている「鷗」という文字。「かもめ」とか「おう」で変換すれば出てくる。

さらにmb_internal_encodingを使って現在の文字コードを取得すれば、汎用的になる。↓こんな感じかな。(試してはないです)

$sMoji = "1";
$sEncode = mb_internal_encoding();
$sTemp = mb_convert_encoding($sMoji, 'Shift-JIS', $sEncode); //変換
$sTemp = mb_convert_encoding($sTemp, $sEncode, 'Shift-JIS'); //元に戻す
if ($sMoji === $sTemp) {
    echo "Shift-JISで表現できる文字:$sMoji";
} else {
    echo "Shift-JISで表現できない文字:$sMoji";
}

<2008/07/03 追記>
「Shift-JIS」だと「Ⅱ」とかがShift-JISと判断してくれないので、「sjis-win」にした方がよいみたい。