Julia で令和対応（やっつけ）してみた

# TL;DR

+ 対応したこと：Unicode U+32FF（`'㋿'`）の扱い（エミュレート）
    + `pkg> add https://github.com/antimon2/Reiwa.jl.git`
+ 対応してないこと：和暦西暦変換

# 新元号サポートのニュース

Ruby 2.6.3 で「日本の新元号『令和』のサポート追加」が話題になっています。

+ [Ruby に令和がやってきた 🎉](https://qiita.com/QUANON/items/bdd31eab4f9d699551fe) by @QUANON
+ Twitter: https://twitter.com/mrkn/status/1118651715702575104 by [@mrkn](https://twitter.com/mrkn)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Ruby が令和に対応したよ〜 <a href="https://twitter.com/hashtag/rubykaigi?src=hash&amp;ref_src=twsrc%5Etfw">#rubykaigi</a><br><br>$ docker run --rm -it rubylang/ruby:latest irb<br>irb(main):001:0&gt; RUBY_VERSION<br>=&gt; &quot;2.6.3&quot;<br>irb(main):002:0&gt; &quot;\u{32ff}&quot;.unicode_normalize(:nfkc)<br>=&gt; &quot;令和&quot;</p>&mdash; みょうが (@mrkn) <a href="https://twitter.com/mrkn/status/1118651715702575104?ref_src=twsrc%5Etfw">2019年4月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

なんか面白そうだったので [Julia](https://julialang.org) でも同じようなこと出来ないか、とやってみました。
日付の方の対応（和暦のformatting/parsing）はとりあえずおいといて、Unicodeの方の対応（U+32FF SQUARE ERA NAME REIWA の扱い）だけ。

# `Reiwa.jl` 作りました

できました。

といっても Julia のコアをいじって正式対応ではなく、文字列の互換型を定義してエミュレートする形で。

成果物→ https://github.com/antimon2/Reiwa.jl

対象の Julia バージョンは v1.x です（v1.0.3, v1.1.0 で動作確認済）


## 使い方

Julia では通常、文字列リテラルは `"〜"` と二重引用符で括ります。
Unicode コードポイントを指定して文字を指定することは出来ますが、扱える Unicode のバージョンで割り当てられていない文字は正常には扱えません[^unicode_version]。

```jl
julia> s = "\u337e\u337d\u337c\u337b\u32ff"
# => "㍾㍽㍼㍻\u32ff"

julia> using Unicode

julia> Unicode.isassigned('\u32ff')
# => false

julia> Unicode.normalize(s, :NFKC)
# => "明治大正昭和平成\u32ff"

```

[^unicode_version]: 現在の所、Julia 1.1 以下では Unicode 11.x までしか対応していません。もうすぐ出る（はずの）Julia v1.2 では Unicode 12.0.0 をサポートするそうです。でも `'㋿'` (U+32FF SQUARE ERA NAME REIWA) は [Unicode 12.1.0](https://unicode.org/versions/Unicode12.1.0/) で初めてサポートされることになっています（てか Unicode 12.1 はそのため（だけ）の更新）。

`using Reiwa` して、通常の文字列リテラルの代わりに `reiwa"〜"` を利用して `ReiwaString` 型のオブジェクトを生成すると、その中に `'\u32ff'`（`'㋿'`←フォントがサポートされていればこちらも見えるはず）が含まれていた場合に、それを正しく扱えるようになります。

```jl
julia> using Reiwa

julia> s = reiwa"\u337e\u337d\u337c\u337b\u32ff"
# => reiwa"㍾㍽㍼㍻㋿"

julia> using Unicode

julia> Unicode.isassigned('\u32ff')
# => true

julia> Unicode.normalize(s, :NFKC)
# => "明治大正昭和平成令和"

```

`ReiwaString` は `String` 型と互換性があるので、通常の文字列の代わりとしても利用可能です。
合字の `'㋿'` を積極的に利用する機会のある Julia ユーザの方[^reiwa_user]は、ぜひお試しください！

[^reiwa_user]: かくいう私は（作っといてなんですが）まず `'㋿'` を積極的に使うことはないですし使う場面も全然思い浮かびません…じゃぁなんで作ったんだってそりゃもうほぼただのネタです…


###　技術情報

Reiwa.jl は、オレオレ文字列型の定義、新しい文字列を生成するマクロの定義のサンプルにもなっていると思います。その辺の技術情報が知りたい方は、ソースを見てみてください:bow_tone1:
（反響があったらもう少し詳しく追記します:bow_tone1:）


## フォントについて

この記事を見て「合字の『令和』の部分、文字化けしていない？」と思った方。それはまだフォントが対応していないからです。
正確には、対応していないフォントしかインストールされていないからです。

2019年4月前半時点ですでに `'㋿'` (U+32FF SQUARE ERA NAME REIWA) に対応したフォントがいくつか公開されています。例を挙げます：

+ [Source Han Sans（源ノ角ゴシック）](https://github.com/adobe-fonts/source-han-sans/releases) ≥ v2.001
+ [Cica](https://github.com/miiton/Cica/releases) ≥ v4.2.1

これらのフォントをインストールし適切に設定すれば、`'㋿'`←この文字はきちんと表示できます。

↓先ほどのサンプルコード部分（編集中の記事のプレビューをキャプチャした画像）（`㋿` だけたぶん 源ノ角ゴシック）
<img width="485" alt="Reiwa_Qiita.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30400/e169435c-9ebd-e95c-30eb-b6d0fb1777d6.png">

↓Julia を実行したターミナル（Cica）
<img width="762" alt="Reiwa_jl_org.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30400/66a137bb-7b63-b845-e1a9-3569dfaa2a53.png">

Let's Enjoy `㋿` Life!