[PHP-dev 1500] htmlspecialcharsのdisplay_errorsの解釈が逆転している問題

Narusase narusase @ gmail.com
2009年 12月 5日 (土) 03:13:36 JST


はじめまして narusaseです。

↓このあたりに軽くまとめてありますが・・・
http://d.hatena.ne.jp/narusase/20091203
http://d.hatena.ne.jp/narusase/20091204

htmlspecialcharsのdisplay_errorsの解釈が逆転している問題があるようです。

↓UTF-8で下記のようなコードを書き実行すると
<?php
$str = 'メガネ';
$hoge = htmlspecialchars($str, ENT_QUOTES, 'SJIS');
printf("%s\n",var_export($hoge, true));
?>

htmlspecialcharsの箇所でエラーが起こります。

これ自体は問題ないのですがphp.iniの設定が「display_errors = Off」にした場合にPHP Warning.が発生します。
逆に、「display_errors = On」場合このエラーは表示されません。

これは、動作としては逆になるべきで誤っていると思います。


↓このあたりにdisplay_errors云々のそれっぽい報告はあるようですが、意図的にやっているので対応する気は無いと言っている様に見えます。
#・・・対応する気もなさそうだしこれも投げるだけ無駄なのかなぁ〜〜?
http://bugs.php.net/bug.php?id=47494
http://bugs.php.net/bug.php?id=49579

どんな意図でやっているかは今ひとつわかりませんが・・・
仮に、二バイトコードを使う場合に第三引数と異なる文字コードの文字列が渡されることが頻繁にあるので注意のためにエラーを出していると言う意図があるのだとしたら何となく理解できないでもないのですが、その場合はdisplay_errorsの値に関係なくエラーを出力するべきかと思います。

・・・ということでとりあえずですが、パッチを二種類作ってみました。
Plan A は display_errors = On の場合 PHP Warning を出力するようにするもの(望ましい動作)
Plan B は 常にPHP Warningを出力するようにするものです。

#本来なら本家に投げればいいのでしょうが、いかんせん英語は苦手で・・・orz


よろしく取りはからいください


対象のファイルは php-5.2.11/ext/standard/html.c

Plan A patch
-------------------------
*** html.c.old  2009-12-04 12:07:22.000000000 +0900
--- html.c      2009-12-04 12:44:37.000000000 +0900
***************
*** 1137,1143 ****
                if(status == FAILURE) {
                        /* invalid MB sequence */
                        efree(replaced);
!                       if(!PG(display_errors)) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Invalid multibyte sequence in argument");
                        }
                        *newlen = 0;
--- 1137,1143 ----
                if(status == FAILURE) {
                        /* invalid MB sequence */
                        efree(replaced);
!                       if(PG(display_errors)) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Invalid multibyte sequence in argument");
                        }
                        *newlen = 0;
-------------------------

Plan B patch
-------------------------
*** html.c.old  2009-12-04 12:07:22.000000000 +0900
--- html.c.b    2009-12-04 18:51:38.000000000 +0900
***************
*** 1137,1145 ****
                if(status == FAILURE) {
                        /* invalid MB sequence */
                        efree(replaced);
!                       if(!PG(display_errors)) {
!                               php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Invalid multibyte sequence in argument");
!                       }
                        *newlen = 0;
                        return STR_EMPTY_ALLOC();
                }
--- 1137,1143 ----
                if(status == FAILURE) {
                        /* invalid MB sequence */
                        efree(replaced);
!                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid 
multibyte sequence in argument");
                        *newlen = 0;
                        return STR_EMPTY_ALLOC();
                }
------------------------- 



PHP-dev メーリングリストの案内