Androidのテーマ機能やFlashable ZIPなどでRobotoフォントを置換すると、ロック画面のコロンが豆腐 (四角に文字化け) になる原因と、その対策方法をメモしておきます。
ロック画面のコロンは”fancy colon”
Androidのロック画面や常に画面表示 (Ambient Display、Always On Display) には基本的には時計が表示されますが、テーマ機能やMagisk Module、flashable ZIPなどで/systemのRoboto-Regular.ttfを置換すると、コロンが▯のように長方形の文字に化けてしまいます。
実はロック画面の時計では通常のコロンではなく、”fancy colon”と呼ばれる特殊な文字が使用されています。(KeyguardStatusView.javaで置換されており、TalkBack用には通常のコロンに置き換えるような処理がされています)
Roboto-Regular.ttfの”fancy colon” (U+EE01) と通常のコロン (U+003A) を比べると、下の画像のように”fancy colon”のほうが中央寄せになっていることが分かります。
“fancy colon”は個人やベンダーが自由に割り当てできる私用領域の文字なので、通常のフォントにはほぼ100%含まれていません。そのため、Roboto-Regular.ttfを置換すると”fancy colon”が表示できず、豆腐になってしまう…というわけです。
ちなみに、Pixel 2 XLのAndroid 8.1.0ではRobotoではなくGoogleSansに置き換わっています。GoogleSansもRoboto同様に”fancy colon”を含んでいるので、RobotoをGoogleSansに変更するのであれば問題は起きません。
フォント編集ソフトでU+EE01を追加すればOK
コロンが豆腐になってしまうのを防ぐには、単純にフォント編集ソフトでU+EE01のグリフを追加すればいいだけです。
Robotoからコピーするか、コロンをコピーして自分で中央寄りに編集してください。
※RobotoのライセンスはApache License 2.0なのでライセンスの宣言さえあれば改変しても問題ありませんが、編集したいフォントのライセンスがどうなっているか確認の上編集してください。
フォント編集ソフトにはFontForgeなどがあります。使い方は検索してください。
これでコロンをちゃんと表示しつつ、他のアルファベットなどを別のフォントに置き換えられます。
Magisk moduleのKoruri Fontではv03でこの問題を修正しています。
ちなみに…OnePlusのOxygenOS 11ではU+EE01ではなくU+A789が使用されています。余計な手間を増やすとは…。