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

2022-09-02 01:59:23

我正在尝试在Mac OS X 10.6上正确呈现梵文连字(Unicode字符串)。

琴弦被绘制在 上,用于抗锯齿。连字在Windows XP SP2和7以及Ubuntu中正确显示,但在Mac OS X中,连字被分解(或者更确切地说,没有正确合并),音调符号被移离其位置等(参见下面的屏幕截图,左侧Win XP SP2的正确渲染示例(使用抗锯齿键),右侧Mac OS X 10.6.7的错误渲染示例(Antialising = )。JComponentRenderingHintsRenderingHintsONDEFAULTOFF

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

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

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

即使掌握了这些信息,我对如何处理这个问题也一无所知。因此,如果有人能够为我指出正确的方向,我将不胜感激。

correct and incorrect rendering of the same string

我已经尝试了很多事情:

  • 将字体设置为梵文 MT 未解决问题
  • TextAttribute LIGATURES_ON没有解决问题

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


答案 1

我自己不是专家,但这里有一些提示。据我从维基百科中了解到的,问题很可能出在你的字体上。提前为长引号道歉,否则我本可以链接2篇维基百科文章。

以下是 Unicode 文章中有关连字的部分内容:

连字

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

进一步阅读AAT(Apple高级排版)文章,会发现以下信息。我建议阅读整篇文章。

Mac OS X 中的 AAT 和 OpenType

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

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

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

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

最后:

印度语脚本的 AAT

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

Mac OS X 10.5 附带了梵文、果鲁穆奇文、古吉拉特文、泰文、藏文和泰米尔文的字体。其他印度语脚本的字体可从第三方获得。

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


答案 2

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

这对字形渲染的质量产生了重大影响。正如这里所建议的那样,需要首先完成这项工作

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

您也可以考虑使用TextLayout,因为可以应用。FontRenderContextRenderingHints.KEY_FRACTIONALMETRICS