書いて覚えるSwift入門

第50回新元号「令和」対応

Apple Devices meet 令和

2019年5月14日にiOS 12.3およびmacOS Mojave 10.14.5がリリースされ、Appleデバイスにも令和がやってきました。iOSでは[設定⁠⁠→⁠一般⁠⁠→⁠言語と地域][暦法][和暦]を指定することで西暦2019年5月1日以降の日付が令和になります。余談ですがタイ仏暦もサポートされているのですね図1⁠。

図1 元号対応の様子
図1 元号対応の様子 図1 元号対応の様子

macOS ⁠System Preferences⁠⁠→⁠Language & Region][Calendar][Japanese]にすることで同様の効果が得られます。こちらはiOSよりもさらに多くの暦法がサポートされています図2⁠。

図2 macOSでの設定画面
図2 macOSでの設定画面 図2 macOSでの設定画面

なお、元号と西暦の対応は、Swiftという言語ではなくOSのAPIでなされている点に留意する必要があります。2019年5月現在が令和元年なのか平成31年なのかはOSで決まります。実際、次のSwiftプログラムをmacOS Mojave 10.14.5で走らせると、

Swiftのサンプルコード
#!/usr/bin/env swift
import Foundation;
let df = DateFormatter();
df.locale = Locale(identifier:"ja_JP")
df.calendar = Calendar(identifier:.japanese)
df.dateFormat = "Gy年MM月dd日HH時mm分ss秒ZZZZZ"
print(df.string(from:Date()))
令和元年05月23日16時37分10秒+09:00

と表示されましたが、Ubuntu 18.04 LTSでは本原稿執筆現在も令和を知らないので、

平成31年05月23日16時37分10秒+09:00

と表示されました。なお、Ubuntuも19.04にはすでに令和が届いている模様です。

Unicode 12.1はまだ

元号の処理は基本的にはOSの処理ですが、そうでないものが1つあります。Unicodeにおける文字の正規化の扱いです。これに関してはOSのAPIというものはなく、対応は言語ごとです。具体的には次のSwiftコード、

Swift
"\u{337E}".decomposedStringWithCompatibilityMapping // "明治"
"\u{337D}".decomposedStringWithCompatibilityMapping // "大正"
"\u{337C}".decomposedStringWithCompatibilityMapping // "昭和"
"\u{337B}".decomposedStringWithCompatibilityMapping // "平成"
"\u{32FF}".decomposedStringWithCompatibilityMapping // "令和"じゃない!

のような正規化がそれに該当するのですが、iOSおよびmacOSでは\u{32FF}⁠対応のフォントは搭載されても正規化は未実装でした。macOS図3とUbuntu図4のREPLの結果です。

図3 macOSでの対応
図3 macOSでの対応
図4 Ubuntuでの対応
図4 Ubuntuでの対応

メソッド名にもCompatibilityMappingとあるとおり、これら本来はUnicodeとレガシー文字コードの相互変換を担保するために仕方なく用意されていたコードポイントでした。にもかかわらずU+32FFがUnicode 12.1に用意されてしまったのは呆れるよりほかありません。これを認めるのであれば、U+3004が〄に割り当てられてしまった以上、新JISマークも別途コードポイントを割り当てられるべきという無茶さえ通ってしまいかねません。

もっとも、元号という概念自体がレガシーではあるのですが……。

次回予告

次回はWWDC特集を予定しております。

Software Design

本誌最新号をチェック!
Software Design 2022年9月号

2022年8月18日発売
B5判/192ページ
定価1,342円
(本体1,220円+税10%)

  • 第1特集
    MySQL アプリ開発者の必修5科目
    不意なトラブルに困らないためのRDB基礎知識
  • 第2特集
    「知りたい」「使いたい」「発信したい」をかなえる
    OSSソースコードリーディングのススメ
  • 特別企画
    企業のシステムを支えるOSとエコシステムの全貌
    [特別企画]Red Hat Enterprise Linux 9最新ガイド
  • 短期連載
    今さら聞けないSSH
    [前編]リモートログインとコマンドの実行
  • 短期連載
    MySQLで学ぶ文字コード
    [最終回]文字コードのハマりどころTips集
  • 短期連載
    新生「Ansible」徹底解説
    [4]Playbookの実行環境(基礎編)

おすすめ記事

記事・ニュース一覧