[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 メーリングリストの案内