dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

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回目以降の実行結果が微妙に違う。
ロケールを完全にデフォルト状態に戻す方法が見つからない。
・文字化けを起こす原因となり得る事は理解できるが、いったい何に使うのかがよく分からない。

ロケールを参照する関数が存在するので配慮が必要な気もしますが、グローバルサイトを目指すならロケールローカライズするようなコードはあまり書きたくないですね。