Java:graphics.drawString(...)未正确将Unicode转换为文本

5

我希望能够生成不同语言的文本图像。

为此,我正在使用以下代码:

    BufferedImage bufferedImage = new BufferedImage(200, 60, BufferedImage.TYPE_INT_RGB);
    Graphics graphics = bufferedImage.getGraphics();
    graphics.setColor(Color.PINK);
    graphics.setFont(new Font("Arial", Font.PLAIN, 12));
    graphics.drawString("ट्रेल्स", 20, 40);
    ImageIO.write(bufferedImage, "jpg", outputStream);

但是上述代码生成的图像是enter image description here
图像中的文本与 ट्रेल्स 略有不同。
上述不匹配的原因在于 ट्रेल्स 的unicode字符为 \u091f\u094d\u0930\u0947\u0932\u094d\u0938 ,如果我们将每个unicode数转换为其相应的字符,则得到与图像中完全相同的文本。
所以我认为 graphics.drawString(...)的工作是正确的。
但由于输出结果与预期结果不符,那么如何解决这个问题呢?
任何关于 textToImage api的指针也可以。

你在哪个平台上?Java的版本是多少? - bmargulies
我正在使用 Mac OS X。Java 1.7。 - Amit
嗯,看起来是Java中的渲染错误。让我们看看是否有其他人出现。你可以尝试Java 6。 - bmargulies
@bobince 也尝试了TextLayoutdraw,但也不起作用。输出与GraphicsdrawString相同。 - Amit
3
可能是字体问题吗?我认为普通的Arial字体没有德瓦奈加里语的字形,所以你可能会得到一个没有字形组合替代物的后备字体。如果你直接使用一个已知好的字体(例如Windows下的Mangal),会发生什么? - bobince
显示剩余2条评论
2个回答

3

我遇到了问题。

正如 @bobince 所指出的那样,问题出在我使用的字体 Arial 上。

为了正确呈现特定语言的文本,字体应该具有对应语言的字形。

例如,要呈现印地语文本,需要使用像 Mangal 这样的字体,因为它具有印地语字形,可以正确呈现文本。

同样的印地语字体也适用于马拉提语,因为两种语言的字形相同,但不适用于泰米尔语、泰卢固语等其他语言。


1
你可以尝试使用不同的字体,如MONOSPACED或SansSerif。
Font font = new Font(Font.MONOSPACED, Font.PLAIN, 11);
graphics.setFont(font);
graphics.drawString("ट्रेल्स. रीकदोसै. जोकालन्त", 1, 10);
graphics.dispose();

我使用了java.awt.Font类。这个方法行得通,字符被正确表示。


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