在 Java swing 中显示 WebDings 字体不起作用,显示字形为空

Displaying WebDings font in Java swing isn't working, shown glyphs are empty

提问人:Eljah 提问时间:11/13/2023 最后编辑:Eljah 更新时间:11/14/2023 访问量:36

问:

代码为:

package ssl;

import javax.swing.*;
import java.awt.*;

public class WebDingsPhontGlyph extends JFrame {

    public WebDingsPhontGlyph() {
        setTitle("WebDings Phone Glyph");
        setSize(200, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                g2d.setFont(new Font("Webdings", Font.PLAIN, 50));
                g2d.setColor(Color.BLUE);
                g2d.drawString("^", 50, 100); // Phone glyph
                g2d.drawString("É", 100, 100); // Messaging glyph
            }
        };

        add(panel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            WebDingsPhontGlyph webDingsPhoneGlyph = new WebDingsPhontGlyph();
            webDingsPhoneGlyph.setVisible(true);
        });
    }
}

而 JPanel 视图是,尽管我希望有特定的 WebDings 字形。

enter image description here

如果我使用其他字体名称,那肯定不会退出,比如

g2d.setFont(new Font("webdings33", Font.PLAIN, 50));

它使用 Arial 字体并显示字形。

enter image description here

我安装了Webdings:

String [] fonts = ge.getAvailableFontFamilyNames();
                for (String fontname: fonts) {
                    System.out.println(fontname);
                }

除其他外的输出

Trebuchet MS
TypoUpright BT
Verdana
Webdings
Wingdings
Wingdings 2
Wingdings 3
Yu Gothic

更新。

我正在尝试测试元数据:

 Font webdingsFont = new Font("WebDings", Font.PLAIN, 12);
                System.out.println(webdingsFont.isBold());
                System.out.println(webdingsFont.isItalic());
                System.out.println(webdingsFont.isTransformed());
                System.out.println(webdingsFont.isPlain());
                System.out.println(webdingsFont.getNumGlyphs());
                System.out.println(webdingsFont.getStyle());
                System.out.println(webdingsFont.getFamily());

                for (int i = 0; i < 65536; i++) {
                    if (webdingsFont.canDisplay((char) i)) {
//                        g2d.drawString(Character.toString((char) i), 50, i*12); // Display the glyph at a specific position
                        System.out.println(i+" "+Character.toString((char) i));
                    }
                }

我得到的不是 ,而是字体!WebdingsWingdings

假 假 假 真 227 0 织带 9
10

13 8204 ‌ 8205 ‍ 61472  61473  61474  61475 

如果我尝试加载一个真正的 Wingdings,我会得到完全相同的输出和可见的行为。因此,至少在我的 Windows 版本中,看起来 Wingdings 是作为 Webdings 安装的。

enter image description here

swing 字体 java-font

评论

0赞 Hovercraft Full Of Eels 11/13/2023
请检查此相关问题的答案,包括如何检查该计算机上是否存在感兴趣的字体,以及如果不存在,如何安装它。
0赞 Eljah 11/13/2023
@HovercraftFullOfEels我看到此字体本地安装在 Windows 上,并且能够通过字符映射表选择 gyphs
0赞 Eljah 11/13/2023
@HovercraftFullOfEels此字体在这里。可能是没有Font.PLAIN或特定大小的问题,或者其他什么?
1赞 VGR 11/14/2023
Windows 字符映射表是为了“有用”而撒谎(具有讽刺意味的是,它正在做相反的事情)。字符根本不在 ASCII 代码点。Wingdings 和 Webdings 通常将其字符放在从 U+F020 开始的 Unicode 专用区域。为每个字符添加0xf000以获得其在字体中的真实位置。例如,使用 ,而不是 。代替 ,请使用 。"^"String.format("%c", '^' + 0xf000)"É"String.format("%c", 'É' + 0xf000)
0赞 Eljah 11/14/2023
@VGR这真的很有帮助!请将您的答案作为官方答案发布!

答:

1赞 VGR 11/14/2023 #1

Windows 字符映射表是为了“有用”而撒谎。(具有讽刺意味的是,它正在做相反的事情。

字符根本不在 ASCII 代码点。Wingdings 和 Webdings 通常将其字符放在从 U+F020 开始的 Unicode 专用区域。为每个字符添加0xf000以获得其在字体中的真实位置。

例如,使用 ,而不是 。代替 ,请使用 。"^"String.format("%c", '^' + 0xf000)"É"String.format("%c", 'É' + 0xf000)

当然,也可以写和.我发现使用 String.format 并添加0xf000更容易理解和维护。"\uf05e""\uf0c9"