即使字体支持,也无法使用 Graphics2D 呈现 unicode 字符

Can't render unicode characters with Graphics2D even though they are supported by the font

我尝试将文本呈现为 BufferedImage,效果非常好,但我无法呈现任何非 ASCII 字符(至少据我所知)。我所能找到的只是因为字体的缘故,所以我下载了 Google 的 "Noto" 字体,这些字体似乎几乎支持每个脚本,但我仍然得到这些框。

我什至不想渲染一些特别奇特的东西。只有德语变音符号和升号 s (Ää Öö Üü ß)。

我创建的字体是这样的

Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream("NotoSans-Regular.ttf")).deriveFont(12f);

然后像这样渲染整个东西

Graphics2D g2 = image.createGraphics();
g2.setFont(font);
g2.setColor(Color.white);
g2.drawString(string, 0, g2.getFontMetrics().getAscent());
g2.dispose();

它适用于 ASCII。

Google 要么引导我进入非常简单的教程(实际上就是我现在得到的代码),要么说问题出在字体上,但事实并非如此,因为它在编辑.

谢谢

Edit1:这是我的完整代码

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException, FontFormatException {
        String string = "ÄäÖöÜüß";
        BufferedImage image;

        Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream("NotoSans-Regular.ttf")).deriveFont(50f);
        Rectangle2D rec = font.getStringBounds(string, new FontRenderContext(null, false, false));
        image = new BufferedImage((int)rec.getWidth(), (int)rec.getHeight(), BufferedImage.TYPE_INT_RGB);

        Graphics2D g2 = image.createGraphics();
        g2.setFont(font);
        g2.setColor(Color.white);
        g2.drawString(string, 0, g2.getFontMetrics().getAscent());
        g2.dispose();

        File f = new File("image.png");
        if (!f.exists()) {
            if (!f.createNewFile()) {
                System.err.println("Can't create image file.");
            }
        }
        ImageIO.write(image, "png", f);
    }
}

字体可以下载here from google

这是我的结果

Result

我想我得到了所有其他字体的四边形。 它编译并将结果保存在 PNG 中。

并且它适用于 ASCII 字符。

很抱歉没有使用正确的图像,但没有至少 10 个声誉我不能这样做。

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

Edit3: 同最新的JDK.

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

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