PHPをインストールした際に、文字エンコード(mb_check_encoding関数の使い方)について困っていたときのお話を1つ。
問題の内容
下記のコードでは、mb_check_encoding関数で文字エンコーディングをチェックしています。何かの文字をフォームに入力して「送信ボタン」を押すと、
- ‘encoding OK.’
- ‘encoding NG.’
いずれかの結果が返ってくるはずですが、どちらの結果も返ってきません。mb_check_encoding関数の機能を有効にさせて、結果を表示させるためにはどうすればよいでしょうか?
[php]
<html>
<body>
<form method="post" action="p14mbchk.php">
<input type="text" maxlength="40" name="val">
<input type="submit"></form><p>
<?php
//! mb_check_encoding関数で文字エンコーディングをチェックするサンプル
if(!isset($_POST[‘val’]) || $_POST[‘val’] == ”){
die(‘not submitted.’);
}
var_dump($_POST[‘val’]);
phpinfo();
if(mb_check_encoding($_POST[‘val’], ‘UTF-8’)){
echo ‘encoding OK.’;
}
else{
echo ‘encoding NG.’;
}
?>
</p>
</body>
</html>
[/php]
問題の補足
ローカル開発環境は以下の通りです。
- Linux(CentOS6.0)
- Apache2.2
- PHP5.3
そのローカル開発環境に、インストールしたPHPを詳しく述べると次のとおり。
- php-cli-5.3.3-27.el6_5.i686
- php-pdo-5.3.3-27.el6_5.i686
- php-mbstring-5.3.3-27.el6_5.i686
- php-common-5.3.3-27.el6_5.i686
- php-5.3.3-27.el6_5.i686
- php-mysql-5.3.3-27.el6_5.i686
mbstrigに関してデフォルトのphp.iniを次のように変更しています。
- mbstring.language = Japanese (#コメントアウトを解除)
- mbstring.internal_encoding = UTF-8 (#mbstring関数のデフォルト文字コードをUTF-8に)
- mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII (#文字コードの自動判別の優先順位をつける)
解決方法
次の2つの作業を行うことで、解決することができました。
1.ファイルのヘッダータグに文字コードを指定する
[php]
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
[/php]
head要素の中にmeta要素を埋め込み、meta要素で、文書の文字コードをUTF-8とします。
2.php.iniの設定
[php]
output_buffering = Off
default_charset = “UTF-8″
mbstring.language = Japanese
[/php]
php.iniの設定を行います。mb_check_encoding関数を動かすだけで良ければ、上記3行の変更で良いみたいです。
しかし、脆弱性の問題まで踏み込んで、文字コードの設定を行うならば、別途対策が必要な気がします。
〔参考サイト〕