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