PHP

PHPテンプレートエンジン「Smarty」の日付整形 date_format修飾子で日本語が文字化けする現象の解決方法

PHPのテンプレートエンジンであるSmartyを使用している、少し(大分?)古いWEBシステムの表示の文字化けを直してほしいとの依頼を受けました。
見てみると、確かに日付で漢字を使用している箇所で化けています。

調査すると、日付や時刻周りで標題にもある date_format修飾子 を使用していると化けている感じ。

化ける環境(Windowsサーバが比較的多め?)までは調査できませんでしたが、対処方法はわかったので、備忘録としてポストしておきます。

date_format修飾子で日本語が文字化けする場合の対処方法

現象

1.時刻

少し小さいですが、撮ったキャプチャ。こちらは「11時02分」となる箇所が化けています。

もとのソースは以下のようになっていました。

2.日付

次は日付。「月」が化けています。

ソースは以下となっていました。

どちらにも共通するのは date_format修飾子と、フォーマット文字列の横に「漢字」が使用されているって事でしょうか。

対策方法 数値文字参照を使う

とうことで、以下に対策方法。
化ける漢字を、以前作成したスクリプトで「数値文字参照」にコンバートしてやろうってのが対策。

動くデモスクリプトはこちらから。

時・分を10進数にエンコード

「時」→ 時

「分」→ 分

ソースは以下のように修正。

年・月・日を10進数にエンコード

「年」→ 年

「月」→ 月

「日」→ 日

ソースは以下のように修正。

結果

1.時刻

2.日付

おまけ

先程のスクリプトを使えばどの文字でもコンバートは可能ですが、面倒くさいって場合のために、日付で使いそうな文字を 10進数・16進数と共にこちらにまとめておきます。

コンバート前10進数16進数
年年
月月
日日
時時
分分
秒秒
曜日曜日曜日
世紀世紀世紀
西暦西暦西暦
明治明治明治
大正大正大正
昭和昭和昭和
平成平成平成

-PHP
-, , , , ,