PHP5.6でSJISのサイトが文字化け

PHP

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のマニュアルを見てみると

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 に空文字列を指定することは、おすすめしません。

https://www.php.net/manual/ja/ini.core.php#ini.default-charset

うーん推奨されていませんね。
後はSJISのページを作成するphpのプログラムの先頭にheader()で

<?php header(“Content-Type:text/html;charset=Shift_JIS”);?>

の指定をしてあげればよいのですが、Sift_JISでサイトを作成するといろいろ問題がおきやすいのでおとなしくutf-8で作りなさいという事なのでしょうね

コメント

タイトルとURLをコピーしました