#ACS 5250 - 外字の表示
IBM i Access Client Solutions の 5250 で外字を画面表示させる方法です。
ACS 特有の話ではなく Java の仕様・制約・バグと対応方法の話です。
##フォントは「Monospaced」を選択
「編集」→「設定」→「外観」→「フォント」で表示に利用するフォント名は、必ず「Monospaced」を選択してください。
ある文字を表示しようとした場合、指定したフォントに対象の文字がない場合、別のフォントを利用して文字を表示する機能を「フォントのフォールバック」と呼びます。
フォールバックの仕組みは、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++ を使っています。
「monospaced.plain.japanese」の行を探します。
今回は「monospaced.plain.japanese=MS Gothic」なので日本語環境での「Monospaced」にはMSゴシックが使われる設定になっています。
物理フォント名の部分を、実際に利用したいものに変えます。
例えば、MS明朝を利用したいなら「monospaced.plain.japanese=MS Mincho」を指定します。
外字の代わりに記号が表示される
Oracle Java 8.0 u112 で外字が別の文字(記号)で表示されるバグが導入されました。
外字より先に参照されるフォールバックのリストに「symbols」が指定されてためです。
「symbols」の物理フォントは「Segoe UI Symbol」です。
このフォントは外字エリアにも文字(記号)の登録があるので、外字にたどり着く前に、優先順位の高いこちらが使用されてしまうのが原因です。
Java に JDK-8133309 : [win10] Some unicode characters do not display any more after upgrading to Windows 10というバグレポートがあがり、その中で 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. でバグ報告されていて、8u152 で修正予定です。
8u152 は 2017-10-16 に出荷予定です。
ただし 2017年10月に出荷されても8u152 は自動更新の対象ではありません。 2017年10月の自動更新はセキュリティパッチだけで機能の修正・拡張をしない8u151 のはずです。
以前には外字が表示されないというバグも
8u60 で外字が表示されないこともありました。
これが修正されたのは 8u74 でした。Java の外字にはいろいろあります。
今回は ACS ではなく Oracle Java の使用・制約・バグの話でした。
ACS としては Java が正常に稼働することを期待し、Java の仕様と制約の中で稼働します。
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
記事一覧はこちらで確認いたけます。
許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。