Webページの文字化けの検討・・・ロケールって何?
今日もNetBeansにて「PHP逆引きレシピ」のサンプルコードを教材にPHPの勉強を進めています。
今日のお題は第9章9.2「文字化け」です。ここのサンプルコードは頭の体操に持って来いですね。.php ファイルそのものの文字エンコードと、<meta>文の charset= で指定している文字エンコードと、ブラウザの文字エンコードと、テキストボックスの入力値をブラウザが送信する文字エンコードと、サーバー側のデフォルトの文字エンコードと、mb_convert_encoding() 関数で変換した文字エンコードと、mb_http_output() 関数で変換した出力の文字エンコードと、の関係やプロセスを理解できます。
しかし、頭が混乱して一時はパニクっていました。こんなことですから、文字エンコードは UTF-8 で統一しよう!・・・なんて話になるんでしょうね。私もそう思います。
さて、問題はサンプルコード 04.php です。元のままですとロケールの設定に成功したのか否か良くわかりません。そこで次のように書き換えてみました。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>日時の文字化け</title> </head> <body> <?php //ロケールの初期値を表示します。 echo setlocale(LC_ALL, 0) . '<br /><br />'; # ロケールでの文字エンコード指定をわざとEUC-JPにします。 //setlocale(LC_ALL, 'Japanese_Japan.20932'); // WindowsでEUC-JPの場合 # '','C','Japanese_Japan.932','Japanese_Japan.20932' //Windows if (!setlocale(LC_ALL, 'Japanese_Japan.20932')){ echo "<br />false<br />"; }else{ echo "<br />success<br />"; } # 現在のロケール設定を表示します。 echo setlocale(LC_ALL, 0) . '<br /><br />'; echo '現在の曜日: ' . strftime('%A') . '<br />'; echo '現在の月: ' . strftime('%B') . '<br />'; echo '現在の日時: ' . strftime('%c') . '<br />'; # ロケールを元に戻したい if (!setlocale(LC_ALL, 'C')){ echo "<br />false<br />"; }else{ echo "<br />success<br />"; } # 現在のロケール設定を表示します。 echo setlocale(LC_ALL, 0) . '<br /><br />'; echo '現在の曜日: ' . strftime('%A') . '<br />'; echo '現在の月: ' . strftime('%B') . '<br />'; echo '現在の日時: ' . strftime('%c') . '<br />'; ?> </body> </html>
で、検討結果です。
<検討結果>
・Apache 起動直後の実行結果と2回目以降の実行結果が微妙に違う。
・ロケールを完全にデフォルト状態に戻す方法が見つからない。
・文字化けを起こす原因となり得る事は理解できるが、いったい何に使うのかがよく分からない。
ロケールを参照する関数が存在するので配慮が必要な気もしますが、グローバルサイトを目指すならロケールでローカライズするようなコードはあまり書きたくないですね。