PHPで日本語がおかしい!文字化けの解決方法の話

moji Webエンジニア

PHPで開発を行っていると、日本語を画面に表示させた際に文字がおかしくなり正常に表示できないことがあると思います。

macとwindows間のメールのやりとりなどでもたまにありますが、この現象は文字化けと言われています。

文字化けの原因

文字化けの原因はずばり文字コードです。文字コードが違うものを利用すると正常に表示されなくなるといった具合です。

文字コードには例えば以下のような種類があります。

・ShiftJIS
・EUC
・UTF-8

その昔、ガラケーのwebサイトの時代なんかではShiftJISやEUCが利用されているwebサイトも多くありましたが、今はほぼほぼUTF-8ですね。

windowsのofficeでCSVを利用する際なんかはまだShiftJISを使わないと文字化けしたりすることもありますね。

解決策

PHPファイルを作成したエディタで文字コードを指定して保存します。メニューにそれらしい項目があればいいですが、もしない場合、設定などで文字コードを指定する部分があったりします。

基本的にはUTF-8に統一しておけば問題はないかなと思います。

PHPファイルの文字コードはUTF-8なのに文字化けする

HTMLでは最初の部分で文字コードを指定する部分があります。先頭の以下の部分です。

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

これが抜けていると文字化けしてしまうことがあります。例えばHTMLとしてはまだ構成しておらず、PHP単体でechoした時なんかにあり得ます。

PHP自体で以下のコードで吐き出すことも可能です。

header("Content-type: text/html; charset=utf-8");

データベースの文字コードにも注意

PHPやHTMLファイルをUTF-8に統一して表示出来て安心していても、MySQLなどのデータベースの文字コードにも注意しておかないと格納したデータが文字化けするなんてこともあり得ます。

データベースやテーブルを作成する際にも文字コードはUTF-8を選択するようにしておけば基本的には問題ないはずです。

HTMLエスケープの話

文字化けとは違う話になってしまいますが、webアプリを作っているとHTMLエスケープについても少し悩むことになると思います。

HTMLはタグで構成されて表示されますが、そのタグ自体を表示する場合にはタグを別文字にエスケープする必要があります。

例えば<br />を画面上に表示したい場合は&lt;と置き換えます(半角だと変わっちゃうので全角で書いてます)

他にも色々とHTMLエスケープしないと表示できない文字などもあるので知っておくと良いと思います。

セキュリティの話

たまにこのタグをそのまま画面に表示できてしまうサイトがあります。例えばユーザーが入力したものをそのまま画面に表示するサイトです。

これだと任意のjavascriptのコードが実行されてしまいセキュリティ的にまずいことになってしまいます。

ユーザーが入力したものを確認画面や結果画面などで表示する場合には必ずHTMLエスケープして表示するようにしましょう。

まとめ

以上、文字に関するお話でした。色々とぶつかる問題もあると思いますが、現象で検索すれば大概の答えは見つかりますので、根気強く調べてみてください。