All About ACS: IBM i Access Client Solutions 5250で好きなフォントを使いたい

# ACS 5250で好きなフォントを使いたい
「0 (ゼロ)」と「O(オー)」が一目でわかるフォントを使いたいなど、好みのフォントを ACS 5250 で使いたい方もいらっしゃると思います。
ここでは、その技術的な方法をご案内します。
ただし、どのフォントなら上手くいくという情報はありませんので、予めご了承ください。

# 等倍(Monospaced)フォントを用意
「I」やスペースと「W」が同じ横幅を持つと「I」やスペースの周りがスカスカで美しくないということで、文字の横幅を文字ことに変えているフォントがあります。「プロポーショナル・フォント」と呼ばれるものです。

例えば、Windowsに「MS ゴシック」と「MS P ゴシック」があろます。
「W I W I W I」をそれそれで表示してみましょう。
「MS ゴシック」では、どの文字も同じ幅ですが、「MS P ゴシック」では「I」やスペースの幅が狭いのが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/d6bf4739-3b55-31e9-b139-ddea5d07cd10.png)

5250 では格子状に文字を表示するために、等倍(Monospaced)フォントを使う必要があります。

# DBCS:SBCS が 2:1
等倍(Monospaced)フォントでも DBCS:SBCS の横幅の比率が 2:1 ではないものがあります。
比率が 2:1 のものを用意してください。

# SBCS の円記号やオーバーラインの横幅は正しいか
ACS では UNICODE の規格にのっとり、下記のコードで SBCS の円記号やオーバーラインを表示します。

| 文字 | コード | 
|:-----------|------------|
| 円記号 | U+00A5 | 
| オーバーライン | U+ 203E |

U+005Cはバックスラッシュなので、円記号の表示には使いません。

しかし、フォントの中にはこれら文字の横幅を DBCS と同じにしているものがあります。
例えば [IPAゴシック](https://ipafont.ipa.go.jp/old/ipafont/download.html) です。

SEUに円記号と「1」を入れました。
1 行目がSBCSの円記号、2 行目がDBCSの円記号です。「{」「}」は OE/OF表示です。
4 行目は「1¥1¥1¥1¥」をIBM i から表示されたもの、5 行目は「¥1¥1¥1¥」の入力中です。

Monospaced の表示がこちら。特に問題はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/6bbc5fe2-ce2e-35a9-74be-3ca6c217f8ee.png)

IPAゴシックの表示がこちら

1 行目のSBCSの円記号、2 行目がDBCSの円記号が同じ幅であることが分かります。

IBM i から表示された 4 行目は。幅の広い円記号の分だけ間延びしています・
入力中の 5 行目は、いったん、幅の広い円記号が表示されますが、カーソル位置が正しく計算されるため、次に入力した「1」で右半分が隠れています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/1bbff829-24df-89db-e351-b60ad365f5f0.png)

# フォントの導入は「すべてのユーザーに対してインストール」
お気に入りのフォントが見つかったとします。やっと導入です。

Windows 10 1809 から管理者でなくでもフォントインストールが可能になりました。そのため単純に導入すると、そのユーザーだけが使えるように、ユーザーのディレクトリーに導入されます。このようなフォントは Java は使いません。
Java から使うためには c:\windows\fonts に導入する必要があるようです。
そのためには、導入したいフォントを右クリックして、「すべてのユーザーに対してインストール(A)」で導入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/0fc48bab-1e7b-66b6-34c8-21278565d1b1.png)

これで、ACS からフォントが選択できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/2db645dc-65e9-acc6-5a62-82b48e77a808.png)


# 外字と共存させたい
Javaで利用するフォントには「論理フォント」と「物理フォント」が存在します。

「物理フォント」は「MS ゴシック」などのようにフォント名を直接指定する方法です。しかし、稼働プラットフォームい依存しない Java で表示フォントに「MS ゴシック」を指定してしまうと Mac や Linux に持って行ったときにフォントがないので困ります。

そのため Java には稼働プラットフォームに依存しない「論理フォント」と呼ばれるものが存在します。
アプリケーションからフォント名に「論理フォント」を指定し、実際にどのフォントを使うかは プラットフォーム事の JRE で設定・吸収するという仕組みです。
「論理フォント」にはいくつかありますが、その中で等倍として設定されているのは「Monospaced」です。
ACS は論理フォントのうち「Monospaced」だけが選択可能です。

## Java で外字を利用できるのは「論理フォント」だけ
Java で外字を利用できるのは「論理フォント」だけです。
利用したい文字が指定したフォントにない場合。別のフォントを利用する仕組みを「フォールバック」と呼びます。
Javaではフォールバックが利用できるのは、論理フォントだけです。物理フォントを指定すると、その物理フォントに存在するフォントにある文字しか利用しません。

ACSで使える論理フォントは「Monospaced」だけなので、任意のフォントと外字を共存させたいときは、「Monospaced」が指定された時に実際に利用されるフォントのマッピングを変更します。

まず、「[JREディレクトリー]\lib」にある「fontconfig.properties.src」を、同じ場所に「fontconfig.properties」という名前でコピーします。
次に「monospaced.plain.japanese」の行を探し、使いたいフォント名に置き換えで保管します。

> monospaced.plain.japanese=MS Gothic

ACS の 5250 で Monospaced を指定すれば、指定したフォントと外字が共存しているはずです。
ACS 起動中の変更はうまくいかないかもしれません。設定が正しくても、うまくいかない場合は。ACS の再起動やPCの再起動を試してください。

# どこで妥協するか
個人的に、いろいろなフォントを試しましたが、完全に動作するフォントを見つけることはできませんでした。
円記号をバックスラッシュが使い分けられ円記号の幅も SBCS として期待通りの「Noto Sans CJK Nono JP」は、[IBM i Access Client Solutions 5250で画面レイアウトが崩れる](https://qiita.com/6onoda/items/fd8c42ec3088c4ef105d) の様に固定フォントにしないとレイアウトが崩れました。
別にレイアウトのぐずれないフォントもあったのですが、SBCS 円記号の幅が DBCS 幅になっていました。

私は、今はすべてを満たすのはあきらめ、確認したい内容に応じて、その時々でフォントを切り替えています。

どなたか良いフォントをご存知ならコメントに残していただけると幸いです。
***
2020-04-25 作成 
***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***