1. TOPTOP
  2. Webサービス
  3. PHP

mb_check_encoding関数の機能を有効にさせるためには?(PHP)

|

PHP

PHPをインストールした際に、文字エンコード(mb_check_encoding関数の使い方)について困っていたときのお話を1つ。

問題の内容

下記のコードでは、mb_check_encoding関数で文字エンコーディングをチェックしています。何かの文字をフォームに入力して「送信ボタン」を押すと、

  • ‘encoding OK.’
  • ‘encoding NG.’

いずれかの結果が返ってくるはずですが、どちらの結果も返ってきません。mb_check_encoding関数の機能を有効にさせて、結果を表示させるためにはどうすればよいでしょうか?

<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>

問題の補足

ローカル開発環境は以下の通りです。

  • 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.ファイルのヘッダータグに文字コードを指定する

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

head要素の中にmeta要素を埋め込み、meta要素で、文書の文字コードをUTF-8とします。

2.php.iniの設定

output_buffering = Off
default_charset = “UTF-8″
mbstring.language = Japanese

php.iniの設定を行います。mb_check_encoding関数を動かすだけで良ければ、上記3行の変更で良いみたいです。

しかし、脆弱性の問題まで踏み込んで、文字コードの設定を行うならば、別途対策が必要な気がします。

〔参考サイト〕