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

Yasuo Ohgaki yohgaki @ ohgaki.net
2009年 5月 29日 (金) 15:54:08 JST


大垣です。

この件、小泉さんが詳しいはずです。記憶で書いているので間違っている
可能性があるので予めご了解ください。 php.ini設定のコードは結構アバウト
に出来ていて、あっちを立てたらこっちが立たず、のようなコードになって
いたと思います。

ホスティングなどの場合、.htaccess による設定に頼る事になるので期待ど
おり動作しないと困りますよね....

時間があればコードを見て確認したいのですが、残念ながらいっぱいいっぱいで....

# と、小泉さんがメールに気付くかも知れないので返信してみました。

--
Yasuo Ohgaki

2009/03/02 13:27 KATOH Yasufumi <karma @ jazz.email.ne.jp>:
> 加藤泰文です.
>
> 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 mailing list
> PHP-dev @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-dev
>


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