[PHP-dev 1344] Re: mb_check_encoding() のテスト
komura
komura @ ma9.seikyou.ne.jp
2006年 10月 7日 (土) 12:07:47 JST
komura です。
前のメールで報告した以下の2点について検証してみました。
PHP 内部の動作自体にはそれほど詳しい訳ではありませんので、間違い等がある
かもしれません。
1. mbstring.encoding_translation が有効にして、文字コードの自動変換を行って
いる場合、エンコーディングが不正な文字列を入力しても、検出されない
PHP 4.4.4 の内部では、不正文字の判定は行われていましたが、ソースコード
の ext/mbstring/mbstring.c を読んでみたところ、以下のような動作なって
いることを確認しました。
1) MBSTRING_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data)
mbstring.encoding_translation が有効になっている場合は文字コード
を変換し、不正文字数を MBSTRG(illegalchars) に記録
2) PHP_RINIT_FUNCTION(mbstring)
MBSTRG(illegalchars) = 0; が実行される
3) mb_check_encoding() を引数なしで使用すると、MBSTRG(illegalchars) が
0 かどうかのみの判定を行っているため、TRUE を返す
2. mb_check_encoding( $str, "UTF-8" ) の判定精度の問題
UTF-8 のフィルタ(ext/mbstring/libmbfl/filters/mbfilter_utf8.c) では、
Shift_JIS やEUC-JP と比較して、不正文字の判定を厳密には行っていない
ようです。
このため、ほとんどの場合、mb_check_encoding( $str, "UTF-8" ) は
TRUE を返すことが分かりました。
正しく以上の問題を解消できているのかは分かりませんが、PHP 4.4.4 と
PHP 5.2.0RC5 の Patch を作成してみましたので、添付します。
PHP 5.2.0RC5 の Patch は PHP 5.1.6 でも適用可能であることを確認しました。
機能改善の参考にでもなれば幸いです。
1. mbstring.encoding_translation が有効になっている場合は、
MBSTRING_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data) で
MBSTRG(illegalchars) を初期化するようにしました。
PHP 5.2.0RC5 では、mb_gpc.c で同等の処理が行われていますが、
不正文字数をカウントしていなかったため、カウント処理を追加しました。
2. 不正文字数による判定ではなく、変換結果が変換文字列と同じかどうか
で判定を行うように変更しました。
PHP スクリプトで以下の処理を行うのと同等の処理になっているはずです。
return $str === mb_convert_encoding( $str, $encoding, $encoding );
上記の Patch では、内部エンコーディングが UTF-8 で mb_check_encoding()
を引数なしで使用する場合、ほとんど効果がないという問題は解消できません。
--
komura <komura @ ma9.seikyou.ne.jp>
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: php-4.4.4_mb_check_encoding.patch
型: text/x-patch
サイズ: 1256 バイト
説明: 無し
URL: http://ml.php.gr.jp/pipermail/php-dev/attachments/20061007/d060a0c5/attachment.bin
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: php-5.2.0RC5_mb_check_encoding.patch
型: text/x-patch
サイズ: 1683 バイト
説明: 無し
URL: http://ml.php.gr.jp/pipermail/php-dev/attachments/20061007/d060a0c5/attachment-0001.bin
PHP-dev メーリングリストの案内