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_charsetstring
“UTF-8” がデフォルトの値です。 htmlentities() や html_entity_decode() そして htmlspecialchars() でencodingパラメータを省略した場合は、このデフォルト値を利用します。 また、default_charsetの値は、 iconv 関数でiconv.input_encoding、iconv.output_encoding、iconv.internal_encodingが未設定の場合や、 mbstring 関数でmbstring.http_inputmbstring.http_outputmbstring.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で作りなさいという事なのでしょうね


コメント