PHP

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

2019/12/14

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

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

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

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

現象

1.時刻

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

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

2.日付

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

こちらも、ソースは以下のようになっていました。

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

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

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

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

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

「時」→ 時

「分」→ 分

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

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

「年」→ 年

「月」→ 月

「日」→ 日

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

結果

1.時刻

2.日付

おまけ

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

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

-PHP
-, , , ,