PHPで文字化けを解消する方法:mb_convert_encoding()

さまざまな文字コードが混在する環境では文字化けが起こることがあります。PHPはさまざまな文字コードに対応していますが、場合によっては文字化けが起こることがあります。しかし、適切な対策を行うことで文字化けを避けることができます。

文字化けが起こる例

文字化けは異なる文字コードが1つのファイルに混在した場合に起こります。例えばファイルからデータを読み込む場合です。

PHPスクリプトがUTF-8で書かれていて、読み込むファイルがシフトJISだった場合、これをそのまま表示してしまうと文字化けが発生します。

<?php
$data= file_get_contents('./test.txt'); // シフトJISファイル読み込み
echo $data; // 文字化け
?>

文字化けの回避

文字化けを解消したい場合、文字コードを統一すればいいわけです。今回の例の場合、読み込むファイルの文字コードをシフトJISからUTF-8に変更して保存すれば文字化けは起きなくなります。

しかし、ファイルの文字コードはシフトJISから変更できない場合にはどうすればよいでしょうか?この場合、いったんシフトJISとして読み込んだデータをUTF-8に変換すると文字化けは起きなくなります。

<?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 を使ってみましょう。

$str = mb_convert_encoding($data,"utf-8","sjis"); // シフトJISからUTF-8に変換

まとめ

最も確実なのは、すべてのファイルの文字コードを統一することです。可能な場合には、何らかの文字コードに統一すると良いでしょう。現在は、UTF-8がおすすめです。それができない場合、内部で変換を行う必要があります。


イベント