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