【问题标题】:Display an Unicode character on JButton在 JButton 上显示 Unicode 字符
【发布时间】:2023-04-01 07:58:01
【问题描述】:

我试图在 JButton 文本上显示这个 Unicode "\uD83D",但是当我编译它时,它只显示一个未知字符的正方形。

【问题讨论】:

  • 将字体改成支持unicode字符的字体
  • '\uD83D' 这样的单个surrogate character 始终是非法的。只有代理 pair 才有意义。
  • 如果它有助于解决问题,请accept an answer

标签: java swing unicode fonts


【解决方案1】:

Thomas 给出了一个很好的答案,但请注意,为了避免猜测哪些已安装的字体支持字符或字符串,我们可以迭代可用字体并使用 FontcanDisplayUpTo 重载方法检查每个字体:

例如

import java.awt.Font;
import java.awt.GraphicsEnvironment;

public class FontCheck {

    public static void main(String[] args) {
        String s = "\u4E33";
        Font[] fonts = GraphicsEnvironment.
                getLocalGraphicsEnvironment().getAllFonts();
        System.out.println("Total fonts: \t" + fonts.length);
        int count = 0;
        for (Font font : fonts) {
            if (font.canDisplayUpTo(s) < 0) {
                count++;
                System.out.println(font.getName());
            }
        }
        System.out.println("Compatible fonts: \t" + count);
    }
}

输出:

Total fonts:    391
Arial Unicode MS
Dialog.bold
Dialog.bolditalic
Dialog.italic
Dialog.plain
DialogInput.bold
DialogInput.bolditalic
DialogInput.italic
DialogInput.plain
Microsoft JhengHei
Microsoft JhengHei Bold
Microsoft JhengHei Light
Microsoft JhengHei UI
Microsoft JhengHei UI Bold
Microsoft JhengHei UI Light
Microsoft YaHei
Microsoft YaHei Bold
Microsoft YaHei Light
Microsoft YaHei UI
Microsoft YaHei UI Bold
Microsoft YaHei UI Light
Monospaced.bold
Monospaced.bolditalic
Monospaced.italic
Monospaced.plain
NSimSun
SansSerif.bold
SansSerif.bolditalic
SansSerif.italic
SansSerif.plain
Serif.bold
Serif.bolditalic
Serif.italic
Serif.plain
SimSun
Compatible fonts:   35

【讨论】:

    【解决方案2】:

    您需要设置支持所需 Unicode 字符的字体。
    以下示例依赖于安装在我的系统上的Code2000.ttf

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JButton button = new JButton("\u4E33");
            Font font = new Font("Code2000", Font.PLAIN, 36);
            button.setFont(font);
            frame.add(button);
            frame.pack();
            frame.setVisible(true);           
        });
    }
    

    当你使用surrogate characters (在 D800–DFFF 范围内),您需要使用高低代理对。 请注意,这对代表\uFFFF 之外的一个Unicode 点。

    代理对表示代码点
    1000016 + (H - D80016) × 40016 + (L - DC0016)
    其中 H 和 L 分别是高和低代理的数值。

    字符串中的不成对的代理字符(如在原始问题中) 无效,将呈现为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 2014-05-26
      相关资源
      最近更新 更多