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

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


加藤泰文です.

mbstring 使用時に internal_encoding を .htaccess で指定していた際 (か
つ,encoding_translation On の時) の問題と思われる現象に行き当たりまし
たので,少しデバッガで追ってみました.相変わらず,PHP 内部の構造とか作
法は素人ですので,ボケた事を言っていたらご容赦ください&長文ご容赦ください.

# あと,こんな設定せずに,ちゃんと設定したらええやん,というのはそうで
# すが,ここではそれは置いといてください.

 ./configure \
        --with-apxs2=/usr/local/apache2/bin/apxs \
        --with-zlib \
        --enable-mbstring \
        --enable-mbregex \
        --enable-zend-multibyte \
        --with-openssl
という風に構築した PHP 5.2.9 です (5.2.8 でも同様でした).5.2.6 以前は
起きていなかったようです.

php.ini は以下.
 mbstring.language = Japanese
 mbstring.internal_encoding = EUC-JP
 mbstring.http_input = auto
 mbstring.http_output = pass
 mbstring.encoding_translation = On
 mbstring.detect_order = auto
 mbstring.substitute_character = none;
 mbstring.func_overload = 0
 mbstring.strict_encoding = Off

ここで,とあるディレクトリには .htaccess を置き,
 php_value mbstring.language Japanese
 php_value output_handler mb_output_handler
 php_flag mbstring.encoding_translation 1
 php_flag magic_quotes_gpc 0
 php_value mbstring.internal_encoding UTF-8

という風に設定します.

とりあえずブラウザ上で再現させる方法を書きます.サンプルプログラムは以
下.ソースは UTF-8 で記述.

 <html>
 <body>
 <?php
 if($_REQUEST["message"] != ""){
     print "メッセージ<br>\n";
     print "encoding: " . mb_detect_encoding($_REQUEST["message"])  . "<br>\n";
     print htmlspecialchars($_REQUEST["message"]) . "<br>\n";
 }
 ?>
 <form action="test.php">
 <input type="text" name="message" value="<?php htmlspecialchars($_REQUEST["message"])?>">
 <input type="submit" value="送信">
 </form>

 <pre>
 <?php
 print_r(mb_get_info());
 echo phpversion();
 ?>
 <pre>
 </body>
 </html>

(再現その1)
1. まず上記ページにアクセスします.
2. ブラウザに表示させたまま,一度 apache を落とします.
3. httpd -X で apache を起動します.(かならず発現するようにシングルプ
   ロセスモード)
4. フォームに日本語を入力し,submit します.
5. 前画面で input に入力した文字列のみ文字化け.mb_detect_encoding は
   EUC-JP となります.mb_get_info で表示させた internal_encoding は
   UTF-8 で正常です.
6. この後は (http -X で起動している限りは) 何度アクセスしても文字化け
   は起こらず,正常です.

(再現その2)
1. (再現その1) の 6 でその後は何度アクセスしても正常と書きましたが,こ
   こで一度,.htaccess のないディレクトリへ遷移して,その後,この
   .htaccess の存在するディレクトリへ戻ります.つまり
   .htaccess 有 -> 無 -> 有 と一度外に出て戻ります.
2. 戻る際は http://server/dir/test.php?message=あいうえお みたいに直接
   パラメータ指定します.
3. 文字化け.mb_detect_encoding は EUC-JP,mb_get_info は UTF-8.

つまり internal_encoding に関しては,
- Apache 起動直後の (Apache 各プロセスの) 最初のアクセスでは .htaccess
  の内容は反映されない.
- 起動直後でなくても,一度 .htaccess のないディレクトリへ遷移して,ま
  た戻ると .htaccess の内容は反映されない.
という現象です.

長文ですので,あとは別便で.

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


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