さまざまな文字コードが混在する環境では文字化けが起こることがあります。PHPはさまざまな文字コードに対応していますが、場合によっては文字化けが起こることがあります。しかし、適切な対策を行うことで文字化けを避けることができます。
文字化けが起こる例
文字化けは異なる文字コードが1つのファイルに混在した場合に起こります。例えばファイルからデータを読み込む場合です。
PHPスクリプトがUTF-8で書かれていて、読み込むファイルがシフトJISだった場合、これをそのまま表示してしまうと文字化けが発生します。
1 2 3 4 |
<?php $data= file_get_contents('./test.txt'); // シフトJISファイル読み込み echo $data; // 文字化け ?> |
文字化けの回避
文字化けを解消したい場合、文字コードを統一すればいいわけです。今回の例の場合、読み込むファイルの文字コードをシフトJISからUTF-8に変更して保存すれば文字化けは起きなくなります。
しかし、ファイルの文字コードはシフトJISから変更できない場合にはどうすればよいでしょうか?この場合、いったんシフトJISとして読み込んだデータをUTF-8に変換すると文字化けは起きなくなります。
1 2 3 4 5 |
<?php $data= file_get_contents('./test.txt'); // シフトJISファイル読み込み $str = mb_convert_encoding($data,"utf-8","sjis"); // シフトJISからUTF-8に変換 echo $data; // 文字化けが起きない ?> |
シフトJISの注意点
シフトJISは上記のように単に sjis を指定する場合と sjis-win を指定する場合があります。sjis-winはWindows用で使われているシフトJISです。
一般的にWindowsでシフトJISは使われており、一部の文字は sjis-win でないと文字化けを起こすことがあります。
mb_convert_encoding()の sjis で文字化けを起こすときには sjis-win を使ってみましょう。
1 |
$str = mb_convert_encoding($data,"utf-8","sjis"); // シフトJISからUTF-8に変換 |
まとめ
最も確実なのは、すべてのファイルの文字コードを統一することです。可能な場合には、何らかの文字コードに統一すると良いでしょう。現在は、UTF-8がおすすめです。それができない場合、内部で変換を行う必要があります。