web関連

【PHP】webサイトが文字化けした時に試した事

【PHP】webサイトが文字化けした時に試した事

とある名前も聞いたことの無いレンタルサーバーを使ってるお客さんでphp5.6からphp7.2にあげたら文字化けした時の備忘録

以前も似たような現象があった

過去にはそもそもファイル自体がshift-jisで作成されてて<head>タグ内で文字コードの宣言自体が意味をなさなかったのでphpのバージョンを5.5にして使い続けたり(php5.6以上だとshift-jisと相性が悪いみたいで文字化けする)
utf-8で保存し直して再度あげたら直ったことあったけど今回はそもそもサーバーに問題があるっぽかった

実際に試した事

header()関数で文字コード指定

phpファイルの一番上に記述

<?php
header("Content-Type: text/html; charset=UTF-8"); 
?>

php.iniで文字コードを指定

php.ini作って以下のコードを書いてアップロード

cgi.force_redirect = 0 
Default_charset = "utf-8"

サーバーによって違うのか、php.iniを設置した段階で
「On → Off」「EUC-JP → no value」に変更された(初期化?)

サーバーによっては「cgi.force_redirect」が有効になっててphp.iniを設置すると「Internal Server Error(500)」発生した
「cgi.force_redirect = 0」をphp.iniで指定したら直った、注意

.htaccessで文字コードの変更

php_flag mbstring.encoding_translation off
php_value default_charset "UTF-8"

php_value, php_flagが使えないサーバーなんかだと「Internal Server Error(500)」が起きるから起きたらphp.iniかheader関数使った方がいい(管理画面で設定できればそれに越したことないけど)

まとめ

サーバーによってもサーバー管理画面から変更をかけられたり、php.iniで変更かけられたり.htaccessでもできたりするみたいだから一通り試してみてそれでも文字化けするならファイルの文字コードが原因だと思うその辺はサーバー会社によって異なるみたいだから調べる必要性がありそう

今回僕が当たった件は、結局のところwordpressのプラグインが原因で文字化けしてて上記で解決できなかった
せっかく調べたのに…

参考1

▼PHPプログラムで日本語が文字化けした時の対処法
https://sole-color-blog.com/blog/841/

参考2

▼【ワテの失敗】PHPの文字化けの原因が分からない【解決‼】
https://www.wareko.jp/blog/php-garbled-characters-has-been-solved

メモ:文字コード調べる

参考にしたサイトで使われてて便利そうだったのでメモ
文字コードに何を使われているかどうか判別に使えそう

<?php 
$a ="何故か、日本語が化ける。";
$a1 = mb_convert_encoding($a, "EUC-JP");
$a2 = mb_convert_encoding($a, "SJIS");
$a3 = mb_convert_encoding($a, "UTF-8");
$a4 = mb_convert_encoding($a, "UTF-16");
$a5 = mb_convert_encoding($a, "UTF-16BE");
$a6 = mb_convert_encoding($a, "UTF-16LE");
$a7 = mb_convert_encoding($a, "UTF-32");
$a8 = mb_convert_encoding($a, "ASCII");
$a9 = mb_convert_encoding($a, "CP932");
$a10 = mb_convert_encoding($a, "JIS");
echo "$a". $a ."<br>";
echo "$a1". $a1 ."<br>";
echo "$a2". $a2 ."<br>";
echo "$a3". $a3 ."<br>";
echo "$a4". $a4 ."<br>";
echo "$a5". $a5 ."<br>";
echo "$a6". $a6 ."<br>";
echo "$a7". $a7 ."<br>";
echo "$a8". $a8 ."<br>";
echo "$a9". $a9 ."<br>";
echo "$a10". $a10 ."<br>";
?>

サーバーによって仕様が結構違う事がわかった