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

22

我正在尝试在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=OFF)。

我已经设置了字体,应该在任何系统上使用默认字体:

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

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

即使掌握了这些信息,我对如何处理这个问题还是一无所知。因此,如果有人能指点我正确的方向,我将非常感激。

同一字符串的正确和不正确呈现

我已经尝试了很多方法:

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

如果有其他开发者提供提示或代码片段(最好是来自具有印地语背景且在Mac上开发的人),我将非常感激。


3
我很不了解这个东西,但它看起来非常有趣,我想了解更多。你能发一些链接吗?谢谢! - Bhushan
1
我认为你的猜测是错误的,但我无法告诉你正确的答案。[CP1252与UTF-8一样,并不是MacRoman的子集;虽然Latin1是UTF-8的子集。这很可能与Java的臭名昭著的旧的、有缺陷的默认8位编码问题毫无关系。] 不过我真的很想学习它。 - tchrist
1
这段文本在非Java Mac程序中是否正确呈现?例如,如果您将其粘贴到TextEdit.app中,它是否正确显示?(不幸的是,我对天城文一无所知,因此无法轻松地从您的屏幕截图中找出字符。) - Ken
@Ken:我本以为这可能是OS X渲染引擎的问题,但是OS X的布局引擎肯定可以正确地呈现天城体文本,包括连字。我见过基于Cocoa API的应用程序这样做。 - s.d
@Bhushan 和 @tchrist:请参考我的更新,了解如何实现它 :)。 - s.d
显示剩余7条评论
4个回答

6
我本人不是专家,但以下是一些指针。据我从维基百科了解到,问题很可能是您的字体。提前为长引文道歉,否则我只能链接两篇维基百科文章。
以下是Unicode article中关于连字部分的一部分内容:
引用: 连字 许多书写系统(包括阿拉伯语和天城文)都有特殊的正字法规则,要求将某些字形组合成特殊的连字形式。规定连字形式的规则可以非常复杂,需要特殊的脚本整形技术,例如ACE(由DecoType在1980年代开发的阿拉伯书法引擎,并用于生成Unicode标准印刷版中的所有阿拉伯语示例),这成为OpenType(由Adobe和Microsoft)、Graphite(由SIL International)或AAT(由Apple)的概念验证。
进一步阅读AAT(Apple高级排版)文章,揭示了以下信息。我建议阅读整篇文章。
作为Mac OS X 10.5 Leopard的部分支持,目前仅支持西方脚本和阿拉伯语(截至2011年),如果字体具有AAT表,则将用于排版。如果字体没有AAT表但具有OpenType表,则它们将在系统支持的范围内使用。
这意味着许多用于西方或中东脚本的OpenType字体可以在Mac OS X 10.5上无需修改即可使用,但泰国语和天城文等南亚脚本则需要AAT表才能进行正确的布局。
由于AAT完全使用字形而不是字符,因此产生正确显示所需的所有布局信息都驻留在字体本身中。这使得可以添加新脚本的字体,而无需从操作系统中获取任何特定的支持。 Indic脚本的AAT

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

Mac OS X 10.5附带有Devanagari、Gurmukhi、Gujarati、泰语、藏语和泰米尔语字体。其他Indic脚本的字体可从第三方获取。

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


非常感谢您的研究!我原本以为我已经阅读了维基百科上的所有内容(可能是因为我只看德文页面)。一旦尝试过之后,我会在这里跟进的。不过可能需要几天时间。 - s.d
更新:我已经发现,Mac OS X 唯一带有 AAT 表并包含天城文字形的字体是令人惊讶的 Devanagari MT。我将尝试设置该字体并查看结果。等我的 MacBook 送到后再试。感谢您的所有帮助! - s.d
我刚刚用Devanagari MT(随Mac OS X 10.6一起提供的字体)进行了测试,但它不起作用。我现在要开始拔光我的头发了。看来这绝对是Java问题,而不是Mac OS X问题(或两者的组合)。尽管如此,还是非常感谢你的帮助! - s.d
很抱歉它没有起作用。那么祝你好运!看来你需要它... :-) - MicSim
非常感谢。我还有一个线索(使用Quartz渲染器而不是Java 2D渲染器),然后我就会雇用一位实际使用天城文的印度人来为我解决这个问题。 - s.d

3

使用Quartz渲染器代替Java 2D渲染器。

这将显著提高字形渲染的质量。建议首先执行此操作,如此处所示。

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

你可以考虑使用TextLayout,因为FontRenderContext可以应用RenderingHints.KEY_FRACTIONALMETRICS

尽管你的回答以我的评论引用开头(其中我主要回答了自己的问题,哈哈),但这仍然是最好的答案,因为它在我能够评论我已解决问题之前就提供了,此外,你还通过提供一个查询操作系统的代码片段以及暗示TextLayout(虽然它与我的具体问题有点脱节)增加了价值,因此我将向你授予赏金。谢谢! - s.d
很高兴能够帮到你。确实,如果没有查询,该设置会在Windows上挂起。 - trashgod

1

我在使用 Gurmukhi 字体的项目中遇到了完全相同的问题。我已经尝试了 Mac OS X 自带的带有 AAT 表格的字体(Gurmukhi MT、Gurmukhi MN)和带有 OpenType 表格的字体。但是,在 Mac OS X 上的 JAVA 中都无法正常工作,不过 OpenType 字体稍微更易读一些。唯一的问题是,“halant” 字符不能像应该的那样呈现字符的半形式。

我认为问题出在我们使用的字体上,它们与 Mac OS X 上的 JAVA 的兼容性有关。


尝试将Quartz渲染器的System属性设置为“true”,正如我、trashgod和我在我的原始问题中所建议的那样。我很想听听这对你有什么作用。 - s.d
你找到解决方法了吗? - user2889419
你尝试过使用 Font.PLAIN 吗?还是只想让它与具体字体一起工作?这个链接 https://dev59.com/q2025IYBdhLWcg3wc1tM#36069987 对你有帮助吗? - s.d

0

当我在 Mac 上尝试使用 Tamil 语言的 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引起的。


好的,看起来当你想要使用具体字体时会出现另一种复杂情况。然而,我甚至没有尝试过那样做,只是使用了 Font.PLAIN。虽然你的回答并不是对我的问题的直接回答,但我认为它对其他人也很有价值,所以谢谢! - s.d

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