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

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

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

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

 new Font(null,Font.PLAIN,20); 

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

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

正确和错误地呈现相同的字符串

我已经尝试了很多东西:

  • 将字体设置为Devanagari MT并没有解决问题
  • TextAttribute LIGATURES_ON没有解决问题

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

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

这在字形渲染的质量上产生了很大的不同。 这需要首先完成,如此处所示 。

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

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

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

这里是关于Unicode文章中的 连字的部分内容:

连字

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

在AAT(Apple高级版式)文章中进一步阅读,揭示了以下信息。 我建议阅读整篇文章。

Mac OS X中的AAT和OpenType

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

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

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

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

最后:

印度语脚本的AAT

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

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

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

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

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

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

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

您可以在以下位置查看Test程序: TestRendering.java

 java org.jambula.image.TestRendering text.png 

在text.png中错误地呈现Tamil文本

然而

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

正确呈现它。

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