CGI版のPHPはheader関数が効かず文字化けする場合がある
昨今、PHPはバージョンが煩雑すぎるので、大抵の場合、共用サーバーはCGI版のPHPで動作するようになっています。
しかし、CGI版のPHPだと、PHP内からヘッダ情報を送信してもApache側でヘッダが上書きされてしまうという弊害もあります。
PHPソースコードの例
<?php header('Content-type: text/html; charset=utf-8'); echo 'あいうえお'; exit; ?>
CGI版PHPの結果例
Content-Type: text/html
縺ゅ>縺�∴縺� ←文字化けする
WebサーバーがApacheの場合の解決方法
当サイトで紹介している .htaccessで簡単文字化け対策 のように、AddDefaultCharsetでも文字化けは解消できますが、
他にもhttpのヘッダ情報を操作したいこともあり得るので、ここでは.htaccessで特定のファイルだけヘッダ情報を書き換える方法を紹介します。
.htaccess
# test.php だけにヘッダ情報をセットする例
<Files test.php>
Header set Content-Type 'text/html; charset=utf-8'
</Files>
.htaccessを設置したあとのCGI版PHP実行結果例
Content-Type: text/html; charset=utf-8
あいうえお ←文字化けせずに表示される
補足
2019年12月14日追記
共用サーバーの .htaccessで「AddType application/x-httpd-php .html」を設定している場合は逆に、.htaccessの Header set Content-Typeは効かず、PHP内のheader関数が効くという不思議な現象に遭遇しました。
使用した共用サーバーのPHPバージョンが拡張子phpだと7.3で、拡張子htmlだと5.3になるので、この辺りも関係しているのかもしれません。何か法則が分かったらまた追記します。