PHPスクリプトの文字エンコーディング

php.iniのmbstring.internal_encodingやmb_internal_encoding()はPHPスクリプト自体の文字エンコーディングとは関係ない。
これらはmbstring系の関数が内部で処理するためのエンコーディング指定だ。
なのでinternal_encodingにShift_JISを指定したからといって、Shift_JISスクリプトを書いていいわけではない。


むしろマニュアルには次のようなことが書かれている。


PHP で動作しないと思われる文字エンコーディングの例を以下に示します。

JIS, SJIS, ISO-2022-JP, BIG-5

これらのエンコーディングで書かれた PHP スクリプトは、 特に符号化された文字列がスクリプトで記述子やリテラルに使用される場合には、 動作しない可能性がありますが、入力される HTTP クエリに関して mbstring の透過的なエンコーディングフィルタを 設定することでこれらのエンコーディングをほとんど使用しないようにすることができます。

注意: SJIS, BIG5, CP936, CP949, GB18030 は、読者がパーサ/コンパイラ、 文字エンコーディングと文字エンコーディングの問題点について精通していない限り 内部エンコーディングとして使用するべきではありません。

携帯系のサービスなんかでよくShift_JISで書かれているのを見かけるけど、内部はUTF-8とかEUC-JPで書いて出力時にShift_JISにするべき。というのは簡単だけど絵文字とかが絡んでくると他のエンコーディングだと上手く処理できなかったりして。難しいなぁ。

--enable-zend-multibyte

ところで、PHP4までは--enable-zend-multibyteというconfigureのオプションがあって、これを指定するとmbstring.script_encodingで文字通りスクリプトファイルのエンコーディングを設定できたりするんだけど、これって今はどうなってるんだっけ?
PHP5に移行するときにzend-multibyteはサポートされなくなるみたいな記事をよく見かけたけど。