はじめに
- 個人的なメモです(忘れても大丈夫なように)
- 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 クラスを使って、該当のフォントで表示できる範囲をチェックしてみました。
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 - 外字
この wikipedia の「外字」の「JIS X 0221 (Unicode)における外字」の説明を見たら、以下のように書いてありますね。
WingdingsなどのシンボルフォントのグリフはUnicodeではU+F020〜U+F0FFの一部に対応付けられている
試したところ、Wingdings だけじゃなく、Webdings や Symbol のフォントも似た感じでした。