在Mac OS X上的Java Swing JComponent中渲染Devanagari连字(Unicode)

时间:2011-05-13 16:16:53

标签: java macos unicode rendering ligature

我试图在Mac OS X 10.6上正确渲染Devanagari连字(在Unicode字符串中)。

字符串在JComponent上绘制,并以RenderingHints为抗锯齿。连字在Windows XP SP2和7以及Ubuntu中正确显示,但在Mac OS X中,连字被分解(或者更确切地说,没有正确合并),变音符被移离其位置等等(参见下面的截图,正确的渲染示例来自左侧的Win XP SP2(使用RenderingHints抗锯齿键ON),右侧来自Mac OS X 10.6.7的错误渲染示例(Antialising DEFAULT = {{1 }})。

我已将字体设置如下,因此它应该在任何系统上使用默认字体:

OFF

我相信所有这些都可能与Mac上的默认字符编码是MacRoman(不是UTF-8子集)以及其他系统(如Windows)使用UTF-8子集(例如WinLatin-1)或cp1252等。

即使掌握了这些信息,我也不知道如何处理这个问题。因此,如果有人能指出我正确的方向,我将非常感激。

correct and incorrect rendering of the same string

我已经尝试了很多东西:

  • 将字体设置为Devanagari MT并没有解决问题
  • new Font(null,Font.PLAIN,20); TextAttribute没有解决问题

我非常感谢任何提示或其他开发人员的代码片段(最好是在Mac上开发的印地语背景)。

4 个答案:

答案 0 :(得分:6)

我自己不是专家,但这里有一些指示。据我所知,维基百科,问题很可能是你的字体。对于长引号,请提前道歉,否则我可能只是链接了2篇维基百科文章。

以下是Unicode article连字部分的一部分:

  

<强>连字

     

许多剧本,包括阿拉伯语和梵文,都有特殊的拼写规则,要求将某些字母组合组合成特殊的连字形式。 管理连字形成的规则可能非常复杂,需要特殊的脚本整形技术,例如ACE(1980年代的DecoType阿拉伯语书法引擎),用于生成Unicode的印刷版中的所有阿拉伯语示例标准),它成为OpenType(由Adobe和Microsoft),Graphite(由SIL International提供)或 AAT(由Apple)的概念证明。

AAT (Apple Advanced Typography)文章中进一步阅读,揭示了以下信息。我建议阅读整篇文章。

  

Mac OS X中的AAT和OpenType

     

从Mac OS X 10.5 Leopard开始,部分支持OpenType。该支持目前仅限于西方文字和阿拉伯文(截至2011年)。如果字体具有AAT表,则它们将用于排版。如果字体没有AAT表但具有OpenType表,则它们将在系统支持的范围内使用。

     

这意味着可以在Mac OS X 10.5上无需修改即可使用西方或中东脚本的许多OpenType字体,但泰国和梵文等南亚脚本则不能。这些需要AAT表才能正确布局。

稍后在关于字体布局的部分中:

  

由于AAT完全使用字形而不是字符,因此生成正确显示所需的所有布局信息都位于字体本身内。这允许为新脚本添加字体而无需任何特定字体来自操作系统的支持。

最后:

  

印度语脚本的AAT

     

对于印度语脚本,唯一需要的功能是字形重新排序和替换。 AAT支持这两种方式。如上所述,用于印度语脚本的OpenType字体需要在Mac OS X上正常运行之前添加AAT表。但是,请注意,这仅适用于依赖于OpenType系统支持的软件。提供自己的OpenType实现的程序将使用OpenType字体正确呈现Document。 (但是,它们可能无法正确地使用AAT表格呈现印度字体。)​​

     

Mac OS X 10.5附带了Devanagari,Gurmukhi,Gujarati,Thai,Tibetan和Tamil的字体。其他印度语脚本的字体可从第三方获得。

也许您需要选择明确支持梵文的字体。

答案 1 :(得分:3)

  

使用Quartz渲染器而不是Java 2D渲染器。

这使字形渲染的质量产生重大差异。首先需要按照建议here完成。

if (System.getProperty("os.name").startsWith("Mac OS X")) {
    System.setProperty("apple.awt.graphics.UseQuartz", "true");
}

您可能还会考虑使用TextLayout,因为FontRenderContext可以应用RenderingHints.KEY_FRACTIONALMETRICS

答案 2 :(得分:1)

我正在使用Gurmukhi脚本处理的项目遇到了同样的问题。我现在尝试使用与Mac OS X(Gurmukhi MT,Gurmukhi MN)捆绑的AAT表和带有OpenType表的字体的两种字体。在Mac OS X上的JAVA都不起作用,但OpenType字体的可读性稍差。唯一的问题是“halant”角色不会像它应该那样渲染半个形式的角色。

我认为问题在于我们使用的字体以及它们在Mac OS X上与JAVA的兼容性。

答案 3 :(得分:0)

当我在Mac上尝试http://jambula.sourceforge.net使用泰米尔语时,我遇到了同样的问题。

我提出的解决方法是使用Font.createFont加载显式字体。

您可以在TestRendering.java

看到测试计划
java org.jambula.image.TestRendering text.png

在text.png中错误地呈现泰米尔语文本

然而

java org.jambula.image.TestRendering text.png "/Library/Fonts/Arial Unicode.ttf"

正确渲染。

可能是由于https://bugs.openjdk.java.net/browse/JDK-7162125