【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」にした方がよいみたい。