いま諸事情あって、PHPのスクリプトをShift_JISで書いてるんだけど、php.iniで
mbstring.internal_encoding = SJIS
って設定してるのに、
echo 'バンコ・デル・ムトゥオ・ソッコルソ';
がエラーになるんですわ。要するに、Shift_JISの「ソ」の右半分が「\」なので、行の最後が「\'」ってことになってしまい、「'」で閉じられてないことになるわけね。
で、おかしいなあと思ったわけですよ。だって、internal_encoding、つまり内部エンコーディングをSJISにしてるのにって。でね、調べてみたら、
http://hain.jp/index.php/tech-j/2007/02/13/p125
に、
●internal_encodingは内部エンコードのことではない
先ほどの例の時にも書いたが、
PHPには内部エンコードという概念は存在しない。
ではmbstring.internal_encodingとは何なのか。
これはmbstring関数のデフォルトエンコード
なだけである。
(中略)
SJISで利用した場合、
5C問題(「ソ」「表」などを記述するとパーサエラーが出る)が発生するわけだが、
internal_encodingをSJISにしても問題は解決しない。
これを解決するには--enable-zend-multibyteをつけてコンパイルし直す必要がある。
(もちろんSJISは利用しないのが一番いいのだが。)
って書いてあってのけぞった。「は?」と。「internal_encoding」が「内部エンコーディング」じゃないって、そんなあほな。
で、「--enable-zend-multibyte」ってキーワードで調べてみると、いろいろ情報が見つかる。いままでスクリプトをShift_JISで書いたことがなかったんで、PHPをShift_JISで書くときの注意みたいな話、流して読んでたわけね。なるほど(泣)。
というわけで、再度PHPを--enable-zend-multibyte付きでコンパイルしなおし、php.iniに、
mbstring.script_encoding = SJIS
を追加してApacheをリスタートしたところ、めでたく、
echo 'バンコ・デル・ムトゥオ・ソッコルソ';
が通るようになった。いやー、バンコの来日に間に合って良かった。
あ、ちなみに書いときますが、別にバンコの来日に関係する仕事をしてるとか、そういうことは1ミリもなくて、テストデータを書くときに、なんとなく、
array( 'question' => 'プログレ四天王に入らないのはどれ?', 'answers' => array( 'king_crimson' => 'キング・クリムゾン', 'yes' => 'イエス', 'pink_floyd' => 'ピンク・フロイド', 'banco' => 'バンコ・デル・ムトゥオ・ソッコルソ', ), 'correct_answer' => 3, ),
ってデータを作ったわけさ。いやー、プログレ好きで良かったよ。そうじゃなかったら、いまもまだ気がつかずにいたところだった。
しかし、internal_encodingって名前で内部エンコーディングじゃないなんて、変態的。
やれやれ。
バンコ万歳!