20070903

PHPのdate()関数で文字化け

PHPの内部文字エンコーディングがSJISの場合に

echo date('Y年m月d日');

を実行すると

2007・09月03日

のように文字化けしてしまう。 これはShift-JISコードにおいて"年"という文字は2バイト目がasciiの"N"と同じで、これがdate()関数のformat指定子であるのが原因である。

EUC-JPやUTF-8では2バイト目以降にascciコードは出てこないので(参考:文字コードについて)、以下のようなコードでこの問題を解決できる。

function myDate(string $format, $time)
{
 $encoding = mb_internal_encoding();
 mb_internal_encoding("UTF-8");
 $formatUtf8 = mb_convert_encoding($format,'UTF-8', $encoding);
 $resultUtf8 = date($formatEncoded, $time);
 $result = mb_convert_encoding($result, $encoding, 'UTF-8');
 mb_internal_encoding($encoding);
 return $result;
}

2 件のコメント:

Matsukubokkuri さんのコメント...

便利なコードスニペットありがとうございます。
変数が2カ所間違っていたので訂正しておきます。


$encoding = mb_internal_encoding();
mb_internal_encoding("UTF-8");
$formatUtf8 = mb_convert_encoding($format,'UTF-8', $encoding);
$resultUtf8 = date($formatUtf8, $time);
$result = mb_convert_encoding($resultUtf8, $encoding, 'UTF-8');
mb_internal_encoding($encoding);
return $result;

yoheisnet さんのコメント...

激しく遅くなりましたがありがとうございます。
(ブログからはなれてました‥‥)