One IT Thing

IT業界を楽しむ為の学習系雑記

java

IVS対応フォント「IPAmj明朝」で使えるフォントをWeb上に一覧表示してみる(1)

投稿日:2019年7月3日 更新日:

IPAmj明朝フォントとは

IPAが整備している日本で使われるであろう文字6万数千が収録されたフォントです。下記サイトからttfファイルをダウンロードすることが出来ます。

日本における漢字のコンピュータ表示課題

現代のPCに入っている文字はUnicodeで文字コードが管理されており、JIS2004(JIS X 2013:JIS第一~第四水準)で定められた11,233文字を入力、表示することが出来ます。
https://ja.wikipedia.org/wiki/JIS_X_0213

ただ世の中の漢字は読みや意味が同じでも少しだけ字体が違うケースがあります。
(面倒なので正直統一して欲しいですね・・・そういった施策も行われています)

例えば葛飾区の「葛」という漢字は以下のような字体のバリエーションがあります。
(画像です)

普段の生活では意味が通れば良いケースが殆どなので一つの字体しか使わないですが、戸籍や登記、住基ネットのような行政システムでの登録は正確に漢字を登録する必要がある為、少なくとも現時点ではこれらは正確に区別される必要があります。

そして戸籍登録や登記申請で必要な固有の文字を含めるとコンピュータで表示しなければならない文字はおよそ68,000字ほど(!)になります。

Unicodeは2バイト設計なので最大でも65,536文字しかアサイン出来ませんし、世界中の文字を割り当てているのでもともと到底収まり切りません。

私たちが日常的に使用しているフォントもこの数はサポートしていないので表示することが出来ません。

サロゲートペアが対応策だが

まず個数が足りない問題を解決するべく、Unicode黎明期早々に「サロゲートペア」という概念が生まれました。

サロゲートペアはUnicodeの内、使っていない領域である0xD800~0xDFFFまでの2,048個を半分に分け、上位サロゲート(0xD800~0xD8FF : 1,024個)、下位サロゲート (0xDC00~0xDFFF:1,024個)を組み合わせることで1,024 * 1,024 = 1,048,576個の文字を追加登録できるようにしました。

1文字表示する情報量を2Byteから4Byteにサイズ変更する部分的例外を設けるのと引き換えに、器が足りない問題は解決されました。

当初、日本の少しだけ字体が違う漢字もサロゲートペアに登録しようと申請したそうですが、替わりにIVS(ideographic variation sequence)というUnicode内の仕様を使うようUnicodeコンソーシアムから打診されたそうです。

IVS(ideographic variation sequence) とは

IVSは基本となる文字(親字)のUnicodeにサロゲートペアで連番を付けることで様々な字体を表示する方法です。

例えば前述の「葛」の字体の違いをIVSで表現するには、基本となる親字「葛」のUnicodeである「0x845B」に0xE01で始まる数値、例えば「0xE0101」または「0xE0102」または「0xE0103」・・・のように連番となる数値を付け加えることで字体の違いを表現できる仕様になっています。

(*)「0xE0101」「0xE0102」といった16進5桁の数値は2バイトでは表せないので2バイト * 2バイトのサロゲートペア表現に直すと「0xDB40 0xDD01」「0xDB40 0xDD02」のような数値になります。サロゲートペアは以下の公式に当てはめればエンコード、デコードができます。

デコード:

$uni = 0x10000 + ($hi – 0xD800) * 0x400 + ($lo – 0xDC00);

エンコード:

$hi = ($uni – 0x10000) / 0x400 + 0xD800;

$lo = ($uni – 0x10000) % 0x400 + 0xDC00;

https://ja.wikipedia.org/wiki/Unicode

(0xE0101をエンコード公式に当てはめてみると$hiは0xDB40、$loはDD01になります。0x845B 0xE0101は、0x845B 0xDB40 0xDD01と同義です。この場合1文字は6バイトになり、親字がサロゲートペア文字(4バイト)だった場合はIVS(4バイト)が付くと1文字の合計は8バイトになります。)

確かにこのルールならサロゲートペアの残数も減らさなくて済みます。また、IVSを認識するにはOSレベルで対応が必要ですが、この仕組みはWindowsの場合Windows7から実装されているのでOSレベルでは問題が有りません。

ただ、このバイト配列の並びを文字として表示するには前述の通りフォント側も対応している必要があります。

普段使用している一般的なフォントでは0xDB40などは文字として当てはまらないので文字化けして表示されるか、全く表示がされません。

そこでIPAmj明朝フォントの出番

IPAmj明朝ではIVSのバリエーションシーケンスに対応するフォントを表示することが出来、冒頭の通り対応する字体画像(Glyph:グリフ)が6万数千収録されています。

利用者にIPAmj明朝のttfをインストールして貰い(GUIアプリならアプリに同梱するのも可)、開発アプリにIPAmj明朝を表示フォントとして設定することで様々な字体を表示出来るようになります。

次回はIPAmj明朝内のUnicodeが網羅されている「MJ文字情報一覧」のExcelをIPAサイトからダウンロードし、Apache POIを使ってそのUnicode一覧をリストアップしてみます。

-java
-, ,

執筆者:

関連記事

Tomcat9をCentOS7&OpenJDK11で起動

CentOS 7.6にOpenJDK 11を以下の記事で入れている状態です。 One IT ThingCentOS7にOpenJDK11をインストール、alternatives後の再ログイン …

IVS対応フォント「IPAmj明朝」で使えるフォントをWeb上に一覧表示してみる(3)

前回の続きです。 One IT ThingIVS対応フォント「IPAmj明朝」で使えるフォントをWeb上に一覧表示してみる(2)https://one-it-thing.com/2111前回 …

JavaコアAPI数の遷移をChart.jsでグラフ化

Javaはデフォルトで多数のAPIクラスを持っていてコーディングを楽にしてくれます。その数は増え続けているんでしょうか。 バージョンが上がるごとにどう変化しているか調べてchart.jsでグラフ化しま …

IPAmj明朝のttfファイルをJVMに読み込ませてSwingで表示(要Java11)

目次1 はじめに2 Java11でSwingがIVSを認識するようになった3 Java Swingソース4 動作確認4.1 Java 8(1.8.0_202)で実行4.2 Java 11(11.0.2 …

JUnitコードの自動生成も出来る古の神Eclipseプラグイン「CodeProAnalytix」は今でも使える

デスマーチPM「各社のPG進捗が遅れていてユニットテストを書く暇が全く無いんですよ、なにかいい手は有りませんかね・・・? 因みに本プロジェクトはカバレッジ100%で請け負っています!(キリッ)」 何故 …


shingo nakanishi。東京で消耗中の職歴20年越え中年ITエンジニアです。「生涯現役プログラマを楽しむ」ことができる働き方探しをライフワークにしています。

19歳(1996年)から書き始めた個人日記が5,000日を超え、残りの人生は発信をして行きたいと思い、令和元日からこのサイトを開始しました。勉強と試行錯誤をしながら、自分が経験したIT関連情報を投稿しています。