Docurain Labo

Docurainサービス開発日記

Windowsの「外字」とは?基礎から解説 & Docurainでの対応

この度、Docurainにて、純粋な意味の外字対応が可能かどうかの検証が必要になり、詳細を調べてみましたのでそれをまとめます。

「外字」とは

「外字」とは、本来システムに登録されていない文字のことを指します。よくある例としては、漢字の異体字などです。これをシステムから利用できるようにするための機能が各種OSには備わっていたりします。これが本来の意味ですが、私の経験上では単に「マイナーな異体字」を「外字」と表現する人も多々見かけてきました。

異体字の多くはUnicodeでもすでに定義されていますので、「外字でなくてUnicodeを使いましょう」という運動が昨今進んでいます。以下はMicrosoft ブログから引用です:

Windows と日本語のテキストについて - Windows Blog for Japan

Unicode を使用することにより、人名地名に使用される漢字等を正確に表現するニーズにも対応することができます。従来、このような用途では外字を使用するケースが多くありましたが、現在「外字でなければ表示できない文字」をお使いのお客様は限定的です。Unicode に定義されており、Windows に同梱のフォントを使用して標準の状態でも表示可能な文字を、外字にいわば「再定義」してお使いのお客様が非常に多くいらっしゃいます。

(中略) 現在外字を使用している国としては日本が突出しており、外字が既にレガシーな機能であることもお伝えしなければなりません。

(中略) 外字を使用していることや、テキストを Shift-JIS で保存していることがクラウド移行の大きな障壁となるケースが急増しています。

ということです。つまり、

  • 外字はレガシーな機能であり、移行が必要
  • 異体字はUnicodeで表現可能なことがほとんど

ということが言えると思います。

今日、システム上で異体字を扱わなければならないケースが生じた際には、

  • Unicodeに対応したシステムを構築する(UTF-8, サロゲートペア、Unicodeエスケープなどへの対応)
  • IPAmj明朝などの異体字が表現できるフォントを利用できるようなシステム設定を行う

という対応をすることが正攻法になるでしょう。なぜなら、これが将来的な技術的負債となる可能性が大きいからです。「外字」として独自の文字を定義するのは最後の手段と考えたほうが良さそうです。

なお、Docurainは既にIPAmj明朝には完全対応しています。

blog.docurain.jp

今回の検証は、何らかの理由によりIPAmj明朝が使えないケースのための予備調査となります。

Windowsにおける外字機能

Windowsにおける外字機能としては、古くから「外字エディタ」が提供されてきました。この機能は現在のWindows10からも利用可能です。試しに使ってみましょう。

使う場合は、Windowsメニューから「外字」で検索するか、Winキー+Rを押してから「eudcedit」と入力してEnterを押します。

f:id:withpop:20210426114421p:plain

すると、こういった画面が表示されます。

f:id:withpop:20210426114542p:plain

一度も使ったことがなければ、ここには灰色の空のマスが並んでいます。このE000というのはUnicodeです。E000〜F8FFまでは「私用領域」として定められており、通常ここに文字(グリフ)が割り当てられることはありません。名前の通り、グローバルに何かを定めるためのものではなく、ユーザーが定義して使うために領域を残しているわけです。

つまり、これは「外字」そのものですね。

f:id:withpop:20210426115135p:plain

特定のUnicode コードを選択すると文字のエディタが立ち上がります。ここで任意の文字を作成して定義できます。ここでは、ShiftJISでF042、UnicodeでE002の場所におにぎりを表す漢字を独自に定義しました。これ一文字で「おにぎり」と読みます。私が勝手に定義して私的に利用する漢字です。

続いて今回は「ドラえもん」「うずまき」という漢字を作ってみました。

では定義した文字はどのようにして利用すれば良いのでしょうか?この文字が「おにぎり」と読むことをシステムは知りません。なので、IMEから「おにぎり」と入力して変換してもこのおにぎり漢字が出てくることはありません。

Microsoft IMEの「IMEパッド」は任意の文字を入力できるのでこれを利用すると入力することが出来ます。

f:id:withpop:20210426115904p:plain

「Unicode(基本多言語面)」→「私用領域」とたどると今回定義した文字が出てくるので、ここをクリックするとその文字が入力できます。

f:id:withpop:20210426120235p:plain

「おにぎり」と入力したらこの文字が表示されるようにしたい場合は、IMEから単語登録すればよいでしょう。外字エディタではその文字の「読み」は気にしません。私用領域の特定のコードに編集した文字を割り当てる、それだけを外字エディタは行います。

では、Windowsではどのようにしてこの機能を実現できているのでしょうか。

実は、外字エディタで編集した文字は c:\windows\fonts\EUDC.TTE というファイルとして保存されます。これは拡張子がTTEとなっていますが、実態はTrueTypeフォントのようです。

Windowsでは、表示中のフォントで定義されていないおにぎりグリフ(E002)があった場合にEUDC.TTEで定義されている文字にフォールバックするように設定されているようです。

ここまでの話をまとめると、外字エディタとは

  • 独自のグリフをドットで作成し
  • 私的領域の任意のコードに割りあて
  • Windowsがそのコードの表示を行う時にEUDC.TTEをフォールバックフォントとして設定する

ような機能であると言えます。

もちろん、ここで定義した文字はいわゆる機種依存文字になりますから、他のコンピュータでは表示できません。機種依存どころか特定のマシン依存です。他のコンピュータで表示するためにはEUDC.TTEを表示するコンピュータにインストールする必要があります。

逆に言えば、EUDC.TTEを表示するコンピュータにインストールすればおにぎり漢字も表示できるはずですね。

EUDC.TTEを調査する

ではこのフォントを調査してみましょう。このフォントをファイルとして抽出するためにはコマンドプロンプトでコピーする必要があります。

f:id:withpop:20210426120918p:plain

エクスプローラで c:\windows\fonts\ を開くとフォントのリストを表示する特殊な表示となってしまい、EUDC.TTEが見つかりませんでした。

ここからはLinux(Ubuntu)で作業をします。まずはFontforge(フォント編集ソフト)でフォント情報を見てみましょう。

f:id:withpop:20210426121039p:plain

フォントファミリーは「EUDC」、スタイルは「Regular」であることが分かります。ベンダIDには「RICO」(ママ)の文字が入っていました。この機能はリコー(RICOH)が開発に携わっているのでしょうか?

f:id:withpop:20210426121403p:plain

定義されているグリフを見ると、確かに私的領域に今回作成した3文字が入っています。その他は全部空欄でした。

f:id:withpop:20210426121545p:plain

ちなみに、ここまでのスクリーンショットをご覧になったところでお気づきの方も多いと思われますが、編集はドットで行った(つまりラスタ画像)のに、フォントはそれを平滑にしたようなベクタ画像になっています。もともと外字エディタってこの仕様だったのでしょうか?中々すごい機能が備わっていますね。

Docurainの外字対応

ここまででWindowsの外字とは何か?ということを説明しました。

冒頭に説明したとおり、外字はレガシーな機能で使うのを避けてUnicodeと対応フォントに移行すべきではありますが、「ではそうしましょう!」で何も問題なくプロジェクトは実際少ないだろうことは皆さんお察しのとおりです。

というわけで今回、Docurainでも外字対応が可能かどうかを検証しました。と、言えどもここまでに調べた仕様から察するに特に問題なく表示できるでしょう。

どのような設定を行ったかはDocurain内部システムの構成の話になるので省きます。

今回は以下のようなテンプレートを作成しました。

f:id:withpop:20210426122216p:plain

text1〜3に任意の文字を入力して表示するだけです。ただ、任意のフォントからフォールバック可能であることを検証するためにそれぞれ違うフォントを設定しています。

使用するエンティティデータは以下のようになります。

f:id:withpop:20210426122340p:plain

外字は対応するコードのUnicodeエスケープで記述します。必ずUnicodeエスケープで記述しなければならないというわけではありませんが、開発ツールやIDEなどの親和性を考えると楽なのはUnicodeエスケープで記述する方法です。

f:id:withpop:20210426122622p:plain

出力したPDFファイルです。フォント埋め込みなので、ここで出力したファイルはあらゆるデバイスで同じように表示できます。

こちらからダウンロードして皆さんの環境でも同様に表示できることを確かめてみて下さい。

まとめ

今回はWindowsの外字機能の概要をまとめた上で、DocurainからもWindows外字エディタで作成した文字が利用可能であることを確かめました。

もし、帳票開発をもっとモダンなものに置き換えたいが外字対応がネックになっている…という方はぜひご相談下さい。