无法使用 Graphics2D 渲染 unicode 字符,即使字体支持这些字符

Asy*_*syx 2 java unicode fonts awt graphics2d

我尝试将文本渲染到 BufferedImage,效果非常好,但我无法渲染任何非 ASCII 字符(至少据我所知)。我所能找到的只是因为字体的原因,所以我下载了谷歌的“Noto”字体,它似乎支持几乎所有脚本,但我仍然得到了这些框。

\n\n

我什至不想渲染一些特别异国情调的东西。仅德语变音符号和升号 s (\xc3\x84\xc3\xa4 \xc3\x96\xc3\xb6 \xc3\x9c\xc3\xbc \xc3\x9f)。

\n\n

我创建这样的字体

\n\n
Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream("NotoSans-Regular.ttf")).deriveFont(12f);\n
Run Code Online (Sandbox Code Playgroud)\n\n

并像这样渲染整个事情

\n\n
Graphics2D g2 = image.createGraphics();\ng2.setFont(font);\ng2.setColor(Color.white);\ng2.drawString(string, 0, g2.getFontMetrics().getAscent());\ng2.dispose();\n
Run Code Online (Sandbox Code Playgroud)\n\n

它适用于 ASCII。

\n\n

谷歌要么引导我找到非常简单的教程(这实际上是我目前得到的代码),要么说问题出在字体上,但事实并非如此,因为它在编辑器中运行得很好。

\n\n

谢谢

\n\n

编辑1:这是我的完整代码

\n\n
import javax.imageio.ImageIO;\nimport java.awt.*;\nimport java.awt.font.FontRenderContext;\nimport java.awt.geom.Rectangle2D;\nimport java.awt.image.BufferedImage;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\n\npublic class Test {\n    public static void main(String[] args) throws IOException, FontFormatException {\n        String string = "\xc3\x84\xc3\xa4\xc3\x96\xc3\xb6\xc3\x9c\xc3\xbc\xc3\x9f";\n        BufferedImage image;\n\n        Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream("NotoSans-Regular.ttf")).deriveFont(50f);\n        Rectangle2D rec = font.getStringBounds(string, new FontRenderContext(null, false, false));\n        image = new BufferedImage((int)rec.getWidth(), (int)rec.getHeight(), BufferedImage.TYPE_INT_RGB);\n\n        Graphics2D g2 = image.createGraphics();\n        g2.setFont(font);\n        g2.setColor(Color.white);\n        g2.drawString(string, 0, g2.getFontMetrics().getAscent());\n        g2.dispose();\n\n        File f = new File("image.png");\n        if (!f.exists()) {\n            if (!f.createNewFile()) {\n                System.err.println("Can\'t create image file.");\n            }\n        }\n        ImageIO.write(image, "png", f);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

该字体可以从谷歌下载到这里

\n\n

这是我的结果

\n\n

结果

\n\n

我想我通常得到了所有其他字体的四边形。\n它编译结果并将结果保存为 PNG 格式。

\n\n

它适用于 ASCII 字符。

\n\n

很抱歉没有使用正确的图像,但如果没有至少 10 个声誉,我就无法做到这一点。

\n\n

Edit2:它现在可以运行,但不能在我的电脑上运行。如果我重新编译它可以在 Linux 上运行,但是......

\n\n

Edit3:与最新的 JDK 相同。

\n

Asy*_*syx 5

我是个白痴...有时我想知道我如何度过这一天而不意外地杀死自己...

如果你不能正确使用unicode字符串,并且即使与Google斗争了2天也找不到答案,请检查你的源文件的编码...我的设置为Windows-1252...