当社は、PHP+MySQLの勤怠システムを使っています。レンタルサーバ引っ越しのタイミングで勤怠システムも移行する必要が生じました。PHPスクリプトとMySQLのデータ移行が終わり、ログイン画面からログインもできるようになったのですが、全角文字の一部が文字化けするという問題が生じました。調査して無事解決しましたので、備忘録として記しておきます。
発生した問題
今回、文字化けしたのは、一部の全角文字でした。具体的には、表のヘッダーなどPHP内から直接出力している文字列については、全角文字でも正しく表示されていました。一方、MySQLから取得した全角文字データを表示している箇所は、ことごとく文字化けしてしまっていました。
問題は、文字コードの設定にあるようです。
MySQL内は、UTF-8でデータが格納されています。PHPのスクリプトもUTF-8で保存されています。
次に、PHP内部ではどのような文字コードで処理されているのか php.ini で調べてみました。mbstring.internal_encoding という項目を見てみますと「no value」なっていました。どうやらPHP内部では、UTF-8として認識して処理ができていないことが原因のようです。
ちなみに、以前に使っていたレンタルサーバの php.ini を確認したところ、mbstring.internal_encoding には UTF-8 が設定されていました。そのため、文字化けしていなかったようです。
文字化けの解決方法
さて、この問題を解決するためには mysqli_set_charset() という関数を用います。
しかし、勤怠システムが少々古いバージョンであるPHP5.3で動いているため、mysql_set_charset() という関数を使うことにしました。PHPマニュアルによるとこの関数は、PHP5.5.0で非推奨になり、PHP7.0.0で削除されてしまったようです。
この関数を使うことで クライアント側の文字コードを設定することができます。ここで言うクライアント側というのはPHP側のことで、サーバ側というのはMySQL側を指していると思われます。つまり、サーバ側とかクライアント側とか言っても、レンタルサーバの場合は、同一サーバ内に同居しているというパターンもあるでしょう。
さて、PHPスクリプト内でMySQL に接続後、 mysql_set_charset() 関数を使って文字コードを UTF-8 に設定することで文字化けを回避することができます。
mysql_set_charset('utf8');
ちなみに、以下の一文を入れることで問題を解決するという方法もあったようです。しかし、PHPマニュアルと見てみますと、mysql_set_charset() を使うことが推奨されており、mysql_query() を使って設定することは勧められていません。
mysql_query('SET NAMES utf8');
今回の問題は、mysql_set_charset() 関数を使って、クライアント側のデフォルト文字セットを設定することが解決することができました。しかし、mysql_set_charset()関数は、最新バージョンのPHPでは削除されていることを考えると早急にmysqli_set_charset()関数への置き換えを実施しなければと思います。
では、今回はここまでです。

