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

标签 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”,应显示为“➿”。

如何在代码中添加对此角色的支持?

最佳答案

寻找包含您的角色的可自由再分发(例如开源)的 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 磅。

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

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

关于java - 如何在java中添加对特殊unicode字符的支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33069306/

相关文章:

java - 如何在我的代码中放置输入流进度监视器?

java - 将数据插入数据库(mongodb)

java - 执行jar时出现异常

visual-studio - 符号问题 - 无法进入 .NET 代码

linux - 为什么 ELF 文件包含大小为 0 的符号表部分?

java - 我将如何通过 Java 访问 iPhone 文件系统?

python - 一个 unicode 字符串中有多少个可显示字符(日文/中文)

php - 使用 PHPMailer 发送 unicode 表情符号

string - 将 unicode 转换为“java”

http - 通过 http 的离线符号服务器