パスワードを忘れた? アカウント作成
4947283 journal
日記

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に石を投げたくなる。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by shibuya (17159) on 2012年07月05日 19時12分 (#2187734) 日記

    使う側の各人個々の使い方の問題だからどんな変更点があったかドキュメントを精査してから使えという思想なんですね。ちょっとお友達になりたくないデベロッパコミュニティだなとしろーととして思いました。つか、もっと上位の変更点で気がつけるように書いて欲しいものだなとひいてしまいます。。。

    PHP: htmlspecialchars - Manual [php.net]

    省略した場合のデフォルト値は、PHP 5.4.0 より前のバージョンでは
                  ISO-8859-1、そして PHP 5.4.0 以降では UTF-8 となります。

    この関数を使ううえでは
                  ISO-8859-1ISO-8859-15
                  UTF-8cp866
                  cp1251cp1252 そして
                  KOI8-R は事実上同等です。
                  string 自体がそのエンコーディングにおける有効な文字列である限り、
                  これらのエンコーディングでは
                    htmlspecialchars() の影響が及ぶ文字がみな同じ位置にあるからです。

    // オフトピだが、そのページの閲覧でHTML Validatorが山のようなウォーニングををををを。

typodupeerror

吾輩はリファレンスである。名前はまだ無い -- perlの中の人

読み込み中...