SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】default_mimetype、default_charset

問題

phpで出力している画面で、Content-Typeにcharsetが付いてないみたい。

charsetは付けた方がいいらしいけど、どうしよう?

http-header-no-charset

答え

HTML(text/html)やプレーンなテキスト(text/plain)は、文字コードもきちんと明示することが推奨されている様子。

HTTP1.1では、デフォルトの文字コードはISO-8859-1。ISO-8859-1以外のWebサイトなら、ブラウザにデフォルトの文字コードで表示されてしまわないように、charsetを送出しておきたい。


phpの場合、以下の設定項目があり、何かしらの出力をしたときに、Content-Typeがtext/htmlになっているのは、phpのおかげ。

名前 デフォルト
default_mimetype “text/html”
default_charset “”

デフォルトでは「Content-Type: text/html」、charsetなし。

UTF-8のWebサイトならdefault_charsetはUTF-8にしてよいでしょう。

php.iniに設定はもちろん可能

default_charset = "UTF-8"

いろいろな文字コードのWebサイトが混在していてphp.iniで設定したくない場合は他の箇所でも。

.htaccess に書くとしたら、

php_value default_charset utf-8

phpスクリプト内に書くとしたら、

ini_set('default_charset', 'utf-8');

ところで、このdefault_mimetypeとdefault_charsetの設定、自分でContent-Typeを送出した場合にも影響するかどうかなど、動きが気になるところ。

default_charset=”UTF-8″な環境で試した結果では、

何もしない → Content-Type: text/html; charset=UTF-8

自分で header(‘Content-Type: text/html’) した → Content-Type: text/html; charset=UTF-8

自分で header(‘Content-Type: text/plain’) した → Content-Type: text/plain; charset=UTF-8

自分で header(‘Content-Type: text/html; charset=EUC-JP’) した → Content-Type: text/html; charset=EUC-JP

自分で header(‘Content-Type: application/json’) した → Content-Type: application/json

text/*なMIME Typeのときで、charsetの指定がないときに追加してくれているようだ。

phpのソースを確認したところ、MIME Typeの先頭5文字が”text/”かどうかで処理を変えているところがあったので、そういうことなのでしょう。

参考

php.ini – default_charset

関連するメモ

コメント(1)

ku 2023年9月6日 15:13

めちゃめちゃ古い記事ですが検索からこちらにたどり着き、さくっと問題を解決できました。ありがとうございます!