TenForward

技術ブログ。はてなダイアリーから移転しました

PHP の mbstring で encoding_translation 有効の時,.htaccess の internal_encoding の値が反映されない事がある (2)

先の適当なパッチはさすがにマズいかのー,という気がした._php_mb_ini_mbstring_internal_encoding_set 内で,条件分岐で internal_encoding の指定の有無をチェックして,指定がない場合,mbstring.language の設定により,internal_encoding を決定してます.

今回の問題で OnUpdate_mbstring_internal_encoding 内で初期化以外のステージでこの関数を使ったときに,この条件分岐の指定がない方にいくパターンを思いつかないのですが,まあ無用な処理はないほうが良いってことで,

--- mbstring.c.orig	2009-03-02 13:02:25.000000000 +0900
+++ mbstring.c	2009-03-11 18:45:12.000000000 +0900
@@ -745,6 +745,8 @@
 		 * 2. mbstring.language directive is processed in per-dir or runtime
 		 * context and 3. call to the handler for mbstring.language is done
 		 * after mbstring.internal_encoding is handled. */
+		MBSTRG(internal_encoding) = mbfl_name2no_encoding(new_value);
+		MBSTRG(current_internal_encoding) = MBSTRG(internal_encoding);
 		return SUCCESS;
 	}
 }

(追記) このパッチだと ini_set で internal_encoding が設定された場合,ここを通らないので,やはりエンコーディング変換の部分で文字化けします.私の知識,力ではどーしようもないので,ここは偉い人に任せましょう.(^_^;)

(追記2) 結局,[PHP-dev 1453] Re: mbstring.internel_encoding の値が反映されない場合がある件(2) で小泉さんがパッチを作成してくださっています.(上のパッチはダメダメ ^^;)

(追記3) 入力エンコーディング変換は ini_set では制御出来ないんですね.php-dev でも教えてもらいました.デバッガで追っていてそういう動きをしていたので確認しようとしたら,その前に教えていただけました.QUERY_STRING の値を処理する時点では,スクリプトの中身は実行されてないため.