All About ACS: ACS 5250 - 外字の表示

#ACS 5250 - 外字の表示
IBM i Access Client Solutions の 5250 で外字を画面表示させる方法です。
ACS 特有の話ではなく Java の仕様・制約・バグと対応方法の話です。

##フォントは「Monospaced」を選択
「編集」→「設定」→「外観」→「フォント」で表示に利用するフォント名は、**必ず「Monospaced」を選択**してください。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/c5d26aa3-ff35-5f7b-ee95-fc127783c337.png)

ある文字を表示しようとした場合、指定したフォントに対象の文字がない場合、別のフォントを利用して文字を表示する機能を「フォントのフォールバック」と呼びます。
フォールバックの仕組みは、Windows と Java では異なります。

Java は、マルチプラトフォームのためプラットフォームに依存しないフォント名である「論理フォント」と、実際のフォント名を直接指定する「物理フォント」が存在します。
Java が出てきた当初は、「論理フォント」しか存在していませんでした。その後 Java 1.2 で「物理フォント」が利用できるようになりました。
Javaでは「物理フォント」を直接指定した場合、フォールバックが起こりません。Windows 側の外字エディターで指定したリンクは無視します。
もちろん、外字は指定したフォントに含まれていませんから、フォールバックが起こらなければ表示されません。
Javaでフォールバックが起こるのは、論理フォントを指定した時だけです。
さらに論理フォントの中で、文字間隔が一定なのは論理フォント「Monospaced」です。5250 画面
に均等・升目上に文字を表示するには「Monospaced」を選ぶ必要があります。

##利用するフォントを変えたい場合
日本語環境のデフォルトでは「Monospaced」でMSゴシックが利用されています。
MSゴシック以外を使いながら、外字を使いたい場合は、「Monospaced」で利用するフォントを変更します。

「Monospaced」が実際にどのフォントを利用するかは「fontconfig.properties」に指定できます。
まず、「fontconfig.properties」を用意します。
コマンドプロンプトを「管理者として実行」し、利用しぃている JRE の 「fontconfig.properties.src」を「fontconfig.properties」としてコピーします。

```
C:\WINDOWS\system32>cd C:\Program Files (x86)\Java\jre1.8.0_131\lib

C:\Program Files (x86)\Java\jre1.8.0_131\lib>copy fontconfig.properties.src fontconfig.properties
        1 個のファイルをコピーしました。
```

コピー先の「fontconfig.properties」を、Unixの改行コード「LF」に対応したエディターで開きます。
ここでは Notepad++ を使っています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/092f90ec-6a10-8321-271d-8cc33b9e753e.png)

「monospaced.plain.japanese」の行を探します。
今回は「monospaced.plain.japanese=MS Gothic」なので日本語環境での「Monospaced」にはMSゴシックが使われる設定になっています。

物理フォント名の部分を、実際に利用したいものに変えます。
例えば、MS明朝を利用したいなら「monospaced.plain.japanese=MS Mincho」を指定します。


## 外字の代わりに記号が表示される
Oracle Java 8.0 u112 で外字が別の文字(記号)で表示されるバグが導入されました。

外字より先に参照されるフォールバックのリストに「symbols」が指定されてためです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/ba7cc298-80c4-d267-b2d9-8b842065aa96.png)

「symbols」の物理フォントは「Segoe UI Symbol」です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/96950ffc-b5c4-d979-c1e4-d960f2132e60.png)

このフォントは外字エリアにも文字(記号)の登録があるので、外字にたどり着く前に、優先順位の高いこちらが使用されてしまうのが原因です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/f58888bf-9262-cffc-9470-08860cf4b2bc.png)

Java に [JDK-8133309 : [win10] Some unicode characters do not display any more after upgrading to Windows 10](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8133309)というバグレポートがあがり、その中で Java からもいろいろな記号が使えた方がいいよね、の機能追加の副作用です。

> Also we may want to find a more reliable source of the symbol fonts. I think Segoe UI Symbol is the obvious choice here to add to our fallbacks.


回避するのは、前述の方法で「fontconfig.properties」を作成し、そこから「symbols,」を除去し

```
sequence.fallback=lucida,symbols,\
                  chinese-ms950,chinese-hkscs,chinese-ms936,chinese-gb18030,\
```

こうして保存します。

```
sequence.fallback=lucida,\
                  chinese-ms950,chinese-hkscs,chinese-ms936,chinese-gb18030,\
```

この件は [JDK-8179888 : Java "1.8.0_112" on Windows 10 displays different characters for EUDCs from ones created in eudcedit.exe.](https://bugs.openjdk.java.net/browse/JDK-8179888) でバグ報告されていて、8u152 で修正予定です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/aef922da-dee7-c388-4795-6a2661137cca.png)

[8u152](https://bugs.openjdk.java.net/projects/JDK/versions/18805) は 2017-10-16 に出荷予定です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/216e2af9-544f-f977-4317-606ab5c03694.png)

ただし 2017年10月に出荷されても8u152 は自動更新の対象ではありません。 2017年10月の自動更新はセキュリティパッチだけで機能の修正・拡張をしない8u151 のはずです。

## 以前には外字が表示されないというバグも

8u60 で外字が表示されないこともありました。

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8137106

これが修正されたのは 8u74 でした。Java の外字にはいろいろあります。

今回は ACS ではなく Oracle Java の使用・制約・バグの話でした。
ACS としては Java が正常に稼働することを期待し、Java の仕様と制約の中で稼働します。

***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

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