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
-, ,

執筆者:

関連記事

JavaとPerlでUDPソケット通信

目次1 はじめに2 対象読者3 実装3.1 UDPサーバ(Perl)3.2 UDPクライアント(Java)3.3 実行4 まとめ はじめに 本棚を整理していたらラクダ本が出てきました。うわー懐かしい、 …

Doxygenでspring-frameworkをドキュメント化

以前にspring-frameworkのソースリーディングが出来る環境をOpenGrokで作りました。One IT ThingOpenGrokをインストールしてソースリーディング環境を作るhttps: …

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

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

SpringBootアプリにBootstrap4を追加(WebJars使用)

SpringBootにCSSやJSを追加する場合は概ね以下のパターンがあるんじゃないかと思います。(bowerはもう使わない方向で) CDNで外部から読み込む<script src=&#8221 …

ブラウザでRSA暗号化したデータをサーバで復号する(Angular + JSEncrypt、Spring MVC)【前編】

セキュリティ的にクリティカルなデータをクライアントブラウザで暗号化保存するようにしてみます。 通信経路はHTTPSで暗号化されていてもスマホに重要なデータが平文で残っていたら珠に傷です。 目次1 環境 …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯現役技術者を目指しています。健康第一。