PHPのバージョンを5.2から5.6にあげたところ、いままで正常に表示されていたサイトが文字化けするようになりました。
サイトの文字化け対策として一般的な方法としてhtml中のmetaタグにcharsetで明示的に文字コードを示してあげる方法があります。
これですね→ <meta charset=”utf-8″>
今回問題となったサイトはいろいろ都合上SJISで作成しており、metaタグには
<meta charset=”Shift_JIS”>
と設定してありました。
htmlファイルであればこれでOKなのですがPHPの場合、php.iniのdefault_charsetに指定してある文字コードに固定されてしまうようです。PHP5.6未満の場合はdefault_charsetが未指定の場合は指定無し(no value)となりhtml中のmeta charsetに準じて判断するのですが、PHP5.6以上の場合は未指定の場合、utf-8となったため、metaタグの指定とは関係なくutf-8と判断されるようになりました。
対応策
てっとりばやく今までと同じ動作にさせたい場合はphp.iniの default_charset に指定無し「空文字」を指定しましょう。
default_charset = “”
※そのほか “none”とかの指定でもうまくいきました。
php.iniのマニュアルを見てみると
https://www.php.net/manual/ja/ini.core.php#ini.default-charset
default_charset
string
“UTF-8” がデフォルトの値です。 htmlentities() や html_entity_decode() そして htmlspecialchars() でencoding
パラメータを省略した場合は、このデフォルト値を利用します。 また、default_charset
の値は、 iconv 関数でiconv.input_encoding
、iconv.output_encoding
、iconv.internal_encoding
が未設定の場合や、 mbstring 関数でmbstring.http_input
mbstring.http_output
mbstring.internal_encoding
が未設定の場合のデフォルトとしても用いられます。
すべてのバージョンの PHP は、PHP から送信する Content-Type ヘッダのデフォルト値としてこれを使います。 ただし、header() で上書きされている場合は別です。default_charset
に空文字列を指定することは、おすすめしません。
うーん推奨されていませんね。
後はSJISのページを作成するphpのプログラムの先頭にheader()で
<?php header(“Content-Type:text/html;charset=Shift_JIS”);?>
の指定をしてあげればよいのですが、Sift_JISでサイトを作成するといろいろ問題がおきやすいのでおとなしくutf-8で作りなさいという事なのでしょうね
コメント