萩萩日記

世界に5人くらい存在するかもしれない僕のファンとドッペルゲンガーに送る日記

PHPのmbstring.internal_encodingの意味をずっと勘違いしていた件について

いま諸事情あって、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で書いたことがなかったんで、PHPShift_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って名前で内部エンコーディングじゃないなんて、変態的。

やれやれ。

バンコ万歳!