このところ、PHPのプログラミングを猛烈に勉強中だ。
Microsoft Visual StudioのC#を使ってASP.NET ASPプロジェクトでWEBサイトを良く作るのだが、その中でPHPも混在させている。
ところが、先日、何故かPHPで出力したWEBページが文字化けするのだ。
もう化け化けに化けている。
その解決のために、PHPの文字化けに関して世間で知られている各種の対策を行ったのだが文字化けは解消しなかった。
でも、その後必死で考えていたら無事に文字化けが解消したので、それらの過程を備忘録としてこの記事にまとめておいた。
では、本題に入ろう。
WordPressのブログサイト
文字化けの対策は後半で説明するとして、まずは、ワテがPHPを使っていたのはWordPressのテーマをカスタマイズする実験をしていた時である。
このwareko.jpのサイトもそうだが、WordPressでブログサイトを開設しているのだが、そのWordPressがPHPで記述されているので、PHPを習得してWordPressのカスタマイズに挑戦しているのだ。
PHPなどのキーワードで当ページにお越し頂いた皆さんであれば、WordPressをご存じでは無いと言う人は少ないと思う。
でも、念のために一般の人向けに説明するならWordPressと言うのはオープンソースのブログソフトウェアだ。例えば当ページもそのWordPressで作成して表示している。
WordPressをレンタルサーバーにインストールしておけば、こんな風に簡単にWEBページが生成出来る。
- 上部にメニューを配置する
- 検索機能を付ける
- サイドバー領域にカテゴリーを表示する
- 最近の投稿記事を表示する
- アクセス数の多い人気記事ランキングをサイドバーに表示する(追加の無料プラグインを使うなど)
- Googleアドセンス広告を簡単に埋め込める(そういう機能を持つテーマを利用した場合)
など、各種の便利機能がある。
WordPressの開発言語はPHPやJavaScriptが使われている。WordPressでは、ブログ記事や写真などのデータを管理するために、同じくオープンソースのMySQLと言う有名なデータベース管理システムも一緒にインストールして使う。
歴史的には、b2/cafelogというソフトウェアがあり、その後継として開発されて 2003年5月27日に初版がリリースされたとWikipediaに書いてある。本日(2016/9/4)の時点で Ver 4.6.0 だ。
WordPressはブログサイトだけでなく、普通の企業向けWEBサイトなども作成が可能だ。
WordPressのテーマを作成する
そういう風にWEBサイトの見栄えを変える仕組みがWordPressにはあり、自分で作成した追加のソフトやデータをインストールすれば画面のレイアウトとか色合いとかフォント種類とか、兎に角WEBページの見栄えに関する設定を何でも変える事が可能になる。
そのソフトやデータの一式をWordPressの世界ではテーマ(Theme)と呼んでいる。
サイトの見栄えを変えても表示する文書や写真などのデータはMySQLデータベースが管理しているので、表示される情報は基本的には同じであり、見た目を大きく変化させる事が出来るのがテーマの機能だ。
テーマには市販されている有料のものや、個人や企業が無料で提供している無料テーマなどがあり、自由にWordPressにインストールして利用出来る。
WordPressの管理画面にログインするとダッシュボードと呼ばれる専用の操作画面が開く。
そのダッシュボードの中には、テーマのダウンロードやインストールの機能もあるので、簡単に各種のテーマを試して切り替える事が可能だ。
ワテも自分でWordPressのテーマ作成に挑戦しているのである。
WordPressはPHPで書かれている
PHPとは、松下幸之助によって創設された出版社・民間シンクタンクのPHP研究所と言う意味もあるが、プログラミングの世界では、
PHP: Hypertext Preprocessor – Webページ作成のために用いられるプログラミング言語
と言う意味である。
皆さんがパソコンやスマホのWEBブラウザーを使って、このワテのサイトを閲覧する。
その時には、ワテが契約しているレンタルサーバー会社にあるレンタルサーバーに、ワテはWordPressをインストールしているので、そこでPHPのプログラムが動いて皆さんのWEBブラウザー向けにHTML文書を生成して送信するのだ。
そのHTML文書を皆さんのWEBブラウザーで表示する事によって、今このワテのページが皆さんのパソコンやスマホに表示されている。
このようにレンタルサーバー上でPHPは動かすので、サーバーサイド言語と呼ばれる。
最も簡単なPHPプログラム
例えば、単純に文字を出力するPHPプログラムは以下のようになる。
<?php echo "何故か、日本語が化ける。"; ?>
ただし、正式なHTMLファイルはこれだけではダメで、通常は以下のようなタグが必要になる。
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <meta charset="utf-8" /> </head> <body> 何故か、日本語が化ける。 </body> </html>
タグというのは <tag> … </tag> のように記述しているものを指す。
WEBサイトの文章は <body> … </body> タグの間に記述するのが一般的だ。
従って、PHPプログラムでは、最低でもこれらのタグを埋め込んだ上図のようなHTMLを生成する必要がある。それらのタグも echo 関数を使って出力しても良いし、あるいは直接文字列として埋め込んでも良い。
具体的には、下図のようなPHPプログラムを書けば良いだろう。
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <meta charset="utf-8" /> </head> <body> <?php echo "何故か、日本語が化ける。"; ?> </body> </html>
まあ、これならわざわざ echo を実行せずに、直接文字列を埋め込んでも良いが。
さて、そのHTMLファイルを皆さんのWEBブラウザーで表示すると、下図のように表示出来るのだ。
何故か、日本語が化ける。
ところが、
何故か、日本語が化けるのである。
こんな感じ。
���̂��A���{�ꂪ�������B
もう化け化けやがな。
ワテが使っているWindows10パソコンで、Chrome, Firefox, Edge, Internet Explorer どれで表示しても化ける。
それで、ネットを検索してPHPの文字化けの原因を調べたのだが、多くのサイトで説明されている文字化け対策は以下の通り。
UTF-8文字コードの指定を行う(header関数)
<?php header("Content-Type: text/html; charset=UTF-8"); echo "何故か、日本語が化ける。"; ?>
このようにやってみたのだが、それでも化ける。
php.iniで文字コードの設定をする
php.iniで以下のように記述すると文字化けを解消出来るという説明も多く見かける。
Default_charset = "utf-8"
これでも化ける。
おかしい。原因が分からん。
もう八方塞がりで行き詰ってしまった。
う~ん、分からん
でも、この手の問題には必ず原因はある。
ここで諦めてはPHPの技術が身に付かない。
プログラミング上達の基本は、デバッグで諦めない事だ。
問題解決のためには、スッポンのように喰らい付くくらいの執念が必要だ。
50本入りでこの価格なら試しに買っても良いかも。
なお、このスッポンドリンクを飲むとPHPが猛烈に上達するかどうかは不明だ。
mb_convert_encoding() 関数で文字コード変換してみたがその前に既に化けている
文字コードがおかしいのかと思ってPHPの mb_convert_encoding() と言う関数で文字コードを変換してみた。
$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");
Visual Studio のPHPデバッガーでブレークポイントをセットして、変換結果などを確認してみたが、そもそも $a に全角文字を代入している時点で文字化けしている事が判明。
何でやねん⁉
分からん…
少し横になって瞑想していたら、閃いた‼
ファイルのSHIFT JISが原因だった。
Visual Studioの場合、どんな言語でプログラミングをする場合でもそのソースコードをファイルに保存する場合には文字コードを指定出来る。
デフォルトでは、確か ANSIあるいはShiftJISなどになっていると思う。
確か、言語によっても異なるかもしれない。
さて、PHPの場合には、ワテが試した限りでは Visual Studio 2015 Community では、新規にPHPファイルをプロジェクトに追加するとその文字コードはシフトJISだった。
エンコード
日本語シフトJIS – コードページ 932
という奴だ。
さらに改行コードも指定出来て、
Windows | CR LF |
Macintoch | CR |
Unix | LF |
のどれかを選択出来る。
さて、PHPの場合には、 このエンコードのシフトJISが曲者だった。
これが原因で化けていたのである。
このファイルのエンコーディングを、
に変更してファイル保存すると文字化けは解消した。
ちなみに、Unicodeでも以下の二種類でファイル保存すると
何も表示出来なかった。
HTMLのソースを見ても、文字データが埋め込まれていないので echo が実行されていなかった。
何でやねん?
PHPのデバッガーでブレークポイントを置いてみたが、これらの二つのエンコーディングの場合にはデバッガがブレークしなかった。
なので、ファイルエンコーディングがUTF-8以外の場合にはVisual StudioのPHPデバッガが正常に動作しないようだ。
なお他の文字コードの場合の挙動は以下の通り。
SJIS, EUC で保存した場合には文字化けはするけれどもデバッガは正常動作した。
JISで保存した場合には、
Parse error: syntax error, unexpected 'F' (T_STRING), expecting ',' or ';' in E:\Desktop\test.php on line 4
と言うPHPのエラーが出た。
まとめ
Visual Studio の PHP で文字化けが解消しない場合には、phpファイルのエンコーディングを
に設定すると直ると思う。
それ以外の文字コードを設定すると、文字化けするかあるいは PHP Tools for Visual Studio extension が正常に動作しなかった。
幸せのPHPか。
PHPをやるならMySQLも一緒に勉強すると効率的だ
コメント