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