[PHP-users 8444] Re: レスポンスヘッダを出力すると自動変換してくれない

OHTA Hideki php-users@php.gr.jp
Fri, 5 Jul 2002 19:41:46 +0900


太田です。

At 18:12 02.7.5 +0900, 桝形 誠二 wrote:
>レスポンスヘッダを出力すると自動変換してくれない現象に
>出くわしました。

私も同じような現象がありました。

以前は問題なかったスクリプトが、Apache のセキュリティホールで
Apache 1.3.26 + php 4.2.1 になったときから文字化けが起こりました。
(たしか、updateの前は Apache 1.3.23 + php 4.1.1 という環境だったと思う)

以下のスクリプトを書いて実験してみました。

test.php
<?php
    ob_start('mb_output_handler');
    $res1 = mb_internal_encoding('UTF-8');
    $res2 = mb_http_output('EUC-JP');
    if ($_GET["header"]) {
        Header("Content-type: text/html; charset=EUC-JP");
    }
    Header("X-Moe: himitsu");
?>

(iCab 2.8.1Jを使ってHTTPリクエスト、返答を記録)
サーバは Apache 1.3.26 + php 4.2.1 (Linux) です。
phpファイルはUTF-8で記述されています。
UAにはEUC-JPで出力するのが期待される動作です。

Connecting to localhost  Port: 80 
>GET /test.php?header=on HTTP/1.1 
>Host: localhost 
<200 OK
<Server: Apache/1.3.26 (Unix) mod_gzip/1.3.19.1a mod_bwlimited/1.0
PHP/4.2.1 mod_log_bytes/0.3 FrontPage/5.0.2.2510 mod_ssl/2.8.9
OpenSSL/0.9.6b 
<Content-Type: text/html; charset=EUC-JP 
<X-Moe: himitsu

(http://localhost/test.php?header=on の実際の内容はUTF-8なので文字化けする)
 
Connecting to localhost  Port: 80 
>GET /test.php HTTP/1.1 
>Host: localhost
<200 OK 
<Server: Apache/1.3.26 (Unix) mod_gzip/1.3.19.1a mod_bwlimited/1.0
PHP/4.2.1 mod_log_bytes/0.3 FrontPage/5.0.2.2510 mod_ssl/2.8.9
OpenSSL/0.9.6b 
<Content-Type: text/html;charset=EUC-JP 
<X-Moe: himitsu

(http://localhost/test.php の実際の内容はEUC-JPなので正しく表示する)

となり、前者のようにContent-Typeヘッダフィールドを出力した場合は、
UTF-8のまま変換されていませんでした。

後者では X-Moe なる謎のヘッダフィールドが出力されていますが、
期待通りに動作し、 EUC-JP で出力されます。
また、この場合でも、 Content-Type に charset パラメタが付加されています。

ということで、 mb_http_output() で出力charsetを設定している場合は
わざわざ header() を使って charset パラメタを設定する必要はないかと
思います。
-- 
太田 秀樹 mailto:hiji@tomeibus.com
東名バスドットコム: http://www.tomeibus.com