|
View:
New views
3 Messages
—
Rating Filter:
Alert me
|
|
|
|
|
|
[PHP-dev 1344] Re: mb_check_encoding() のテスト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@...> [php-4.4.4_mb_check_encoding.patch] diff -ur php-4.4.4.orig/ext/mbstring/mbstring.c php-4.4.4/ext/mbstring/mbstring.c --- php-4.4.4.orig/ext/mbstring/mbstring.c 2006-04-03 22:03:50.000000000 +0900 +++ php-4.4.4/ext/mbstring/mbstring.c 2006-10-07 10:29:26.204433000 +0900 @@ -1013,7 +1013,10 @@ MBSTRG(current_http_output_encoding) = MBSTRG(http_output_encoding); MBSTRG(current_filter_illegal_mode) = MBSTRG(filter_illegal_mode); MBSTRG(current_filter_illegal_substchar) = MBSTRG(filter_illegal_substchar); - MBSTRG(illegalchars) = 0; + + if (!MBSTRG(encoding_translation)) { + MBSTRG(illegalchars) = 0; + } n = 0; if (MBSTRG(detect_order_list)) { @@ -1774,6 +1777,8 @@ info.num_from_encodings = MBSTRG(http_input_list_size); info.from_language = MBSTRG(language); + MBSTRG(illegalchars) = 0; + detected = php_mbstr_encoding_handler(&info, array_ptr, res TSRMLS_CC); MBSTRG(http_input_identify) = detected; @@ -3864,8 +3869,13 @@ if (ret != NULL) { MBSTRG(illegalchars) += illegalchars; - efree(ret->val); - RETURN_BOOL(illegalchars == 0); + if (illegalchars == 0 && strncmp(string.val, ret->val, string.len) == 0) { + efree(ret->val); + RETURN_TRUE; + } else { + efree(ret->val); + RETURN_FALSE; + } } else { RETURN_FALSE; } [php-5.2.0RC5_mb_check_encoding.patch] diff -ur php-5.2.0RC5.orig/ext/mbstring/mb_gpc.c php-5.2.0RC5/ext/mbstring/mb_gpc.c --- php-5.2.0RC5.orig/ext/mbstring/mb_gpc.c 2006-01-01 21:49:45.000000000 +0900 +++ php-5.2.0RC5/ext/mbstring/mb_gpc.c 2006-10-07 11:06:26.014433000 +0900 @@ -154,6 +154,8 @@ info.num_from_encodings = MBSTRG(http_input_list_size); info.from_language = MBSTRG(language); + MBSTRG(illegalchars) = 0; + detected = _php_mb_encoding_handler_ex(&info, array_ptr, res TSRMLS_CC); MBSTRG(http_input_identify) = detected; @@ -346,6 +348,7 @@ } if (convd != NULL) { + MBSTRG(illegalchars) += mbfl_buffer_illegalchars(convd); mbfl_buffer_converter_delete(convd); } if (val_list != NULL) { diff -ur php-5.2.0RC5.orig/ext/mbstring/mbstring.c php-5.2.0RC5/ext/mbstring/mbstring.c --- php-5.2.0RC5.orig/ext/mbstring/mbstring.c 2006-09-24 16:10:31.000000000 +0900 +++ php-5.2.0RC5/ext/mbstring/mbstring.c 2006-10-07 10:32:33.064433000 +0900 @@ -933,7 +933,10 @@ MBSTRG(current_http_output_encoding) = MBSTRG(http_output_encoding); MBSTRG(current_filter_illegal_mode) = MBSTRG(filter_illegal_mode); MBSTRG(current_filter_illegal_substchar) = MBSTRG(filter_illegal_substchar); - MBSTRG(illegalchars) = 0; + + if (!MBSTRG(encoding_translation)) { + MBSTRG(illegalchars) = 0; + } n = 0; if (MBSTRG(detect_order_list)) { @@ -4053,8 +4056,13 @@ if (ret != NULL) { MBSTRG(illegalchars) += illegalchars; - efree(ret->val); - RETURN_BOOL(illegalchars == 0); + if (illegalchars == 0 && strncmp(string.val, ret->val, string.len) == 0) { + efree(ret->val); + RETURN_TRUE; + } else { + efree(ret->val); + RETURN_FALSE; + } } else { RETURN_FALSE; } _______________________________________________ PHP-dev mailing list PHP-dev@... http://ml.php.gr.jp/mailman/listinfo/php-dev |
|
|
[PHP-dev 1347] Re: mb_check_encoding() のテスト廣川です。
レスポンスが遅くなり申し訳ありません。 動作確認および修正いただきありがとうございます。 コードの内容を確認し,PHP 5.2,PHP 4.4系のCVSにコミットしておきました。 komura wrote: > komura です。 > > 前のメールで報告した以下の2点について検証してみました。 > PHP 内部の動作自体にはそれほど詳しい訳ではありませんので、間違い等がある > かもしれません。 > _______________________________________________ PHP-dev mailing list PHP-dev@... http://ml.php.gr.jp/mailman/listinfo/php-dev |
| Free Forum Powered by Nabble | Forum Help |