Java绘制字体的所有字形

3

问题:

给定一个Font对象,如何绘制该字体的所有字符/符号/字形?

我知道以下内容:

我知道如何从文件创建Font对象。

我知道使用g.setFont(...); // g是Graphics2D

我知道使用g.drawString(...); // g是Graphics2D

然而,我不想只画A-Z,a-z,0-9字符。 我想绘制该字体的所有字形。 有没有办法实现这个需求?

谢谢!


1
你的问题是:如何确定字体实现的所有代码点? - Greg Kopff
我对字体不是很了解。一个代码点等于一个单独的字形还是“字符”? - user1311390
这是一个字符。做这件事的原因是什么?你是将自己限制在英文字体中吗?还是包括亚洲字体(这就是我问码点的原因)? - Greg Kopff
1
我不仅局限于英文字体。为了好玩,我正在尝试编写一个简单的程序,只显示字体的所有字符。 - user1311390
1
请注意,一个单独的字形可以代表多个字符,甚至是多个代码点!例如,许多字体包含一个单独的字形来表示“ff”或“fi”(称为连字)。 - Joachim Sauer
1个回答

4

如何:

final Font f = new Font(...);

for (char c = 0x0000; c <= Character.MAX_VALUE; c++) {
    if (f.canDisplay(c)) {
        // draw it ...
    }
}

See Font.canDisplay()

public boolean canDisplay(int codePoint)

Checks if this Font has a glyph for the specified character.

Parameters:

codePoint - the character (Unicode code point) for which a glyph is needed.

Returns:

true if this Font has a glyph for the character; false otherwise.

Throws:

IllegalArgumentException - if the code point is not a valid Unicode code point.

Since:

   1.5

See Also:

Character.isValidCodePoint(int)


1
请注意,绘制字体可以显示的所有代码点并不一定意味着字体的所有字形都会被显示!例如,连字(例如“ff”或“fi”)可能不会通过这种单代码点方法呈现。 - Joachim Sauer
3
我的也是;另请参阅理解字符、击键、代码点和字形。根据经验,canDisplay()并不完全可靠。 - trashgod
1
你的代码是一个无限循环。当 c == 0xFFFF 时,c++ 会将其设置为 0 - Nateowami
1
@Salivan char 的使用方式与 int 类似,但它们的最大值不同Integer.MAX_VALUE != Character.MAX_VALUE0xFFFF == Character.MAX_VALUE。尝试运行代码,你会发现它是无限的:https://ideone.com/SMwSb3 - Nateowami
1
这个解决方案仅迭代Unicode BMP(基本多语言平面)中的代码点。最高有效Unicode代码点是U+10FFFF,因此您将不得不扩展循环范围(并使用int),并在必要时正确处理代码中的更高代码点(例如处理代理对)。 - amichair
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接