如何在java中添加对特殊unicode字符的支持?

时间:2015-10-11 19:38:51

标签: java unicode symbols

我需要使用graphics2d绘制一个特殊字符,但有些字符不可用。例如,角色➿呈现为方框:

这是我的代码:

private void drawIcon(Graphics2D g2d) {
    g2d.setColor(iconColor);
    g2d.setFont(iconFont);
    FontMetrics fm = g2d.getFontMetrics();
    Rectangle2D r = fm.getStringBounds(icon, g2d);
    int x = (int) ((getSize().getWidth() - (int) r.getWidth()) / 2);
    int y = (int) ((getSize().getHeight() - (int) r.getHeight()) / 2 + fm.getAscent());
    System.out.println(x + " " + y);
    System.out.println(icon);
    g2d.drawString(icon, x, y);     
}

例如, icon 是字符串“\ u27BF”,应显示为“➿”。

如何在代码中添加对此字符的支持?

1 个答案:

答案 0 :(得分:2)

查找包含您的角色的可自由再发行(例如开源)TrueType字体。假设字体许可证允许它,你可以采用包含你的角色的现有字体,并将其子集化为只需要你需要的角色 - 例如使用Font Optimizer。或者,您可以使用字体设计工具(例如FontForge)创建自己的包含此字符的字体。

然后您可以将字体作为资源嵌入JAR中,并按以下方式加载:

InputStream inp = getClass().getResourceAsStream("/com/example/myfont.ttf");
Font font = Font.createFont(Font.TRUETYPE_FONT, inp).deriveFont(18f);
g2d.setFont(font);

deriveFont()调用是因为默认情况下加载的字体大小很小(1点),因此将其调整为18点。

当然,不是每次要绘制时都加载它,而是应该加载一次,比如在构造函数或静态初始化器中,然后将它存放在一个字段中供绘图例程使用。

这样,无论用户安装了什么字体,您的角色都应该在所有平台上都可见,而且在所有平台上也应该看起来相同(或非常相似)。