taka2の日記: SquirrelMailをPHP5.4に対応させてみた 1
日記 by
taka2
PHPを5.4にバージョンアップしたらSquirrelMailが日本語設定で動作しなくなったのでPHP5.4でちゃんと動作するよう修正してみました。
PHP5.4で動かなく原因は、下記の流れ。
- PHP 5.3→5.4で、htmlspecialchars のデフォルト文字エンコーディングが、ISO8859-1 から UTF-8に変更になった。
- SquirrelMail ではhtmlspecialchars が随所で使われているが、どこでもエンコーディングは指定していない。
- SquirrelMail は、言語設定が日本語(ja_JP)の場合、日本語文字を EUC-JP エンコーディングで出力するようになっている。
- EUC-JP で表現された文字バイト列は、UTF-8として解釈すると不正な文字列ということになる。
- htmlspecialchars は不正な文字は破棄する仕様になっている。
以上の結果として、SquirrelMail を PHP5.4 で動かすと、日本語文字がまったく表示されない、ということになってしまうわけですな。
これは、PHPの仕様が腐っているとしか思えないですね。
mbstring が有効になっている場合、htmlspecialchars のデフォルトエンコーディングは mb_internal_encoding にすべきでしょう。
何というかPHPに石を投げたくなる。
なるほど…… (スコア:1)
使う側の各人個々の使い方の問題だからどんな変更点があったかドキュメントを精査してから使えという思想なんですね。ちょっとお友達になりたくないデベロッパコミュニティだなとしろーととして思いました。つか、もっと上位の変更点で気がつけるように書いて欲しいものだなとひいてしまいます。。。
PHP: htmlspecialchars - Manual [php.net]
省略した場合のデフォルト値は、PHP 5.4.0 より前のバージョンでは
ISO-8859-1、そして PHP 5.4.0 以降では UTF-8 となります。
と
この関数を使ううえでは
ISO-8859-1 と ISO-8859-15、
UTF-8、cp866、
cp1251、cp1252 そして
KOI8-R は事実上同等です。
string 自体がそのエンコーディングにおける有効な文字列である限り、
これらのエンコーディングでは
htmlspecialchars() の影響が及ぶ文字がみな同じ位置にあるからです。
// オフトピだが、そのページの閲覧でHTML Validatorが山のようなウォーニングををををを。