人生100年!生涯エンジニア人生!

楽しいエンジニア人生!

PHPの新元号対応について #phpstudy #phperkaigi

f:id:hideaki_kawahara:20190329102410p:plain

概要

第136回 PHP勉強会@東京で話した内容「PHPの新元号対応について」をブログに書き起こします。 phpstudy.doorkeeper.jp 登壇資料は、こちらです。

なお、こちらはPHPerKaigi 2019(本編2日目3/31(日)13:30-14:30/Track C)にて登壇します。 phperkaigi.jp

元号について

※「㋿」←こちらは新元号になる予定の文字フォントです、㍻31年3月29日の時点では表示されません。

  1. 元号の発表は㍻31年4月1日(月)です、なお公表時間は決まってません午前11時30分に発表されます。
  2. ㋿元年5月1日(水)の「天皇の即位の日」に新元号に変わります。
  3. Windows 10、Mac OSX、iOSAndroid OSなど、元号を表示するOSは、新元号発表後にアップデート配布で対応されます。
    • 和暦表示対応
    • 合字フォント対応
  4. UNIX系ではLinux系の一部が和暦に対応しているのでアップデートが必要です、(BSD系は非対応、Mac OSXもBSD系)確認方法はこちらです。
    LC_TIME=ja_JP.utf8 date +'%EY'

dateとDateTime::format()クラスの対応

  1. 和暦に対応していないので、対応は不要です、PHPのバージョンアップも不要です。
  2. 独自実装なら、エポックミリ秒「1546300800000」を判定に使ってください。

strftimeの対応

  1. こちらはC言語のライブラリーから表示をしているだけなので、対応は不要です、PHPのバージョンアップも不要です。
  2. 和暦に対応したLinuxのみ対応が必要、Linuxのアップデートが必要です、確認方法はこちらです、対応が必要なOSなら平成31年と表示されます。
setlocale(LC_TIME, "ja_JP.utf8", "Japanese_Japan.932");
print strftime('%EC%Ey年');

Normalizerの対応

  1. 対応が必要です。
  2. 元号発表後、PHPなどのアップデートがあれば、PHP5系はPHP自体の差し替え、PHP7系はPECL intlとintl(国際化用拡張)モジュールの差し替えが必要です。
  3. CakePHP3はintlモジュールが必須なので、元号を使ってなくても更新するのが望ましいと思われます。
  4. 確認方法はこちらです、㍻ではなく平成と表示されるはずです。
    print normalizer_normalize("㍻", Normalizer::FORM_KC);

合字の対応

  1. ソースコードUTF-8で記載されている場合は対応は不要です。
  2. ソースコードUTF-8以外で記載されている場合は、ソースコードUTF-8へ変換する対応が必要です。
    • 理由は新元号の合字への追加はUNICODEEBCDICのみで、Shift-JISとEUC-JPは割り当てが無いからです。
    • Web表示しているなら、出力エンコードの変更も必要です。
    • ソースコードだけじゃなく、設定ファイルや読み込むファイルなども念の為に変換することが望ましいです。

まとめ

  1. アップデートが必要
    • Linux
    • PHP5
    • PHP7系PECL intl
    • intlモジュール
  2. ソースコードの改修が必要