PHPテンプレートエンジン「Smarty」の日付整形 date_format修飾子で日本語が文字化けする現象の解決方法
2019/12/14
PHPのテンプレートエンジンであるSmartyを使用している、少し(大分?)古いWEBシステムの表示の文字化けを直してほしいとの依頼を受けました。
見てみると、確かに日付で漢字を使用している箇所で化けています。
調査すると、日付や時刻周りで標題にもある date_format修飾子 を使用していると化けている感じ。
化ける環境(Windowsサーバが比較的多め?)までは調査できませんでしたが、対処方法はわかったので、備忘録としてポストしておきます。
date_format修飾子で日本語が文字化けする場合の対処方法
現象
1.時刻
少し小さいですが、撮ったキャプチャ。こちらは「11時02分」となる箇所が化けています。
もとのソースは以下のようになっていました。
1 |
{$hoge_time|date_format:"%H 時 %M 分"} |
2.日付
次は日付。「月」が化けています。
こちらも、ソースは以下のようになっていました。
1 |
{$hoge_service_start_date|date_format:"%Y 年 %m 月 %d 日"} |
どちらにも共通するのは date_format修飾子と、フォーマット文字列の横に「漢字」が使用されているって事でしょうか。
<対策方法>数値文字参照を使う
とうことで、以下に対策方法。
化ける漢字を、以前作成したスクリプトで「数値文字参照」にコンバートしてやろうってのが対策。
https://nodoame.net/archives/7014
動くデモスクリプトはこちらから。
https://lightning-bolt.xyz/js/tgConvNumCharRefs/
時・分を10進数にエンコード
「時」→ 時
「分」→ 分
ソースを以下のように修正。
1 |
{$hoge_time|date_format:"%H 時 %M 分"} |
年・月・日を10進数にエンコード
「年」→ 年
「月」→ 月
「日」→ 日
ソースを以下のように修正。
1 |
{$hoge_service_start_date|date_format:"%Y 年 %m 月 %d 日"} |
結果
1.時刻
2.日付
おまけ
先程のスクリプトを使えばどの文字でもコンバートは可能ですが、面倒くさいって場合のために、日付で使いそうな文字を 10進数・16進数と共にこちらにまとめておきます。
コンバート前 | 10進数 | 16進数 |
---|---|---|
年 | 年 | 年 |
月 | 月 | 月 |
日 | 日 | 日 |
時 | 時 | 時 |
分 | 分 | 分 |
秒 | 秒 | 秒 |
曜日 | 曜日 | 曜日 |
世紀 | 世紀 | 世紀 |
西暦 | 西暦 | 西暦 |
明治 | 明治 | 明治 |
大正 | 大正 | 大正 |
昭和 | 昭和 | 昭和 |
平成 | 平成 | 平成 |