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

时间:2015-05-07 01:34:15

标签: java unicode fonts awt graphics2d

我尝试将文本呈现给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相同。

1 个答案:

答案 0 :(得分:4)

我是个白痴......有时候我想知道如何度过这一天并且不小心让自己被杀......

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