Posted at

[Java] Wingdings を表示する方法


はじめに


  • 個人的なメモです(忘れても大丈夫なように)

  • Windows の Java での話です。それ以外の環境ではチェックしていません。

  • フォント名は Wingding ではなく Wingdings なので注意(最後に s がつく)


    • Java では不正なフォント名を指定してもエラーにならず Dialog にフォールバックされるため、間違いに気が付きにくい



  • 参考: wikipedia - Wingdings


結論


  • 一般的に Wingdings というフォントでは 0x21~0xfe (or 0xff) のあたりにグリフがあることになっているけれど、Windows の Java で Wingdings を表示するには U+f021~U+f0fe(or U+f0ff) を使う必要がある


経緯

古い Java アプリを使っていたら、Wingdings でうまく表示できなかった。

具体的には様々なサイトでは ! (0x21) が鉛筆マークになると記載されているのに、うまく表示ができていなかった(そのアプリでは四角で表示された。変換できない文字扱い)。

古いアプリのせいなのかと思って(Swing ベースのアプリだったので、おそらく Java7 以前のもの)調べてみましたが、どうやら Java8 or Java11 でも JavaFX でもシンボルがうまく表示できないのは同様な様子。


調査結果

awt の Font クラスを使って、該当のフォントで表示できる範囲をチェックしてみました。


WingdingsTest.java

import java.awt.Font;

import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class WingdingsTest {

public static void main(String[] args) {
final Font font = new Font("wingdings", Font.PLAIN, 32);
final String codes = IntStream.range(0, 0x10000)
.filter(font::canDisplay)
.mapToObj(Integer::toHexString)
.collect(Collectors.joining(","));
System.out.println(codes);
}
}


結果を見ると、U+0009(TAB), U+000a(LF), U+000d(CR) と U+20xx あたりと、U+f0xx あたりが表示可能になっているみたい。

実際に試してみると、U+f021~U+f0ff あたりが Wingdings の記号になっていました。つまり、0x21 の鉛筆マークを表示したい場合には U+f021 のコードポイントを表示すればよいらしい。

この辺りはUnicode のいわゆる外字エリア(私用領域; Private Use Area)のようです。

この wikipedia の「外字」の「JIS X 0221 (Unicode)における外字」の説明を見たら、以下のように書いてありますね。


WingdingsなどのシンボルフォントのグリフはUnicodeではU+F020〜U+F0FFの一部に対応付けられている


試したところ、Wingdings だけじゃなく、Webdings や Symbol のフォントも似た感じでした。