[PHP-dev 1446] mbstring.internel_encoding の値が反映されない場合がある件(2)

KATOH Yasufumi karma @ jazz.email.ne.jp
2009年 3月 2日 (月) 13:29:23 JST


加藤泰文です.

(続き)

デバッガで追ってみました.全部追ってないので,かなりこう動くのだろう,
という想像が入ってますが..

Apache 起動後,

1. .htaccess が検出されると,OnUpdate_mbstring_internal_encoding へ飛
   ぶ.ここで new_value の値をデバッガで見てみると,"UTF-8" となってお
   り,確かに .htaccess は読み込まれているっぽいです.先の例で
   mb_get_info() で設定を取得すると,internal_encoding の値は "UTF-8"
   と正常になっていたのは,ちゃんと値が取得出来ているからだと思います.

2. ここで encoding_translation が指定されていると,mb_gpc.c 内の 
   mbstr_treat_data に処理が飛びます.ここで変換先のエンコーディングを
   決定しているっぽいですが,ここではグローバル変数 mbstring_globals
   の internal_encoding を見ているようで,この時点では
   mbstring_globals.internal_encoding の値は更新されておらず,例だと
   "EUC-JP" のままなので,その後の変換処理で(?) 入力文字列が EUC-JP へ
   変換されてしまい,結果,出力が文字化けしてしまうようです.

3. その後,グローバル変数は更新されるので,次にアクセスした際は,正常
   にエンコード変換される (or されない) のですが,一度,別設定が効いて
   くる他のディレクトリに移動すると,グローバル変数の値がそのディレク
   トリの値にリセットされるので,再度文字化けが発症します (=
   internal_encoding の値が .htaccess 以外の値に).

以上のように想像なのですが,エンコーディング変換が有効な際,.htaccess
の値でグローバル変数が更新されていれば,問題なく動くのだと思います.と
りあえず,きっと他の動きがめちゃめちゃになるのでしょうけど,以下のよう
にしてみると,文字化けは解消しています (今回の例のプログラム以外検証し
てません&使った関数もこれかなーという想像の適当 ^^;).

--- mbstring.c.orig	2009-03-02 13:02:25.000000000 +0900
+++ mbstring.c	2009-03-02 13:03:03.000000000 +0900
@@ -745,6 +745,7 @@
 		 * 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. */
+		_php_mb_ini_mbstring_internal_encoding_set(new_value, new_value_length TSRMLS_CC);
 		return SUCCESS;
 	}
 }

-- 
==============================================
((((    加藤泰文
○-○                karma @ jazz.email.ne.jp
==============================================
 (Web Page) http://www.ne.jp/asahi/ka/to/
==============================================


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