PHPの出力が文字化けしてる・・・文字コードの統一について
NetBeansにて「PHP逆引きレシピ」のサンプルコードを教材にPHPの勉強を進めています。
第3章3.1は文字列の勉強です。01.phpは「文字列の一部を取り出したい」ですけど実行してみると日本語の文字数の数え方が何だか変です。10.php「半角英数字を全角に変換したい」なんかを実行してみると文字化けしています。
変換する文字列: ABC 123
半角「英字」を全角に変換
→ ??? 123
調べてみると以下のことが分かりました。
・echo mb_internal_encoding(); を書きこんで実行 → ISO-8859-1 と出る。
PHPの内部処理は導入したxamppのデフォルトではISO-8859-1で動いている様子。
・php.iniの1774行目付近を
mbstring.internal_encoding = UTF-8
にすると文字化けしない。
・あるいは、プログラムの最初に
mb_internal_encoding("UTF-8");
と書いてやると文字化けしない。
なるほどねー、文字コードについて意識しないといけないんですね。
xamppを導入する段階から一応文字コードはUTF-8に統一する方針でいました。ここで文字コードについてちょっとメモしておきます。
・xamppは普通にインストールしただけでUTF-8で動いているものだと思っていたが、誤りだった。
・xoops cube legacy はUTF-8を選んでインストールした。UTF-8の言語パッケージはextrasフォルダに入っているのがミソ。
・xoopsは文字化け等見当たらず正常に動いているので結構と思っていたが、プログラム自身で文字コードの制御をやっている模様。
・「PHP逆引きレシピ」のサンプルコードの文字コードはUTF-8である。
・NetBeansはプロジェクトを作る時に文字コードを設定できる。デフォルトはUTF-8である。設定と違う文字コードのファイルを開こうとするとアラートを出してくれるので文字コードの統一に寄与してくれる。
ということで、UTF-8に統一する環境として周辺はOKなんだけど、肝心のPHPの設定はどうするべきなんだろうか? ネットで調べるとphp.iniをぐちゃぐちゃいじっていたりする。理解もせずにデフォルト設定を大きくいじるのは好まない。そもそも将来レンタルサーバを借りるとなると、php.iniを設定できるとは思えない。.htaccessで制御する方法もあるらしいが、移植性の問題で推奨されない。
・・・ということで、文字コードはプログラムの中で制御すべしというのが私の結論です。とは言っても、当分はめんどくさいので、今日の所は php.ini の mb_internal_encoding だけ UTF-8 設定にしておきます。