C#をメインにされている方は、Windowsには慣れてるれど、Linuxはちょっと。。。という方は多いのではないでしょうか。というのも僕もその一人だからです。ということでC#プログラマーで、且つLinux(Ubuntu)初心者向けの方に、ASP.NET Coreアプリで和暦を使用する場合の紹介です。Ubuntuに.NET CoreのSDK3.1がインストール済であることを前提とします。
WSLを使えば簡単にLinux(Ubuntu)を準備できるので、環境がない方はこちらを参考にしてください。
WSL v1 | Ubuntu18.04 LTS |
App | ASP.NET Core 3.1.302 |
グローバリゼーション機能
まずは、グローバリゼーションのお話です。.NET Core3.1では、International Components for Unicode (ICU)を使用して和暦のようなグローバリゼーションの動作を制御します。microsoftのテックブログにも次のように説明されています。
For .NET Core on non-Windows platforms, calendar information is provided by International Components for Unicode (ICU), an open source globalization library. ICU libraries will be updated once the era name and abbreviated era name are known. Because they do not depend on ICU cultural data, applications that use the globalization invariant mode are not affected by this change.
ICUパッケージのインストール
公式のUbuntu に .NET Core SDK または .NET Core ランタイムをインストールするに説明がありますが、パッケージ マネージャーを使用して.NET Coreをインストールする場合は、自動的にICUライブラリがインストールされます。
パッケージを確認
依存関係でインストールされているICUパッケージのバージョンを確認します。
1 2 3 4 5 6 7 8 9 |
sudo dpkg -l | grep icu --------------------------------------------------------------------------- ii icu-devtools 60.2-3ubuntu3.1 amd64 Development utilities for International Components for Unicode ii libharfbuzz-icu0:amd64 1.7.2-1ubuntu1 amd64 OpenType text shaping engine ICU backend ii libicu-dev 60.2-3ubuntu3.1 amd64 Development files for International Components for Unicode ii libicu-le-hb-dev:amd64 1.0.3+git161113-4 amd64 ICU Layout Engine API on top of HarfBuzz shaping library (development) ii libicu-le-hb0:amd64 1.0.3+git161113-4 amd64 ICU Layout Engine API on top of HarfBuzz shaping library ii libicu60:amd64 60.2-3ubuntu3.1 amd64 International Components for Unicode ii libiculx60:amd64 60.2-3ubuntu3.1 amd64 International Components for Unicode |
Ubuntu 18.04用のlibicu60がインストールされています。
令和を表示
インストール済みのICUパッケージで和暦を表示してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@functions { public string ToJa(DateTime val) { if (val > new DateTime(1868, 9, 7)) { var culture = new CultureInfo("ja-JP", false); culture.DateTimeFormat.Calendar = new JapaneseCalendar(); return val.ToString("ggy'年'", culture); } return string.Empty; } } <p>@ToJa(DateTime.Now)</p> -------------------------------------------- 平成32年 -------------------------------------------- |
令和表示にはなりません。それでは、令和対応済のICUバージョンを確認します。
令和対応済のICUバージョン
公式を確認すると、
ICU 64.2 released. This maintenance update for ICU 64 includes draft Unicode 12.1 update, CLDR 35.1 locale data and support for new Japanese era Reiwa (令和).
ICU 63.2 / 62.2 / 61.2 / 60.3 / 59.2 / 58.3 / 57.2 / 56.2 / 55.2 / 54.2 / 53.2 / 52.2 / 51.3 / 50.2 / 4.8.2 released. These maintenance updates for past ICU versions include support for new Japanese era Reiwa (令和).
ということで、ICU 60.3をインストールする方向で進めていきます。
ICU 60.3のdebパッケージ
結論から言うと、bionic (18.04LTS) のバージョンは、libicu60 パッケージですが、60.3はありません。困ったと思いながら調べていくと、icu4c-64_2-Ubuntu18.04-x64.tgzにたどり着きます。
ICU 64.2
パッケージ管理からは外れてしまいますが、icu4c-64_2-Ubuntu18.04-x64.tgzを解凍して上書きします。解凍すると親切に上書きできるようなディレクトリ構成になっています。但し、WSL v1を使用している場合は、/usr/lib/x86_64-linux-gnuにインストールされているので注意が必要です。
念のため上書き前にバックアップします。
WSLバックアップ
環境によりますが、それなりのサイズになるのでしっかり空き容量があるかどうかを確認してください。
1 2 3 4 5 6 |
wsl -l ------------------------------- Windows Subsystem for Linux ディストリビューション: Ubuntu-18.04 (既定) ------------------------------- wsl --export Ubuntu-18.04 ./ubuntu.tar |
再度令和を表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@functions { public string ToJa(DateTime val) { if (val > new DateTime(1868, 9, 7)) { var culture = new CultureInfo("ja-JP", false); culture.DateTimeFormat.Calendar = new JapaneseCalendar(); return val.ToString("ggy'年'", culture); } return string.Empty; } } <p>@ToJa(DateTime.Now)</p> -------------------------------------------- 令和2年 -------------------------------------------- |
こうやって記事にすると簡単ですが、辿り着くまでハマった。。。debパッケージも自作できるようなので、またチャレンジしてみたいです。